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