我正在大学课程(80386编程)学习汇编语言编程。目前,我正在学习使用EDX和EAX寄存器分别存储余数和商的32位除法的来龙去脉。我想知道,当我不包括
时,为什么我没有得到正确的输出mov edx, 00000000h
在我的程序中。该程序要么不运行,要么输出错误。
相关源代码:
mov edx, 00000000h
mov eax, 1234567Ah
div 11111111h ; now EDX=remainder, EAX=quotient
如果需要,我会发布完整的代码。
答案 0 :(得分:4)
将DIV
与32位操作数一起使用时,它将除以EDX:EAX
中的64位值(EDX
中的高位DWORD,EAX
中的低位DWORD)通过操作数将商数放在EAX
中,将余数放在EDX
中。
因此,如果要分割的值为32位(仅适用于EDX
),则应在分割前清除EAX
。如果商不符合EAX
,则不这样做会导致错误的结果,或者除法溢出。
答案 1 :(得分:1)
32位div实际上将edx:eax除以指定值。如果edx中有随机垃圾,你会得到垃圾结果。没有选择将JUST与eax分开......