整数溢出问题

use*_*176 7 x86 assembly

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

       xor eax,edx       
       mov edx,2
       div edx   
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 6

假设你在谈论x86,那div edx真的没有意义 - 一个32位的div将edx:eax除以指定的目标寄存器.幸运的是,要除以2,你根本不需要使用它div.

mov eax, 174
mov edx, 181

xor eax, edx
shr eax, 1
Run Code Online (Sandbox Code Playgroud)

如果div由于某种原因坚持使用a ,则需要使用其他寄存器.请注意,x86希望除法的结果适合一个寄存器,因此在除法之前需要将edx置零:

mov eax, 174
mov edx, 181

xor eax, edx
xor edx, edx
mov ebx, 2
div ebx
Run Code Online (Sandbox Code Playgroud)


ugh*_*fhw 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位.因此,你会溢出.

您可以通过使用与edx不同的寄存器来解决此问题,以确保零edx:

xor eax,edx
mov ecx,2
xor edx,edx ; Zero edx
div ecx
; eax contains 0xD, edx contains 1
Run Code Online (Sandbox Code Playgroud)