汇编popf和rcl / rcr指令

时间:2017-01-20 17:03:36

标签: assembly x86

我想知道为什么我编译这个

mov ax , 0x00FF 
push ax 
popf 
rcr ax , 1

我得到807F作为答案。我知道popf将堆栈的顶部移动到标志寄存器中,但它如何影响CF?它只插入移动字的第一个或最后一个位吗?

1 个答案:

答案 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被放在那里。