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

C 指標原理 (86):Hello World 程式組合語言深度剖析 (二)

     編輯:關於C語言

暫存器基礎知識 (IA-32)

暫存器慣用用途
EAX累加器、函數返回值
EBX基址暫存器
ECX計數器 (迴圈、字串操作)
EDX資料暫存器、I/O、乘除法擴展
ESP堆疊指標 (Stack Pointer)
EBP幀指標 (Base Pointer)
ESI來源變址 (字串/陣列操作)
EDI目的變址

段暫存器:CS (代碼)、DS (資料)、SS (堆疊)、ES/FS/GS (附加資料)。
標誌暫存器 EFLAGS:條件碼、控制位。
AT&T 語法:`%eax` 表示暫存器,`$10` 表示立即數,`0x100` 表示絕對位址。

C 變數記憶體分配對應組合語言

組合語言變數三要素:標號 (位址)、資料類型 (大小)、預設值。


myvalue:
    .long 190          # 4 字節有號整數,初值 190
mess:
    .ascii "hello"     # 5 字節字串 (無結束符)

對應 C 代碼:


long myvalue = 190;
char mess[] = "hello"; // 含 \0 則用 .string 或 .asciz

Hello World 組合語言關鍵片段 (GCC 輸出)


.LC0:
    .string "hello,world"   # 唯讀資料區

.text
.globl main
.type main, @function
main:
    leal 4(%esp), %ecx
    andl $-16, %esp
    pushl -4(%ecx)
    pushl %ebp
    movl %esp, %ebp
    pushl %ecx
    subl $4, %esp
    movl $.LC0, (%esp)      # 參數壓棧
    call puts               # 呼叫 C 庫函數
    movl $0, %eax           # 返回 0
    addl $4, %esp
    popl %ecx
    popl %ebp
    leal -4(%ecx), %esp
    ret

指令語意對應

  1. leal 4(%esp), %ecx:計算 `argv` 位址 (`argc` 之後)
  2. andl $-16, %esp:堆疊 16 字節對齊
  3. pushl -4(%ecx):保存 `argc`
  4. pushl %ebp / movl %esp, %ebp:建立堆疊幀
  5. pushl %ecx:保存 `argv` 位址
  6. subl $4, %esp:分配區域空間 (對齊填充)
  7. movl $.LC0, (%esp):將字串位址放入參數位置
  8. call puts:呼叫輸出函數 (破壞暫存器,故前序保存)
  9. 尾聲:還原堆疊、暫存器、返回

編譯器最佳化觀察

  • -O0 (預設) 保留幀指標,便於除錯。
  • -O2 可能省略 `%ebp` (幀指標省略優化),改用 `%esp` 相對位址存取區域變數。
  • 內聯函數、常數傳播、死碼消除等優化會大幅改變組合語言結構。

學習建議

  1. 編寫簡單 C 函數,用 `gcc -S -O0 -fverbose-asm` 產生註解豐富的組合語言。
  2. 對照 C 代碼與組合語言,理解變數存取、控制流、函數呼叫對應關係。
  3. 嘗試手寫組合語言實現簡單演算法 (如階乘、陣列求和),加深體會。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved