1
mov     al, -1
add     al, 130

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

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

4

1 回答 1

5

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

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

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

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


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


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

于 2020-10-08T23:54:30.900 回答