寄存器 AL 和 AX 溢出到哪里?
Where do registers AL and AX overflow to?
请告诉我以下汇编(伪)代码的结果是什么?
我们已经将寄存器 EAX
的所有位都设置为 0,所以反过来我们也将 AH
、AL
和 AX
设置为 0。但是当我减去最低位时AL
,我们将取补码并相加,得到一串 1 后跟一个 0。
XOR eax, eax
SUB al 0x01
所以总而言之,我的问题是,在执行上面的代码时,只是 AL
会全是 1,还是也会 结转到 AX
和 EAX
.
add/sub 的进位输出进入 CF,EFLAGS 中的进位标志。
sub al, 1
的操作数是AL,不是EAX。 EAX 的高 24 位不受 8 位操作数大小的指令影响。
如果你想将整个 EAX 翻转为全 1,你需要使用 sub eax, 1
。 (或 not eax
,或 dec eax
)。 sub al, 1
是一条不同的指令,区别在于它只影响 AL(和 EFLAGS),不影响 AL 之外的任何位。
giving us a bunch of 1s followed by a 0.
没有。在 2 的补码中,-1
由一个设置了所有位的数字表示。例如,在 8 位中它是 0xFF
,在 32 位中它是 0xFFFFFFFF
。底部有一个 0
位,表示 -2
.
will just AL be full of 1s, or will it also carry over to AX and EAX.
只是艾尔。您可以自己尝试一下(如果您仍然感到困惑,然后要求解释结果)。
请告诉我以下汇编(伪)代码的结果是什么?
我们已经将寄存器 EAX
的所有位都设置为 0,所以反过来我们也将 AH
、AL
和 AX
设置为 0。但是当我减去最低位时AL
,我们将取补码并相加,得到一串 1 后跟一个 0。
XOR eax, eax
SUB al 0x01
所以总而言之,我的问题是,在执行上面的代码时,只是 AL
会全是 1,还是也会 结转到 AX
和 EAX
.
add/sub 的进位输出进入 CF,EFLAGS 中的进位标志。
sub al, 1
的操作数是AL,不是EAX。 EAX 的高 24 位不受 8 位操作数大小的指令影响。
如果你想将整个 EAX 翻转为全 1,你需要使用 sub eax, 1
。 (或 not eax
,或 dec eax
)。 sub al, 1
是一条不同的指令,区别在于它只影响 AL(和 EFLAGS),不影响 AL 之外的任何位。
giving us a bunch of 1s followed by a 0.
没有。在 2 的补码中,-1
由一个设置了所有位的数字表示。例如,在 8 位中它是 0xFF
,在 32 位中它是 0xFFFFFFFF
。底部有一个 0
位,表示 -2
.
will just AL be full of 1s, or will it also carry over to AX and EAX.
只是艾尔。您可以自己尝试一下(如果您仍然感到困惑,然后要求解释结果)。