ROL 和 OF 的行为不一致
Inconsistent behaviour of ROL and OF
手册说明
The OF flag is defined only for the 1-bit rotates; it is undefined in all other cases (except RCL and RCR instructions
only: a zero-bit rotate does nothing, that is affects no flags)
下面的伪代码也显示了这一点
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)。
当一个标志被调用时 "undefined",这意味着它的值没有以定义的方式更新,因此 不能使用 。
它实际上可能会因某些特定于实现的原因而改变(在您的情况下它已设置),但您不能假设这是可靠或可移植的行为。
正如 Jan 所说,"undefined" 可以描述任何行为,包括不修改 OF。 (为了简化部分标志重命名)。
IF (COUNT & COUNTMASK) = 1
从性能数字来看,尚不清楚这是否真的是准确的文档。
可能只有 隐式 计数 1
的编码实际上以数据相关的方式设置 OF。
根据 Agner Fog 的指令表,在 Intel Sandybridge 系列上 rol r, 1
(短格式编码)是 2 微指令,而 rol r, imm
是 1 微指令。
我认为即使 imm8
立即数被编码为 1
也是如此,但我忘记了我是否测试过它。
但是 rol reg, cl
形式是 2 微指令,而可变计数移位指令是 3 微指令,如果计数为 0,则必须保持 FLAGS 不变。(额外的 2 微指令用于有条件地合并到 EFLAGS ).
手册说明
The OF flag is defined only for the 1-bit rotates; it is undefined in all other cases (except RCL and RCR instructions only: a zero-bit rotate does nothing, that is affects no flags)
下面的伪代码也显示了这一点
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)。
当一个标志被调用时 "undefined",这意味着它的值没有以定义的方式更新,因此 不能使用 。
它实际上可能会因某些特定于实现的原因而改变(在您的情况下它已设置),但您不能假设这是可靠或可移植的行为。
正如 Jan 所说,"undefined" 可以描述任何行为,包括不修改 OF。 (为了简化部分标志重命名)。
IF (COUNT & COUNTMASK) = 1
从性能数字来看,尚不清楚这是否真的是准确的文档。
可能只有 隐式 计数 1
的编码实际上以数据相关的方式设置 OF。
根据 Agner Fog 的指令表,在 Intel Sandybridge 系列上 rol r, 1
(短格式编码)是 2 微指令,而 rol r, imm
是 1 微指令。
我认为即使 imm8
立即数被编码为 1
也是如此,但我忘记了我是否测试过它。
但是 rol reg, cl
形式是 2 微指令,而可变计数移位指令是 3 微指令,如果计数为 0,则必须保持 FLAGS 不变。(额外的 2 微指令用于有条件地合并到 EFLAGS ).