我想知道为什么我编译这个
mov ax , 0x00FF
push ax
popf
rcr ax , 1
我得到807F
作为答案。我知道popf
将堆栈的顶部移动到标志寄存器中,但它如何影响CF
?它只插入移动字的第一个或最后一个位吗?
答案 0 :(得分:1)
在使用popf
之前,您已经推送了一个设置了8位的值。这些 set-bits 中只有5个会有效地改变某些处理器标志。
在popf
EFLAGS寄存器的最低字之后直接看起来像这样:
-- NT IO/PL OF DF IF TF SF ZF -- AF -- PF -- CF
0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1
^ ^ ^
These bits you are not allowed to change
从图中可以看出,现在设置了进位标志。由于rcr ax, 1
指令将CF移位到仍然保持0000000011111111(00FFh)的AX
寄存器的第15位,因此结果变为1000000001111111(807Fh)。 CF仍然/再次设置,因为来自AX
寄存器的旧位0被放在那里。