Jump to content
Sign in to follow this  
Maradona101

Dúvida Assembly

Recommended Posts

Maradona101

Boas.

Tenho que fazer um programa em assembly que some todos os nºs impares inferiores a um determinado nº.

Aqui fica o código.

O problema e+q eu me aparece sempre o erro "excesso de divisão". Já experimentei fazer so a instrução da divisão e mesmo assim dá erro.

%include "arq2010.asm"


start:
        lea     dx, [mesg1]
        call    WriteString
        call    ReadInt         ;ler o n?
        call    NewLine
        mov     cx,ax           ;inicializar o contador do ciclo
        mov     DI,2


        

ciclo:
        DIV DI
        CMP DX, 0
        JNE FIMSE
ADD BX, AX
        FIMSE: MOV AX,BX
        call    WriteDec
        call    NewLine
        dec     CX
        loop    ciclo

        MOV     AH, 4CH
        INT     21H

section .data

        mesg1   db "N? ",0
        mesg2   db "Introduza o valor de X: ",0
        mesg3   db "Numero de elementos lidos: ",0
        mesg4   db "Elementos do array: ",0
        array:  times 1000 db 0 ; reserva 1000 bytes para o array
        n_elem  dw 0 ; numero de elementos no array

Share this post


Link to post
Share on other sites
KTachyon

Se ajudar, quando estás a verificar se um número é par ou ímpar, basta olhar para o bit menos significativo, não precisas de divisões ou restos de divisões. Tal como em qualquer linguagem de programação, podes utilizar operadores bitwise.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Maradona101

Desculpa mas não sei o que queres dizer com "bit menos significativo" e não sei o que são operadores bitwise.

Share this post


Link to post
Share on other sites
KTachyon

1234 <- 4 é o dígito menos significativo, 1 é o dígito mais significativo

Em relação às operações bitwise, é fazer um AND do teu número com 1:

AND 1001
    0001
== 0001
(ímpar)

AND 1010
    0001
== 0000
(par)

Agora, dependendo da linguagem assembly, podes fazê-lo da seguinte forma:

input:
(...)
ANDI	r1, r2, 1		; r1 = r2 & 1
BEQZ	r1, impar		; if (r1 == 0) goto input;
(...)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.