我不明白什么。这是个问题:
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,-128d
与mov al,-128
或mov 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)