LOOP 指令結合 ECX 計數寄存器,實現硬體級計數循環:每次執行遞減 ECX,若非零則跳轉至標號。指令編碼短、無需額外比較指令,適合簡單計數循環。
mov ecx, count { 載入循環次數 }
@@Label:
{ 循環體 }
loop @@Label { ECX-- ; if ECX != 0 then JMP @@Label }
function Power(x, n: Integer): Integer;
asm
{ EAX 已含 x (第一參數) }
mov ecx, n { ECX = n }
sub ecx, 1 { 已乘 1 次,剩 n-1 次 }
@@Loop:
add eax, eax { EAX *= 2 (此處為示範,實際應用用 MUL) }
loop @@Loop
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Power(2, 10))); { 1024 }
end;
| 限制 | 說明 |
|---|---|
| 僅支援 ECX/RCX | 不能指定其他寄存器計數 |
| 跳轉範圍限制 | 短跳轉 (-128~+127 位元組) |
| 現代 CPU 效能較差 | 分支預測器難以優化,比 DEC/JNZ 慢 |
| 64 位模式用 RCX | 同樣適用 |
mov ecx, count
@@Label:
{ 循環體 }
dec ecx
jnz @@Label { 無短跳轉限制,分支預測友好 }
教學階段理解 LOOP 即可,實際優化代碼請使用 DEC/JNZ 或編譯器生成的循環。