0

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

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

这怎么可能?

4

1 回答 1

5

是的,数字后面的小“d”表示“十进制”,因此与ormov al,-128d相同。mov al,-128mov 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)
于 2017-08-04T14:32:34.473 回答