Erro no loop

Erro no loop

por Renato Massao -
Número de respostas: 3

estou tentando fazer um loop em que dado um numero, eu tento dividi-lo por 10 sucessivamente até que o quociente seja 0, ou seja,  eax seja 0, mas isso não está acontecendo. No código abaixo, a função supostamente deveria retornar 0, pois vou dividindo o numero por 10 até que o quosciente seja 0, mas a função acaba retornando -1158352680

.intel_syntax noprefix
.global verificaNumero

soma = -4

verificaNumero:
    push ebp
    mov ebp,esp
    add esp,4 #reserva espaço para soma
    mov ebx,10                    # ebx <- 10 (divisor)
    mov eax,[ebp+8]        # eax <- numero
  mov edx,0
loop:
  div ebx
  cmp eax,0
  jg loop
  sub esp,4  #libera o espaço reservado para soma
  pop ebp
   ret
alguém sabe o motivo disso estar acontecendo?

Em resposta à Renato Massao

Re: Erro no loop

por Ricardo Oliveira Teles -

Renato, eu tive o mesmo problema que você e a professora me respondeu o seguinte:

- em loop_1, você tem o seguinte comando:

div ebx  
Como ebx tem 32 bits, o processador considera que o dividendo é um número de 64 bits e que está armazenado em EDX:EAX.
Eu sei que, na verdade, você só precisa dividir o valor que está em EAX por EBX. Entretanto, o valor de EDX influencia o resultado. 
Por exemplo,  vamos considerar os valores dos registradores nas iterações de loop_1:
1ª iteração ---> antes do div, EDX= 0H(0D) e EAX = 99H (153D); depois do div, EDX=3H(3D) e EAX = FH(15D)
lembrando que, depois da divisão, EDX armazena o resto da divisão e EAX armazena o quociente  
 
2ª iteração ---> antes do div, EDX= 3H(3D) e EAX = FH (15D); depois do div, EDX=3H(3D) e EAX = 4cccccceH(1288490190)
porque EDX:EAX = (3 0000000F)H = (12884901903)D, que, quando dividido por 10, dá mesmo quociente = 1288490190 e resto = 3.
 
Por isso, para evitar esse erro, antes de fazer o div, você tem que zerar o registrador EDX, para impedir que ele afete o resultado da divisão de EAX por EBX. Você pode fazer isso assim:
 
            loop_1:    mov edx,0                                               # zera edx para que ele nao influencia na divisao
                           div ebx                                                    # divide o valor de eax por 10
                           inc DWORD PTR[ebp+ndig]                   # incrementa o ndig
                           cmp eax, 0                                              
                           jnz loop_1                                               

Espero ter ajudado.
Em resposta à Ricardo Oliveira Teles

Re: Erro no loop

por Renato Massao -

Ah, entendi. Muito obrigado! Ajudou sim

Em resposta à Renato Massao

Re: Erro no loop

por Kelly Rosa Braghetto -

- Ricardo, obrigada por compartilhar a resposta que lhe enviei com os demais colegas.

- Renato, você conseguiu solucionar o seu problema com as instruções repassadas pelo Ricardo?

 

Kelly