2011-04-09 92 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