为什么在这个例子中没有设置溢出标志?

use*_*166 1 x86 assembly cpu-registers eflags signed-overflow

mov     al, -1
add     al, 130
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*idt 5

130不能用 8 位有符号表示,127最大有符号 8 位数字也是如此。  130在十六进制字节中82h被视为有符号字节,也就是-126.

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

溢出标志告诉我们有关有符号算术超出范围的情况,并且您正在添加-1-126,它不会溢出。

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


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


在相同的位数中混合无符号和有符号算术没有很好的标准,因此我们通常做的是将两个操作数扩展为更大的位数,有符号以准确容纳两个操作数,并使用该形式进行算术。