Assembly 整数溢出问题

Assembly 整数溢出问题,assembly,x86,Assembly,X86,我一直遇到一个整数溢出问题,我不知道如何解决它,有人能帮忙吗? edx conatins 181和eax包含174 xor eax,edx mov edx,2 div edx 使用32位寄存器进行除法时,被除数为edx:eax。由于eax最初为174,edx最初为181,因此情况如下: eax和edx是xor ed,结果存储在eax中。eax现在27岁了 2存储在edx中 edx:eax除以edx。这意味着0x200001b除以0x

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

       xor eax,edx       
       mov edx,2
       div edx   

使用32位寄存器进行除法时,被除数为
edx:eax
。由于eax最初为174,edx最初为181,因此情况如下:

  • eax和edx是xor ed,结果存储在eax中。eax现在27岁了
  • 2存储在edx中
  • edx:eax
    除以edx。这意味着0x200001b除以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
    

    假设您谈论的是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
    

    需要更多信息:例如,目标体系结构,汇编程序版本。@suddnely\u me目标体系结构?意味着汇编程序版本OFC>\uu@suddnely\u me o right没有看到汇编程序版本位x86汇编问题必须与体系结构标记一起出现。没有人能确保您使用的是x86、ARM、MIPS或其他体系结构