整数溢出问题
Posted
技术标签:
【中文标题】整数溢出问题【英文标题】:Integer Overflow problem 【发布时间】:2011-04-09 18:14:01 【问题描述】:我一直遇到,我不知道如何解决它,谁能帮忙? edx conatins 181 和 eax 包含 174
xor eax,edx
mov edx,2
div edx
【问题讨论】:
需要更多信息:例如,目标架构、汇编器版本。 @suddnely_me 目标架构? 意思是汇编版本的OFC >_ @suddnely_me o 对没有看到 x86 的汇编器版本位 装配问题必须带有架构标签。没有人可以确保您使用的是 x86、ARM、MIPS 或其他一些架构 【参考方案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
【讨论】:
【参考方案2】:使用 32 位寄存器除法时,除数为edx:eax
。由于 eax 最初是 174,而 edx 最初是 181,所以会发生这种情况:
-
eax 和 edx 进行异或运算,结果存储在 eax 中。 eax 现在是 27 岁
2 存储在 edx 中
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
【讨论】:
以上是关于整数溢出问题的主要内容,如果未能解决你的问题,请参考以下文章