问题描述
mov al,-1
add al,130
我正在尝试从教科书中为我的x86-assembly类回答一个问题。其中一个示例要求解释为什么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的补码算法,有符号和无符号加法的答案的位模式相同,因此指令集通常仅具有一个加法运算-但是有符号算术与无符号加法器的越界检查是不同的。无符号算术。
在相同位数中混合使用无符号和有符号算术没有很好的标准,因此我们通常要做的是将两个操作数都扩展为更大的位数,对它们进行有符号运算以准确地容纳两个操作数,并将该形式用于算术。