在汇编指令级别分析代码时,鉴于现代 CPU 不串行或按顺序执行指令,指令指针的位置真正意味着什么?例如,假设以下 x64 汇编代码:
mov RAX, [RBX]; // Assume a cache miss here.
mov RSI, [RBX + RCX]; // Another cache miss.
xor R8, R8;
add RDX, RAX; // Dependent on the load into RAX.
add RDI, RSI; // Dependent on the load into RSI.
指令指针将大部分时间花在哪条指令上?我可以为他们想出很好的论据:
mov RAX, [RBX]
可能需要 100 多个周期,因为它是缓存未命中。mov RSI, [RBX + RCX]
也需要 100 个周期,但可能与前一条指令并行执行。指令指针位于其中一个或另一个上意味着什么?xor R8, R8
可能会乱序执行并在内存加载完成之前完成,但指令指针可能会保留在这里,直到所有先前的指令也完成。add RDX, RAX
产生流水线停顿,因为它是RAX
在慢速缓存未命中加载到它之后实际使用的值的指令。add RDI, RSI
也会停止,因为它取决于加载到RSI
.