我不明白什么。这个问题:
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”表示“十进制”,因此与ormov al,-128d
相同。mov al,-128
mov al,-80h
我不明白 88 的那部分问题。
关于add al,ah
:
会的al = al + ah
。两个寄存器都是 8 位“宽”,它们的内容是 (binary) 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)