我绞尽脑汁,想在网上找到答案,但我仍然不明白为什么我不能正确地划分数字。我在网上读到,如果你需要除以一个16位的数字,那么被除数应该分为两个寄存器:高位写在DX寄存器中,低位写在AX寄存器中。在这种情况下,商将在AX寄存器中,余数在DX寄存器中。这是我代码的一部分:
A EQU -59 ;in data section
B EQU 219
xor eax, eax
xor edx, edx
xor ebx, ebx
xor ecx, ecx
mov ax, A
cwd ;dx = -1, ax = -59
mov bx, B
idiv bx
PRINT_STRING 'idiv -59/219 = '
PRINT_DEC 2, ax
PRINT_STRING '.'
PRINT_DEC 2, dx
答案应该是0.27(输出:0.27或类似的东西,我不在乎负数,问题不在于此(
在AX中,我得到了0,这是应该的,但在DX中=-59,这是A…为什么?当abs(A(>abs(B(,我得到了正确的答案,但不是当被除数的绝对值小于除法器时。在这种情况下,DX=AX的前一个值=A…
如何使用idiv获得正确答案?
如何使用
idiv
获得正确答案?
你不能。idiv
指令执行有符号的整数除法。你不会收到一个分数为0.27的结果。
-59不能包含219,所以商是0,余数是剩下的一切,即-59。
您可以使用FPU或SSE指令来计算非整数值。