int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
; sum 在 r0, i 在 r1
mov r0, #0 ; sum = 0
mov r1, #1 ; i = 1
.L2:
add r0, r0, r1 ; sum += i
add r1, r1, #1 ; i++
cmp r1, #100 ; i <= 100 ?
ble .L2 ; 小於等於則跳回
; 循環結束,r0 保存結果
| C 構造 | ARM 指令序列 | 說明 |
|---|---|---|
| 初始化 | mov r0, #0 / mov r1, #1 | 立即數載入寄存器 |
| 循環體 | add r0, r0, r1 | 累加 |
| 遞增 | add r1, r1, #1 | i++ |
| 條件判斷 | cmp r1, #100 + ble .L2 | 有符號比較 ≤,條件跳轉 |
mov w0, #0 ; sum
mov w1, #1 ; i
.L2:
add w0, w0, w1
add w1, w1, #1
cmp w1, #100
b.le .L2 ; A64 條件分支後綴
; GCC -O3 -mfpu=neon 可能生成
mov w0, #0
mov w1, #1
.L2:
add w0, w0, w1
add w1, w1, #1
add w0, w0, w1
add w1, w1, #1
; ... 展開 4 次
cmp w1, #100
b.le .L2
或使用 NEON 向量指令一次加 4/8 個整數 (需對齊、尾部處理)。
arm-none-eabi-gcc -S -O2 test.c -o test.s 生成彙編源碼。objdump -d test.elf 查看機器碼 + 符號。register int i) 可減少棧訪問,但現代編譯器自動分配更優。for(i=100;i--;)) 在某些架構上節省 cmp (零標誌自動置位),ARM 需 subs 更新標誌。