3

请告诉我以下汇编(伪)代码的结果是什么?
我们已将寄存器的所有位设置EAX为 0,因此我们也有AH,ALAX0。但是当我减去 的最低位时AL,我们将取二进制补码并相加,给我们一堆 1,后跟一个0。

XOR eax, eax
SUB al 0x01

所以总而言之,我的问题是,在执行上面的代码时,只会AL是 1,还是会延续到AXandEAX

4

1 回答 1

5

add/sub 的进位进入 CF,EFLAGS 中的进位标志。

的操作数sub al, 1是 AL,而不是 EAX。 EAX 的高 24 位不受 8 位操作数大小的指令的影响。

如果您想将整个 EAX 翻转为全一,则需要使用sub eax, 1. (或not eax,或dec eax)。 sub al, 1是一条不同的指令,不同之处在于它只影响 AL(和 EFLAGS),而不影响 AL 之外的任何位。


给我们一堆 1,然后是 0。

否。在 2 的补码中,-1由一个所有位都设置的数字表示。例如,在 8 位中是0xFF,在 32 位中是0xFFFFFFFF0底部有一点,它代表-2.

将只是 AL 充满 1,或者它也会结转到 AX 和 EAX。

只是艾尔。您可以自己尝试一下(如果您仍然感到困惑,请询问结果的解释)。

于 2019-10-03T08:00:05.710 回答