首页 > 解决方案 > ROL 和 OF 的行为不一致

问题描述

手册指出

OF 标志仅针对 1 位循环定义;在所有其他情况下它是未定义的(仅 RCL 和 RCR 指令除外:零位循环不执行任何操作,即不影响标志)

这也显示在下面的伪代码中

IF (COUNT & COUNTMASK) = 1
THEN OF ← MSB(DEST) XOR CF;
ELSE OF is undefined;
FI;

但是,在实践中尝试时这是不同的。这是有问题的代码

mov rax, 0x4444444433332211
mov    cl, 0x44
rol    rax, cl

然而,溢出标志似乎被设置了,

这种行为不是特定于 0x44 也不是 cl 作为源,它会发生在任何非零的情况下(前提是首先设置 OF 的原因)。

标签: assemblygdbx86-64intel

解决方案


当一个标志被称为“未定义”时,这意味着它的值没有以定义的方式更新,因此不能使用

它实际上可能由于某些特定于实现的原因而改变(在您的情况下它已设置),但您不能假设这是可靠或可移植的行为。


推荐阅读