組合語言(九) 鏈結庫

2021-10-19 07:41:37 字數 1513 閱讀 8402

如果程式設計者花時間的話,就可以用組合語言編寫岀詳細的輸入輸岀**。就好比自己從頭開始搭建汽車,然後可以駕車出行一樣。這個工作很有趣但也很耗時。接下來我們來了解一下什麼是鏈結庫。鏈結庫是一種檔案,包含了已經彙編為機器**的過程(子程式)。鏈結庫開始時是乙個或多個原始檔,這些檔案再被彙編為目標檔案。目標檔案插入到乙個特殊格式檔案,該檔案由鏈結器工具識別。

鏈結器工具把乙個程式的目標檔案與乙個或多個目標檔案以及鏈結庫組合在一起。比如,下述命令就將 hello.obj 與 irvine32.lib 和 kernel32.lib 庫鏈結起來:

link hello.obj irvine32.lib kernel32.lib

kernel32.lib 檔案是 microsoft windows 平台軟體開發工具(software development kit)的一部分,它包含了 kernel32.dll 檔案中系統函式的鏈結資訊。kernel32.dll 檔案是 ms-windows 的乙個基本組成部分,被稱為動態鏈結庫(dynamic link library)。它含有的可執行函式實現基於字元的輸入輸出。

下圖展示了為什麼 kernel32.lib 是通向 kernel32.dll 的橋梁。

現在有了gdb斷點除錯,而且國內大部分不關注這些實現,所以這裡只是簡單了解即可,不需要深入鑽研。

組合語言程式設計沒有 microsoft 認可的標準庫。在 20 世紀 80 年代早期,程式設計師第一次開始為 x86 處理器編寫組合語言時,ms-dos 是常用的作業系統。這些 16 位程式可以呼叫 ms-dos 函式(即 int 21h 服務)來實現簡單的輸入輸出。即使是在那個時代,如果想在控制台上顯示乙個整數,也需要編寫乙個相當複雜的程式,將整數的內部二進位制表示轉換為可以在螢幕上顯示的 ascii 字串行。這個過程被稱為 writeint。

microsoft 在 64 位程式中使用統一模式來傳遞引數並呼叫過程,稱為 microsoft x64 呼叫規範。該規範由 c/c++ 編譯器和 windows 應用程式設計介面(api)使用。程式設計師只有在呼叫 windows api 的函式或用 c/c++ 編寫的函式時,才會使用這個呼叫規範。該呼叫規範的一些基本特性如下所示:

1) call 指令將 rsp(堆疊指標)暫存器減 8,因為位址是 64 位的。

2) 前四個引數依序存入 rcx、rdx、r8 和 r9 暫存器,並傳遞給過程。如果只有乙個引數,則將其放入 rcx。如果還有第二個引數,則將其放入 rdx,以此類推。其他引數,按照從左到右的順序壓入堆疊。

3) 呼叫者的責任還包括在執行時堆疊分配至少 32 位元組的影子空間(shadow space),這樣,被呼叫的過程就可以選擇將暫存器引數儲存在這個區域中。

4) 在呼叫子程式時,堆疊指標(rsp)必須進行 16 位元組邊界對齊(16 的倍數)。call 指令把 8 位元組的返回值壓入堆疊,因此,除了已經減去的影子空間的 32 之外,呼叫程式還必須從堆疊指標中減去 8。後面的示例將顯示如何實現這些操作。

C語言使用動態鏈結庫靜態鏈結庫

1 每個 c 語言原始檔被編譯後生成目標檔案,這些目標檔案最終要被鏈結在一起生成可執 行檔案。2 鏈結器的主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正 確的銜接。由鏈結器在鏈結時將庫的內容直接加入到可執行程式中 編譯靜態庫原始碼 gcc c lib.c o lib.o 生成靜...

C語言使用動態鏈結庫靜態鏈結庫

1 每個 c 語言原始檔被編譯後生成目標檔案,這些目標檔案最終要被鏈結在一起生成可執 行檔案。2 鏈結器的主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正 確的銜接。由鏈結器在鏈結時將庫的內容直接加入到可執行程式中 編譯靜態庫原始碼 gcc c lib.c o lib.o 生成靜...

組合語言 AT T組合語言

這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...