程式的彙編,鏈結過程

2021-07-29 19:46:46 字數 1587 閱讀 2143

code.c源**:

彙編檔案包含各種宣告,包括以下幾行:

每個**對應一句彙編指令。

使用『-c』命令產生目標**檔案code.o,因為是二進位制檔案,所以無法檢視。

不過,要檢視目標**的內容,可以使用反彙編器(disassembler).

在linux系統中,帶『-d』命令列標誌的程式objdump可以充當這個角色.

注意:

(1) ia指令長度從1到15個位元組不等。常用的指令以及運算元較少的指令所需位元組數少,那些不常用的或者運算元較多的指令所需位元組數較多。

(2) 設計指令格式的方式是,從某個給定位置開始,可以將位元組唯一的解碼成機器指令。

(3) 反彙編是基於機器**中的檔案中的位元組序列來確定彙編**。它不需訪問程式的源**或者彙編**。

(4) 反彙編使用的指令命名規則與gcc生成的彙編**使用的有細微差別。

用以下**生成可執行檔案,然後反彙編prog檔案:

反彙編會抽取出各種**序列,包括以下:

可以看出,這段**與反彙編產生的**幾乎一樣。

主要的區別在於:

(1) 左邊列出的位址不同—聯結器將**的位址一刀一段不同的位址範圍裡。

(2) 聯結器確定了儲存全域性變數accum的位址,在code.o反彙編**第五行,accum位址還為0,在prog得反彙編**中,位址設為0x8049684。

格式註解:

******.c源**:

int ******(int *xp, int y)

當帶選項『-s』和『-o1』執行gcc時,會產生如下檔案******.s:

所有以『.『開有的行都是指導彙編器和鏈結器的命令。每一行的左邊都提供引用,右邊是注釋簡單的描述指令的效果以及它與原始c語言的**中計算操作的關係。

程式的預編譯,編譯,彙編,鏈結過程

預編譯過程主要處理那些源 檔案中的以 開始的預編譯指令。比如 include define 等,主要處理規則如下 1 將所有的 define 刪除,並且展開所有的巨集定義。2 處理所有條件預編譯指令,比如 if ifdef elif else endif 3 處理 include 預編譯指令,將被包...

程式編譯,鏈結過程

c語言的編譯鏈結過程要把我們編寫的乙個c程式 源 轉換成可以在硬體上執行的程式 可執行 需要進行編譯和鏈結。編譯就是把文字形式源 翻譯為機器語言形式的目標檔案的過程。鏈結是把目標檔案 作業系統的啟動 和用到的庫檔案進行組織形成最終生成可載入 可執行 的過程。過程 如下 預處理器 將.c 檔案轉化成 ...

程式的編譯鏈結過程

一段源 到可執行性程式需要經歷預處理 編譯彙編和鏈結等步驟,接下來詳細介紹這些過程 假設檔案main.czhong有如下 include int main 1 巨集定義指令 2 條件編譯 3 標頭檔案包含指令 4 特殊符號處理 不能在標頭檔案中定義全域性變數,因為在標頭檔案中定義全域性變數將會使所有...