我一直遇到整数溢出问题,我不知道如何解决它可以帮助人吗? edx conatins 181和eax包含174
xor eax,edx
mov edx,2
div edx
答案 0 :(得分:6)
假设你在讨论x86,div edx
没有意义 - 32位div通过指定的目标寄存器划分edx:eax。幸运的是,要除以2,您根本不需要使用div
。
mov eax, 174
mov edx, 181
xor eax, edx
shr eax, 1
如果由于某种原因坚持使用div
,则需要使用其他寄存器。请注意,x86希望除法的结果适合一个寄存器,因此在除法之前你需要将edx归零:
mov eax, 174
mov edx, 181
xor eax, edx
xor edx, edx
mov ebx, 2
div ebx
答案 1 :(得分:5)
使用32位寄存器进行分频时,被除数为edx:eax
。因为eax最初是174,而edx最初是181,所以会发生这种情况:
edx:eax
除以edx。这意味着0x20000001B除以0x2。此操作的结果是0x10000000D。 CPU尝试将此值存储在eax中,余数为1,在edx中,但它不适合,因为1位于第33位。因此,你会溢出。您可以使用与edx不同的寄存器来进行分割,确保零edx:
xor eax,edx
mov ecx,2
xor edx,edx ; Zero edx
div ecx
; eax contains 0xD, edx contains 1