NASM idiv 无法正确划分



我绞尽脑汁,想在网上找到答案,但我仍然不明白为什么我不能正确地划分数字。我在网上读到,如果你需要除以一个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指令来计算非整数值。

相关内容

  • 没有找到相关文章

最新更新