天天看點

程式的彙編,連結過程:

code.c源代碼:

#include <stdio.h>

int accum = ;

int sum(int x, int y)
{ 
    int t = x+y;
    accum += t;
    return t;
}
int main()
{ 
    int ret = sum(, );
    printf("ret = %d\n", ret);
    return ;
}
           
程式的彙編,連結過程:

彙編檔案包含各種聲明,包括以下幾行:

程式的彙編,連結過程:
程式的彙編,連結過程:

每個代碼對應一句彙編指令。

程式的彙編,連結過程:

使用‘-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。

格式注解:

simple.c源代碼:

int simple(int *xp, int y)

{

int t = *xp+y;

*xp = t;

return t;

}

當帶選項‘-S’和‘-O1’運作gcc時,會産生如下檔案simple.s:

程式的彙編,連結過程:

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

繼續閱讀