1. 程式人生 > >《深入理解計算機系統》讀書筆記——第七章 連結

《深入理解計算機系統》讀書筆記——第七章 連結

 連結

有兩個c檔案:

/* main.c */
void swap();

int buf[2] = {1, 2};
int main()
{
	swap();
	return 0;	
}


/* swap.c */
extern int buf[];

int *bufp0 = &buf[0];
int *bufp1;

void swap()
{
	int temp;
	
	bufp1 = &buf[1];
	temp = *bufp0;
	*bufp0 = *bufp1;
	*bufp1 = temp;
	
}


要通過GNU編譯系統構造程式,我們可以在shell中輸入以下命令:

gcc -O2 -g -o p main.c swap.c

(1)驅動程式首先執行C前處理器(cpp),將C源程式翻譯成一個ASCII碼的中間檔案main.i。

(2)接下來,驅動程式執行C編譯器(ccl),它將main.i翻譯成一個ASCII組合語言檔案  .s。

(3)然後,驅動程式執行彙編器,它將main.s翻譯成一個可重定位目標檔案main.o。

(4)驅動程式經過相同的過程生成swap.o。最後,它執行連結器ld,將main.o和swap.o以及一系列的系統目標檔案組合起來,建立一個可執行目標檔案p。(-o為命名引數)

在命令列中輸入./p時,shell呼叫作業系統中也各叫做載入器的函式,拷貝可執行檔案p中的程式碼和資料到儲存器,然後將控制轉移到這個程式的開頭。

相關推薦

深入理解計算機系統讀書筆記—— 連結

 連結 有兩個c檔案: /* main.c */ void swap(); int buf[2] = {1, 2}; int main() { swap(); return 0; } /* swap.c */ extern int buf[]; int *b

CSAPP深入理解計算機系統(第二版)家庭作業答案

《深入理解計算機系統(第二版)》CSAPP 第三章 家庭作業 這一章介紹了AT&T的彙編指令 比較重要 本人完成了《深入理解計算機系統(第二版)》(以下簡稱CSAPP)第三章的家庭作業,並與網上的一些答案進行了對比修正。 感謝博主summerhust的整理,以下貼出AT&T常用匯編指令

深入理解計算機系統家庭作業

/* ***6.23 */ 等價於求xr(1 - x)的最大值,由代數知識得x=0.5的時候取得最大。 /* ***6.24 */ 0.5 * 60 / 12000 * 1000 + 60 / 12000 * 1000 /500 + 3 = 5.51ms /* ***6

深入理解計算機系統筆記(三)連結知識【附圖】

歡迎檢視《深入理解計算機系統》系列部落格 --------------------------------------------------------------------------------------------------------------

深入理解計算機系統家庭作業

/* ***3.54 ***寫出decode2的原型*/ int decode2(int x ,int y, int z) { int a = z - y; int b = (a << 15) >> 15; return (x ^ a) *

深入理解計算機系統家庭作業

/* ***5.15 */ A.    畫圖略 B.   3 C.   1 D.   乘法不在關鍵路徑上,故乘法可以按流水線執行 /* ***5.16 */ A.   每次要載入兩個資料,故至少需要兩個週期 B.   迴圈展開並沒有改變關鍵路徑長 /* ***5.1

深入理解計算機系統家庭作業(4.43-4.54)

/* *****4.43  */ A.   根據4.6可知,push %esp 是將%esp的舊值壓入棧中;而這段程式碼壓入的新值,兩者不一致。 B.   將%esp的舊值先放入另一個暫存器中再進行操作        movl   REG   %eax        sub

3.2《深入理解計算機系統筆記(二)內存和高速緩存的原理【插圖】

img sram 本質 text ddr rate too 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處

深入理解計算機系統————第一筆記

計算機系統是由硬體和系統軟體組成,他們共同工作來執行應用程式,這本書的目的就在於幫助人們理解·當系統在執行hello程式時,系統發生了什麼以及為什麼會這樣,換句話說,當執行簡單程式hello時,整個電腦系統從應用程式,作業系統,快取裝置,等等,在這個程式執行的過程中做了什麼,以及為什麼會這樣

深入理解計算機系統筆記——資訊的表示和處理

資訊的儲存 十六進位制表示法 字 資料大小 定址和位元組順序 資料型別 字串的表示 程式碼的表示 資訊的儲存 資訊是客觀事物的反映,是經過處理加工後得出的資料。 資料是客觀事物的記錄。 計算機內所有的資訊均以二進位制的形式表示,

深入理解計算機系統筆記——計算機系統漫遊

1.計算機系統 由硬體與軟體組成,他們共同工作來執行程式。 2.資訊的表示 #include <stdio.h> int main() { printf("Hello World\n"); return 0; //c標準規定建議main函式返回值為int

深入理解計算機系統筆記:幾個重要概念

執行程式系統 編譯系統 從原始碼文字檔案到可執行目標檔案的轉化由編譯系統(compilation system)完成 前處理器(cpp):hello.c —> hello.i 根據以字元 #

深入理解計算機系統筆記(二)記憶體和快取記憶體的原理【插圖】

歡迎檢視《深入理解計算機系統》系列部落格 --------------------------------------------------------------------------------------------------------------

深入理解計算機系統(原書2版)》pdf

出版者的話 譯者序 前 言 第1章 計算機系統漫遊1 1.1 資訊就是位+上下文1 1.2 程式被其他程式翻譯成不同的格式3 1.3 瞭解編譯系統如何工作是大有益處的4 1.4 處理器讀並解釋儲存在儲存器中的指令5 1.4.1 系統的硬體組成5 1.4.2 執行hello程式7 1.5 快取記憶體至關重要7

深入理解計算機系統學習筆記(一)

程式的編譯過程 為了說明程式的編譯過程,我們用經典的hello world程式作為例子 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hell

深入理解計算機系統筆記):連結

理解連結有很多好處: 有助於構造大型程式有助於避免一些危險程式設計錯誤有助於理解其他重要的系統概念讓你能夠利用共享庫1. 編譯器驅動程式 編譯命令,假設有main.c和swap.c兩個原始檔 $ gcc -O2 -g -o p main.c swap.c 實際上編譯過程

深入理解計算機系統筆記(一)棧【插圖】

歡迎檢視《深入理解計算機系統》系列部落格 《深入理解計算機系統》筆記(一)棧(本篇) ------------------------------------------------------------------------------------------

強化學習(RLAI)讀書筆記n步自舉(n-step Bootstrapping)

第七章:n-step Bootstrapping 這一章中我們把蒙特卡洛演算法(MC)和一步差分演算法(one-step TD)統一起來。MC演算法和一步TD演算法都不可能永遠是最好的。這兩個方法都是比較極端的形式,可能使用它們中間形式會更好一些。另一個看待n步TD演算法的優勢的角度是它解決了固

C++ primer 讀書筆記 02 訪問控制和封裝

在c++中,我們使用訪問說明符加強類的封裝性: 定義在public說明符之後的成員在整個程式內可被訪問,public成員是暴露在外的,決定了類的介面 定義在private說明符之後的成員可以被類的成員函式訪問,但不能被使用該類的程式碼訪問,private封裝了類的實現細節 一

C++ primer 讀書筆記 01 定義抽象資料型別

定義成員函式 成員函式的宣告必須在類的內部,它的定義既可以在類的內部也可以在類的外部。 struct Sales_data { std::string isbn() const { return bookNo; } double arv_price() co