整数溢出问题

时间:2011-04-09 18:14:01

标签: assembly x86

我一直遇到整数溢出问题,我不知道如何解决它可以帮助人吗? edx conatins 181和eax包含174

       xor eax,edx       
       mov edx,2
       div edx   

2 个答案:

答案 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,所以会发生这种情况:

  1. eax和edx是xor-ed,结果存储在eax中。 eax现在是27
  2. 2存储在edx
  3. edx:eax除以edx。这意味着0x20000001B除以0x2。此操作的结果是0x10000000D。 CPU尝试将此值存储在eax中,余数为1,在edx中,但它不适合,因为1位于第33位。因此,你会溢出。
  4. 您可以使用与edx不同的寄存器来进行分割,确保零edx:

    xor eax,edx
    mov ecx,2
    xor edx,edx ; Zero edx
    div ecx
    ; eax contains 0xD, edx contains 1