我正在分析一些 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 周期才能完成。
所以这里是我的问题:
我确认这些指令具有固定的 CPU 周期。换句话说,无论给出什么操作数,它们处理的时间总是相同的,后面没有“时序通道”。我在英特尔的官方文档中找不到相应的规格。
那为什么有可能呢?显然,这是一个“循环”或某种程度的,至少是高级别的。背后的设计决策是什么?CPU管道更容易?