请告诉我以下汇编(伪)代码的结果是什么?
我们已将寄存器的所有位设置EAX
为 0,因此我们也有AH
,AL
和AX
0。但是当我减去 的最低位时AL
,我们将取二进制补码并相加,给我们一堆 1,后跟一个0。
XOR eax, eax
SUB al 0x01
所以总而言之,我的问题是,在执行上面的代码时,只会满AL
是 1,还是会延续到AX
andEAX
。
请告诉我以下汇编(伪)代码的结果是什么?
我们已将寄存器的所有位设置EAX
为 0,因此我们也有AH
,AL
和AX
0。但是当我减去 的最低位时AL
,我们将取二进制补码并相加,给我们一堆 1,后跟一个0。
XOR eax, eax
SUB al 0x01
所以总而言之,我的问题是,在执行上面的代码时,只会满AL
是 1,还是会延续到AX
andEAX
。
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 位中是0xFFFFFFFF
。0
底部有一点,它代表-2
.
将只是 AL 充满 1,或者它也会结转到 AX 和 EAX。
只是艾尔。您可以自己尝试一下(如果您仍然感到困惑,请询问结果的解释)。