Неправильное вычисление в ассемблере
В приведеном ниже коде после вычисления получается 1. а должно 0,16 но так как у мне нужно целочисленное то 0.Почему в ответе 1 а не ноль.Програма работает корректно. Алгоритм
1.5*2-7*3+9/3=-8
2.(7+3)*5=50
А на последнем шаге ошибка деление 8/50 не дает 0,16 а 1. Код:
bits 64 //res = (a*e-b*c+d/b)/((b+c)*a)
section .data
a dd 5
b dw 3
c dd 7
d dw 9
e dd 2
error_code dd 0
section .bss
result resd 1
section .text
global _start
_start:
mov eax, [a]
imul eax, [e]
jo overflow
mov ecx, eax
movsx ebx, word [b]
imul ebx, [c]
jo overflow
sub ecx, ebx
jo overflow
movsx eax, word [d]
movsx ebx, word [b]
test ebx, ebx
jz divide_by_zero
cdq
idiv ebx
add ecx, eax
jo overflow
movsx eax, word [b]
add eax, [c]
jo overflow
imul eax, [a]
jo overflow
test eax, eax
jz divide_by_zero
mov edx, ecx
cdq
idiv eax
mov [result], eax
mov dword [error_code], 0
jmp done
overflow:
mov dword [error_code], 1
jmp done
divide_by_zero:
mov dword [error_code], 2
done:
mov eax, 60
xor ebx, ebx
syscall
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
idiv
делит пару регистров EDX:EAX на другой регистр (или переменную в памяти)
Чего вы хотите добиться, выполняя второе деление по сути eax на eax? Cоответственно и получаете 1.
Делимое в EAX положите, старшее слово - EDX в вашем случае обнулить, делитель - например, в ECX, тогда idiv ecx