理解x86指令bsr/bsf的CPU周期

逆向工程 部件 x86 英特尔
2021-07-03 11:28:21

我正在分析一些 x86 二进制代码的一些“时序通道”。我发布了一个问题来理解bsf/bsr操作码。

所以从高层次上讲,这两个操作码可以被建模为一个“循环”,它计算给定操作数的前导零和尾随零。x86手册对这些操作码进行了很好的形式化,如下所示:

IF SRC = 0
  THEN
    ZF ← 1;
    DEST is undefined;
  ELSE
    ZF ← 0;
    temp ← OperandSize – 1;
    WHILE Bit(SRC, temp) = 0
    DO
      temp ← temp - 1;
    OD;
    DEST ← temp;
FI;

但令我惊讶的是,bsf/bsr指令似乎具有固定的 cpu 周期根据我在这里找到的一些文件:https : //gmplib.org/~tege/x86-timing.pdf,似乎它们总是需要 8 个 CPU 周期才能完成。

所以这里是我的问题:

  1. 我确认这些指令具有固定的 CPU 周期。换句话说,无论给出什么操作数,它们处理的时间总是相同的,后面没有“时序通道”。我在英特尔的官方文档中找不到相应的规格。

  2. 那为什么有可能呢?显然,这是一个“循环”或某种程度的,至少是高级别的。背后的设计决策是什么?CPU管道更容易?

1个回答

我找到了一个网站,它似乎表明在介绍说明时这是作为循环实现的:

BSF scans forward across bit pattern (0-n) while BSR scans in reverse (n-0).

                             Clocks                 Size
    Operands         808x  286   386   486          Bytes

    reg,reg           -     -   10+3n  6-42           3
    reg,mem           -     -   10+3n  7-43          3-7
    reg32,reg32       -     -   10+3n  6-42          3-7
    reg32,mem32       -     -   10+3n  7-43          3-7

值得庆幸的是,他们似乎从 486 (1989) 开始对其进行了优化。正如您已经注意到的,它们似乎进一步改善了运行时间。事实上,当前的英特尔优化手册以相当低的固定时钟周期 (3+1) 列出了它。

还有一个更在详细回答stackexchange