mov al, -1
add al, 130
我正在尝试为我的 x86 汇编课程回答教科书中的一个问题。其中一个示例要求解释为什么 over 标志会帮助您确定在这种情况下 al 的最终值是否在有效的有符号范围内。
我最初的想法是应该调用溢出标志,因为 -1 + 130 = 129,它超出了有符号 8 位整数的范围,而 al 是 EAX 寄存器的最低 8 位。但是当我在 Visual Studio 中运行此代码时,我没有看到设置了溢出标志。
mov al, -1
add al, 130
我正在尝试为我的 x86 汇编课程回答教科书中的一个问题。其中一个示例要求解释为什么 over 标志会帮助您确定在这种情况下 al 的最终值是否在有效的有符号范围内。
我最初的想法是应该调用溢出标志,因为 -1 + 130 = 129,它超出了有符号 8 位整数的范围,而 al 是 EAX 寄存器的最低 8 位。但是当我在 Visual Studio 中运行此代码时,我没有看到设置了溢出标志。
130
不能用 8 位有符号表示,127
最大有符号 8 位数也是如此。 130
在一个十六进制字节中是82h
并作为一个有符号字节,也就是-126
.
汇编器没有抱怨,所以我认为它假设你的意图是无符号的,它可以130
用 8 位表示。
溢出标志告诉我们有符号算术超出范围,并且您正在添加-1
到-126
,它不会溢出。
进位标志是无符号算术的越界指示器(我希望将其设置为 130+255 越界)。
由于使用 2 的补码运算,有符号和无符号加法的答案的位模式是相同的,因此指令集通常只有一个加法操作 - 但有符号算术和无符号算术的越界检查是不同的。
在相同的位数中混合无符号和有符号算术没有好的标准,所以我们通常做的是将两个操作数扩展为更大的位数,有符号以准确地容纳两个操作数,并使用该形式进行算术。