對比兩種寫法:
// 遞增
for (i=1; i<=limit; i++) fact *= i;
// 遞減
for (i=limit; i!=0; i--) fact *= i;
; 遞增版 (fact1) - 4 條指令循環體
.L4:
imull %eax, %edx ; fact *= i
addl $1, %eax ; i++
cmpl %edi, %eax ; cmp i, limit
jne .L4 ; 跳轉
; 遞減版 (fact2) - 3 條指令循環體
.L14:
imull %eax, %edx ; fact *= i
subl $1, %eax ; i--
jne .L14 ; 直接利用 ZF 標誌跳轉
cmpl 比較 i 與 limit (兩個寄存器/內存值)。subl 後結果為 0 直接設置零標誌 (ZF),jne 僅檢查 ZF,無需額外比較指令。for (int i=n; i--;) 或 while(n--))。遞減迴圈利用零標誌消除比較指令,是經典的編譯器優化友好模式。