1.預編譯(生成.i檔案)
1.將所有的「#define」刪除,並且展開所有巨集;
2.處理掉所有條件預編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「#endif」;
3.處理「#include」指令,這是乙個遞迴過程;
4.刪除所有的注釋「//」和「/* */」;
5.新增行號和檔名標識;
6.保留所有的#pragma編譯器指令,待編譯器使用;
2.編譯(生成.s檔案)
把預處理完的檔案進行一系列的詞法分析,語法分析,語義分析及優化**、生成相對應的彙編**檔案。程式構建的核心部分,也是最複雜的部分之一。
3.彙編生成.o檔案,也叫目標檔案
彙編器是將彙編**轉變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的語法,也沒有語義,也不需要做指令優化,只是根據彙編指令和機器指令的對照表一一翻譯就可以了,「彙編」這個名字也**於此。上面的彙編過程我們可以呼叫彙編器as來完成。
編譯鏈結執行原理 編譯鏈結執行過程
乙個.c cpp源程式檔案要最後變成.exe windows 或者.out linux 可執行檔案,要經過編譯和鏈結過程。四個步驟 預編譯,編譯,彙編,連線 一 預編譯 處理以 開頭的預編譯指令,比如 include,define等,規則如下 1 刪除所有的 define,並展開所有的巨集替換 文字...
編譯鏈結執行原理
預編譯.i 刪除 define 文字替換 處理 include 遞迴展開 處理 if end if等預編譯指令 刪除注釋 新增行號和檔案標識 保留 pragma 編譯.s 1.詞法分析 2.語法分析 3.語義分析 4.優化 5.生成彙編指令 低階語言 以下是彙編指令的 int main 彙編.o 翻...
編譯鏈結執行原理 函式堆疊呼叫
首先先提出下面五個問題 1 形參開闢記憶體嗎?由誰開闢?2 形參的入棧順序?3 返回值如何帶出?4 被呼叫方結束後如何知道回退到呼叫方棧幀上?5 函式呼叫完成如何知道執行下一行指令?要解決這些問題,我們就要從彙編的角度切入。通過彙編 能夠使我們更加清晰地掌握函式的堆疊呼叫。彙編分為兩種形式inter...