程序集8086携带标志 - 签名数字如何减去等于加号

时间:2017-08-04 14:00:00

标签: assembly carryflag

我不明白。这个问题:

mov  al,-128d
mov  ah,40d
add  al,ah ;result is out of 8 bit unsigned range?

为什么携带旗帜不开启? 它需要88,88不要在0-255范围内!

为什么这个数字到底有多少而不是很少?十进制数?

为什么-128 + 40等于168

怎么可能?

1 个答案:

答案 0 :(得分:5)

是的,数字后面的小“d”表示“十进制”,因此mov al,-128dmov al,-128mov al,-80h相同。

我不明白这部分问题是88。

关于add al,ah

它会al = al + ah。两个寄存器都是8位“宽”,其内容是(二进制)AL = 10000000, AH = 00101000。当被解释为8位无符号值时,这种加法的结果是十进制的二进制10101000 = 168。

但是当您尝试将相同的值解释为8位有符号值时,它等于-88

ADD本身或寄存器AL / AH无法理解您的解释,他们不在乎,ADD会做简单的位添加,以及当最后一位顶部位加溢时,CF被置位,在这种情况下它没有(如果AL被解释为无符号8位值,则它等于+128,并且128 + 40 = 168 =>不超过255 =>进位标志= 0)。

实际上结果既不是8位无符号或有符号范围,结果是正确的值168或-88,这取决于你解释它的方式(无符号或有符号),它是{{1中的相同值}}。您如何阅读/解释它取决于以下代码。

要使一些无符号8b算法超出范围,你需要结果超过255,即

AL