assembly - 为什么我必须检查有符号操作的溢出标志而不是 8086 中的进位标志?

标签 assembly x86 x86-16 cpu-registers integer-overflow

我正在尝试了解 FLAGS 状态寄存器。

我知道如果算术运算在结果的最高有效位中生成进位或借位,则进位标志会设置,但我也知道它仅在相加的两个数字为正数时才有效。

为什么它不适用于签名操作?我的意思是为什么我们必须检查溢出标志?

最佳答案

进位标志是加法的“无符号”溢出。如果您想做有符号数学并且担心溢出,您需要使用“有符号溢出”,这不是相同的结果。二进制加法对于无符号和二进制补码是相同的,加法器中不存在有符号数学之类的东西(也不存在减法之类的东西),但是标志以不同的方式从溢出中去除。无符号溢出只是 msbit 的进位,有符号溢出是 msbit 的进位和进位的比较,如果它们匹配,则没有有符号溢出,如果它们不匹配,则有符号溢出。

并非所有硬件都实现有符号溢出标志,您更有可能找到进位标志(无符号溢出)。减法仅仅意味着反转第二个操作数并反转 lsbit 的进位(反转并加 1),这就是为什么我们拥有并关心二进制补码,它使硬件变得更加容易。不同的处理器系列使用不同的减法实践。有时,如果操作是减法,则进位会反转,有时不会,因此带进位的加法与带借位的减法(如果您的指令集有)的 ls 位上的进位是否反转直接受此影响。弄清楚你的处理器做了什么并不难,有些处理器并没有完全记录进位集或进位清除是否表明先前的减法有借位(无符号溢出)

并非所有硬件都有溢出位(或进位),因此有时您必须通过检查操作数的 msbit 和结果来综合这些位。或者使用其他方法。但这一切都归结为二进制补码与无符号,并且对于加法(和减法),它们的计算方式不同。

对于乘法和除法,情况并非如此,有符号乘数和无符号乘数是不同的,使用错误的乘数可能会得到错误的答案,同样,如果它们有溢出标志,那么您需要将它们与运算进行比较。处理器数据手册应该告诉您这一点,否则您必须做一些简单的实验才能弄清楚。

关于assembly - 为什么我必须检查有符号操作的溢出标志而不是 8086 中的进位标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21271905/

相关文章:

visual-studio - Visual Studio 中的外部程序集文件

c++ - 对 GCC 使用 AT&T 内联汇编器

debugging - 如何检查我的汇编 8086 程序是否运行良好

assembly - 为什么我的汇编输出位于字母位置? (1+1=b)

c++ - Arm GNU 编译器 : Assembly generated from ternary optimized by superfluous cast

linux - 为什么是段错误而不是特权指令错误?

assembly - EDI 和 ESI 寄存器的角色切换

assembly - 在屏幕上移动对象的最佳方式是什么?

assembly - 如何在 68k 汇编或一般情况下实现浮点 IEEE754 除法?

assembly - 手动计算物理地址(IDTR 寄存器)