組合語言 -- 模擬 C 語言中的副程式
組合語言簡介處理器BIOS啟動程式微軟組譯器組合語言DOSWindowsVisualStudioGNUGNU 組譯器C 轉組語連結 C 語言嵌入 C 語言訊息相關網站參考文獻最新修改簡體版English |
如果我們用gcc 編譯器將C 語言轉換為組合語言,就會發現其中有些難以理解的地方,這是因為 gcc 會將程式中的區域變數存放在堆疊當中,並且在進入函數前先將參數壓入堆疊。在進入 也就是要保存框架指標 ebp 與設定堆疊指標 esp,因此這兩個程式並不能再度呼叫下一層的函數,否則將會導致框架指標遺失,而產生堆疊錯誤的情況。 在 IA32 的處理器架構下,要進行多層次的副程式呼叫,必須在程式一進入時就保存 ebp 框架指標於堆疊中,然後設定 esp 堆疊指標,接著分配區域變數的空間。當函數呼叫結束,要返回上一層函數時,則必須先將傳回值存入 eax 當中,然後利用 leave 與 ret 等指令,完成返回動作。 為了觀察上述的過程,我們利用gcc將範例 f2.c 轉換成組合語言 f2.s,以下顯示了這兩個程式的對照情況,只要仔細觀察,您將會瞭解 C 語言函數呼叫機制的實作方式。
|
page revision: 0, last edited: 11 Oct 2010 07:31
Post preview:
Close preview