我试图理解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将被设置为最后一班。
答案 0 :(得分:2)
OF未定义(参见伪代码)。 0x22&gt; 1.同上0x78(0x78 mod 0x40&gt; 1)。
<强> UPD 强>:
请尝试理解未定义意味着OF可以成为任何东西(保持不变或改变)。
如果你暗示当移位数大于1时CPU没有将OF设置为随机值那么你就是绝对正确的。它不是。但是,在这种情况下OF的实际公式没有记录。你可以从实验中推断出来。但这不是你可以依赖的东西。事实上,我之前做过这个实验,并为不同的CPU(AMD,具有超线程的英特尔,没有超线程的英特尔,AFAIR)找到了3种不同的公式。你怎么用这个?