2011-04-09 88 views
7

我不断收到一个整数溢出问题,我不知道如何解决这个问题谁能帮助? EDX conatins 181和EAX包含174整数溢出问题

 xor eax,edx  
     mov edx,2 
     div edx 
+0

需要更多信息:例如,目标体系结构,汇编程序版本。 – iehrlich 2011-04-09 18:18:41

+0

@suddnely_me目标架构? – user700176 2011-04-09 18:21:15

+0

意味着汇编版本OFC> _ < – iehrlich 2011-04-09 18:22:43

回答

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 
+0

另一个伟大的:) – Spyros 2011-04-09 18:32:19

+0

感谢,工程样的现在:) – user700176 2011-04-09 18:46:40

4

当使用一个32位的寄存器分割,被除数是edx:eax。由于eax最初为174,edx最初为181,所以会发生以下情况:

  1. eax和edx是异或,结果存储在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 
+0

+1很好的解释 – Spyros 2011-04-09 18:31:59