组件 8086 携带标志 - 带符号的数字如何减去等于加号



我不明白什么。这是个问题:

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

为什么携带旗帜不打开? 它必须是88,88不在0-255的范围内!

为什么最后的数字是小D而不是小H?它的十进制数?

为什么-128 + 40等于168

怎么可能?

是的,数字后面的小"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,具体取决于您解释它的方式(无符号或有符号(,它在AL中的值相同。如何阅读/解释它取决于以下代码。

要让一些无符号的 8b 算术超出范围,您需要结果超过 255,即

mov  al,150  ; binary 1001 0110
mov  ah,150
add  al,ah   ; al = 44 (low 8 bits of value 300), CF=1 (like 9th bit for ADD)
; 300 is in binary 0000 0001 0010 1100 (needs at least 9 bits)

最新更新