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

組合語言與 C 語言模組混合連結實戰:COFF/PE 格式深度剖析

     編輯:組合語言

實驗架構

  • ms.asm:入口點 _start,EXTERN _m 呼叫 C 函式
  • mc2.c:m() 呼叫 sum(),含全域/區域變數、大型陣列
  • 編譯:ml /c /coff ms.asm、cl /c /Fomc.obj mc2.c
  • 連結:link /subsystem:windows ms.obj mc.obj

DUMPBIN 解析 .obj 內部結構

ms.obj (組語模組)

  • 三節區:.text (代碼、1 個 REL32 重定位項 _m)、.data (空)、.drectve (連結器指令 -entry:start)
  • 符號表:_m (UNDEF/EXTERNAL)、start (SECT1/EXTERNAL)

mc.obj (C 模組)

  • 兩節區:.drectve (預設庫)、.text (代碼 166 bytes、4 個重定位項)
  • 重定位:_e/_f/_ar (DIR32 絕對定址)、_sum (REL32 相對呼叫)
  • 符號表:_sum/_m (EXTERNAL)、_ar/_e/_f (UNDEF)

連結後 ms.exe (PE 格式) 重定位結果驗證

  • 代碼區:所有 CALL/JMP 轉為區段內相對位移 (E8/E9),不受載入位址影響。
    例:_start 呼叫 _m → E8 4B 00 00 00 (相對位移 0x4B)
  • 資料區:全域變數存取採 絕對位址 (OpCode C7 05 addr)。
    連結器指定 ImageBase=0x400000、BaseOfData=0x2000 → 資料區載入 0x402000。
    若實際載入位址 ≠ 0x402000,絕對定址指令將出錯!

32 位元保護模式下的關鍵結論

  1. 4 GB 定址空間使所有代碼可合併單一區段,CALL/JMP 全為相對跳轉,位置無關 (PIC)。
  2. 資料區絕對定址需連結器 /BASE:LoadAddress 指定載入基址,或作業系統支援基址重定位 (Base Relocation Table)。
  3. 開發 OS 進入保護模式後,可放心使用高階語言工具鏈,代碼區相對定址自動正確;僅須自行處理資料區重定位或固定載入位址。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved