SHL指令OF和CF设置

时间:2016-12-28 11:01:05

标签: assembly x86

我试图理解SHL指令如何设置OF和CF标志,在大多数情况下我理解它是如何发生的,但是我可以把我的思绪包裹在一个特定的例子中。

考虑以下情况:

; RAX == 0x18F2086424981487
SHL     RAX, 0x22

此后标志状态如下:

OF == 0, CF == 0

在接近这个时,我解释了我的逻辑。

CF总是最后一位被推出目的地,因此在这种情况下0x18F2086424981487 << 0x21的最高位为0意味着在下一个班次中0将被推出,将CF设置为0,到目前为止好。

关于OF(来自SHL reference):

  

OF标志仅在1位移位时受影响。对于左移,如果结果的最高有效位与CF标志相同(即,原始操作数的前两位相同),则OF标志设置为0;否则,它被设置为1。

据此我理解,如果CF == 0和结果的最高有效位(此处0x18F2086424981487 << 0x22所以最高有效位为1)等于OF = 0。但在这种情况下CF == 0,最重要的位是1 CF = 1

我哪里出错?

修改

我已经读过OF只受到1位移位的影响,但你怎么解释:

; RAX == 0xABECFF1297783575
SHL     RAX, 0x78

对外输出:

CF == 1, OF == 1

根据我的理解,SHL指令只被视为value << 1的循环,直到计数器耗尽,这意味着OF将被设置为最后一班。

1 个答案:

答案 0 :(得分:2)

如果移位计数大于1,则

OF未定义(参见伪代码)。 0x22&gt; 1.同上0x78(0x78 mod 0x40&gt; 1)。

<强> UPD

请尝试理解未定义意味着OF可以成为任何东西(保持不变或改变)。

如果你暗示当移位数大于1时CPU没有将OF设置为随机值那么你就是绝对正确的。它不是。但是,在这种情况下OF的实际公式没有记录。你可以从实验中推断出来。但这不是你可以依赖的东西。事实上,我之前做过这个实验,并为不同的CPU(AMD,具有超线程的英特尔,没有超线程的英特尔,AFAIR)找到了3种不同的公式。你怎么用这个?