汇编语言 - 进位标志 VS 溢出标志

22

我有下面的代码:

mov al, -5
add al, 132
add al, 1

根据我的检查,溢出标志和进位标志将在第一次操作中设置,在第二次操作中仅会设置溢出标志。

但我不明白为什么:

  1. 在无符号数中,结果为143(8FH),适合8位无符号数(小于255)=> 进位标志不应该被设置。在有符号数中,结果为127,适合8位有符号数,溢出不应该被设置。

这是怎么回事?谢谢。


请参阅了解进位 vs 溢出条件/标志,http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt。 - Peter Cordes
2个回答

32

当两个正数相加的结果为负数,或者两个负数相加的结果为正数时,就会发生溢出(Overflow)。

例如:+127+1=

+127=0111 1111
  +1=0000 0001
     ---------
     1000 0000 

当我们查看两个操作数的符号位以及结果的符号位时,发现溢出已经发生,因此答案是不正确的。


当我们将两个负数相加并且结果为0时,V标志位也会变为1。如果我们执行adds r0, r1, r0,其中r0 = 0x80000000r1 = 0x80000000,执行后,Z = 1C = 1V = 1 - Simon Z.

20
在无符号算术中,您将0xFB加到0x84上,即251+132,确实大于8位,因此设置了进位标志。
在第二种情况下,您正在将+127添加到1,这确实超出了有符号8位的范围,因此设置了溢出标志。

那么当我执行 'add al, 1' 时才会设置溢出标志吗?如果我删除这行,溢出标志就不会被设置了吗? - Tom O
1
@Tom:两个“add”指令都会设置溢出。 - Oliver Charlesworth
那么你能不能跟我解释一下溢出是怎么设置的呢?因为据我所知,在范围-128到127内不会影响溢出。 - Tom O
3
将所有值转换为有符号的8位数。在第一个“add”中,您正在执行-5+-124,这超过了-128。在第二个“add”中,您正在执行+127+1,这超过了+127。 - Oliver Charlesworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接