整数溢出问题

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

【讨论】:

以上是关于整数溢出问题的主要内容,如果未能解决你的问题,请参考以下文章

具有整数溢出条件的整数的反转

VBA 中涉及两个整数和一个长整数的溢出错误

整数溢出问题

整数算术溢出问题的分析

如何在 Rust 中将有符号整数添加到无符号整数,检查无符号溢出?

查找没有溢出的整数数组的总和