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

问题描述

mov     al,-1
add     al,130

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

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

解决方法

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

汇编程序没有抱怨,因此我认为它假设您的意图是未签名的,可以用8位表示130

溢出标志告诉我们有关有符号算术超出范围的问题,并且您将-1添加到-126,不会溢出。

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


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


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