【问题标题】:Inconsistent behaviour of ROL and OFROL 和 OF 的行为不一致
【发布时间】:2019-09-01 15:35:21
【问题描述】:

手册说明

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

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

Before

After

此行为并非特定于 0x44 或 cl 作为源,它会在任何非零时发生(前提是首先设置 OF 的原因)。

【问题讨论】:

    标签: assembly gdb x86-64 intel


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      正如 Jan 所说,“未定义”可以描述任何行为,包括不修改 OF。 (为了简化部分标志重命名)。

      IF (COUNT & COUNTMASK) = 1

      从性能数据来看,尚不清楚这是否真的是准确的文档。

      可能只有隐式计数为1 的编码实际上以数据相关的方式设置OF。

      根据 Agner Fog 的指令表,在 Intel Sandybridge 系列上,rol r, 1(短格式编码)是 2 uop,而rol r, imm 是 1 uop。

      我认为即使 imm8 立即编码为 1 也是如此,但我忘记了我是否曾经测试过。

      但是rol reg, cl 形式是 2 微指令,而可变计数移位指令需要 3 微指令,如果计数为 0,则必须保持 FLAGS 不变。(额外的 2 微指令用于有条件地合并到 EFLAGS 中)。

      【讨论】:

        猜你喜欢
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 2014-08-31
        相关资源
        最近更新 更多