將寄存器歸零是組合語言中最高頻操作之一。本文對比三種清零 EAX 的指令在現代 x86 CPU 上的效能差異,揭示 XOR 指令的優勢原理。
{ 方法 1:立即數移動 - 需讀取常數,最慢 }
mov eax, 0
{ 方法 2:減法 - 僅操作寄存器 }
sub eax, eax
{ 方法 3:異或 - 最短指令編碼,無數據依賴,最快 }
xor eax, eax
procedure TForm1.Button1Click(Sender: TObject);
var
t: Cardinal;
i: Integer;
begin
t := GetTickCount;
for i := 0 to 100000000 do Fun1; { mov eax, 0 }
t := GetTickCount - t;
ShowMessage(IntToStr(t)); { 約 600+ ms }
t := GetTickCount;
for i := 0 to 100000000 do Fun2; { sub eax, eax }
t := GetTickCount - t;
ShowMessage(IntToStr(t)); { 約 500+ ms }
t := GetTickCount;
for i := 0 to 100000000 do Fun3; { xor eax, eax }
t := GetTickCount - t;
ShowMessage(IntToStr(t)); { 約 400+ ms }
end;
| 指令 | 機器碼長度 | 數據依賴 | CPU 優化 | 相對速度 |
|---|---|---|---|---|
| mov eax, 0 | 5 位元組 | 需讀取常數池 | 一般 | 基準 |
| sub eax, eax | 2 位元組 | 寄存器自相減 | 識別為清零 | ~1.2x |
| xor eax, eax | 2 位元組 | 無 (結果恆為 0) | 零延遲、無旁路 | ~1.5x |
Intel Sandy Bridge / AMD Zen 以降架構,XOR reg, reg 被識別為「零語義指令」:
最佳實踐:所有清零寄存器操作均使用 XOR reg, reg (或 PXOR xmm, xmm 等 SIMD 等效指令)。