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

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

     編輯:關於C語言

靜態資料區與字串常數


.LC0:
    .string "hello,world"
  • .LC0 標記位於靜態分配區域 (`.rodata` 或 `.data`),程式啟動時由載入器分配。
  • C 字串常數自動存放於此區,生命週期贯穿整個程式執行期間。

堆疊 (Stack) 結構與操作

  • 堆疊位於使用者空間高地址向低地址增長。
  • 堆疊指標 (ESP/RSP) 永遠指向棧頂下一個可用位址。
  • pushl:將資料壓入堆疊,ESP 減 4 (32 位)。
  • popl:彈出資料到暫存器,ESP 加 4。
  • 僅能以 LIFO (後進先出) 存取,無法任意偏移 (除非用基址暫存器 EBP/RBP)。

Hello World main 函數組合語言逐行解析 (AT&T 語法)


main:
    leal    4(%esp), %ecx       # 保存 argc 位址 (argv 指標)
    andl    $-16, %esp          # 對齊堆疊至 16 字節 (SSE/AVX 需求)
    pushl   -4(%ecx)            # 壓入 argc (原始 ESP+0)
    pushl   %ebp                # 保存舊幀指標
    movl    %esp, %ebp          # 建立新幀指標
    pushl   %ecx                # 保存 argc/argv 位址
    subl    $4, %esp            # 分配區域變數空間 (對齊)
    movl    $.LC0, (%esp)       # 將字串位址壓入堆疊作為 puts 參數
    call    puts                # 呼叫 puts 輸出字串
    movl    $0, %eax            # 返回值 0
    addl    $4, %esp            # 釋放區域變數空間
    popl    %ecx                # 還原 argc/argv 位址
    popl    %ebp                # 還原幀指標
    leal    -4(%ecx), %esp      # 還原堆疊指標 (含對齊填充)
    ret                         # 返回

關鍵觀察

  1. 參數傳遞:x86-32 使用堆疊傳參,呼叫者壓入參數 (右至左),call 指令隱含壓入返回位址。
  2. 幀指標 (EBP):建立堆疊幀基址,區域變數用 -[offset](%ebp) 存取,參數用 +[offset](%ebp)。
  3. 堆疊對齊:`andl $-16, %esp` 確保 16 字節對齊,滿足 ABI 要求 (SSE 指令集)。
  4. 保存/恢復現場:呼叫 `puts` 前壓入需保留的暫存器 (此處為 `%ecx`),返回後彈出還原。
  5. 返回值:`%eax` 存放整數/指標返回值。

資料搬移與運算指令

  • movl src, dst:複製資料 (立即數、暫存器、記憶體)
  • addl src, dst:`dst = dst + src`
  • subl src, dst:`dst = dst - src`

範例:將靜態變數 `myvalue` (初值 190) 加 100 減 20:


movl myvalue, %ebx
addl $100, %ebx
subl $20, %ebx
movl %ebx, myvalue

段落結構

  • .text:程式碼段 (唯讀、可執行)
  • .data:已初始化靜態資料 (讀寫)
  • .bss:未初始化靜態資料 (零填充、讀寫)
  • .rodata:唯讀資料 (字串常數、常數表)

總結

C 程式經編譯器轉為組合語言,再由組譯器生成機器碼。執行本質是:資料在暫存器、堆疊、靜態區間搬移,配合 加減乘除、邏輯判斷、跳轉/呼叫 指令完成運算與控制流。理解堆疊幀、呼叫慣例、暫存器用途是逆向工程與效能優化基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved