为什么在此示例中未设置溢出标志?

Why is the overflow flag not being set in this example?

mov     al, -1
add     al, 130

我正在尝试回答我的 x86 程序集 class 教科书中的一个问题。其中一个示例要求解释为什么 over 标志会帮助您确定在这种情况下 al 的最终值是否落在有效的有符号范围内。

我最初的想法是应该调用溢出标志,因为 -1 + 130 = 129 超出了有符号 8 位整数的范围,其中 al 是 EAX 寄存器的最低 8 位。但是当我在 Visual Studio 中 运行 这段代码时,我没有看到溢出标志被设置。

130 不能用带符号的 8 位表示,因为 127 是最大带符号的 8 位数字。十六进制字节中的 13082h 并作为有符号字节,也就是 -126.

汇编程序没有抱怨,所以我认为它假定您的意图是无符号的,它可以用 8 位表示 130

溢出标志告诉我们有符号算术越界,并且您将 -1 添加到 -126,它不会溢出。

进位标志是无符号算术的越界指示符(我希望将其设置为 130+255 越界)。


由于使用 2 的补码运算,有符号加法和无符号加法的答案位模式相同,因此指令集通常只有一个加法运算——但有符号运算的越界检查不同与无符号算术。


在相同的位数中混合无符号和有符号算术没有好的标准,所以我们通常做的是将两个操作数扩展到更大的位数,签名以准确容纳两个操作数,并使用该形式对于算术。