首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 內嵌組合語言教學 (28):清零 EAX 三種方法效能對比

     編輯:Delphi

將寄存器歸零是組合語言中最高頻操作之一。本文對比三種清零 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, 05 位元組需讀取常數池一般基準
sub eax, eax2 位元組寄存器自相減識別為清零~1.2x
xor eax, eax2 位元組無 (結果恆為 0)零延遲、無旁路~1.5x

現代 CPU 零延遲特性

Intel Sandy Bridge / AMD Zen 以降架構,XOR reg, reg 被識別為「零語義指令」:

  • 不佔用執行端口
  • 不產生數據依賴鏈
  • 重命名器直接分配零值物理寄存器
  • 不更新標誌位 (或按架構定義更新)

最佳實踐:所有清零寄存器操作均使用 XOR reg, reg (或 PXOR xmm, xmm 等 SIMD 等效指令)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved