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

ARM 汇编实现 C 语言 for 循环:从编译器输出看指令级对应关系

     編輯:C 語言問答

C 源碼


int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}

ARMv7 (32 位) 編譯器輸出對照 (GCC -O2)


; 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, #1i++
條件判斷cmp r1, #100 + ble .L2有符號比較 ≤,條件跳轉

ARMv8 (AArch64) 版本


    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 個整數 (需對齊、尾部處理)。

反組合碼分析實戰

  1. arm-none-eabi-gcc -S -O2 test.c -o test.s 生成彙編源碼。
  2. objdump -d test.elf 查看機器碼 + 符號。
  3. IDA Pro / Ghidra 圖形化控制流圖,識別循環結構 (紅色回邊)。

嵌入式工程啟示

  • **變量分配寄存器** (如 register int i) 可減少棧訪問,但現代編譯器自動分配更優。
  • **循環計數器倒序** (for(i=100;i--;)) 在某些架構上節省 cmp (零標誌自動置位),ARM 需 subs 更新標誌。
  • **volatile** 防止編譯器優化掉空循環 (延時用)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved