標籤:csapp 檔案的 目標 記錄 包括 編程 實現 相容 源檔案
編譯器承擔了產生彙編代碼的大部分工作,但是閱讀和理解彙編代碼仍然是重要能力。
學習意義:(1)理解編譯器的最佳化能力,分析代碼中隱含的低效率。(2)進階語言提供的抽象層會隱藏我們想要瞭解的程式的運行時行為。e
相對於C代碼錶示的計算操作,最佳化編譯器能夠重新排列執行順序,消除不必要計算,用快速控制項目替換慢速操作,甚至將遞迴變換成迭代。
表述基於x84-64的機器語言。(32位前身是IA-32)(Intel處理器系列俗稱x86)
電腦工業已經完成了從32位到64位的過渡。32位機器只能使用4GB的隨機訪問儲存空間。
每個後繼處理器的設計都是向後相容的。
摩爾定律:晶體管數量每26個月就會翻一番。
使用Unix命令列編譯檔案p1.c和p2.c的代碼:
linux> gcc -Og -o p p1.c p2.c
“gcc”:GCC C編譯器(linux上預設的編譯器),可以簡單地用“cc”來啟動它。
編譯選項“-Og”:說明編譯器使用會產生符合原始C代碼整體結構的機器代碼最佳化等級。較進階別的最佳化:“-O1”,“-O2”。
“gcc”命令調用了一整套程式將原始碼——>可執行代碼:
(1)C前置處理器,插入所有#include命令指定的檔案,擴充所用#define聲明指定的宏。
(2)編譯器產生兩個源檔案的彙編代碼p1.s和p2.s。
(3)編譯器將彙編代碼——>二進位目標代碼檔案p1.o和p2.o。(包含所有指令的二進位表示,還沒有填入全域值的地址)
(4)連結器將兩個目標代碼檔案與實現庫函數的代碼合并——>可執行代碼檔案p(由“-o p”指定)
機器級編程中最重要的兩種系統抽象:
(1)指令集體繫結構ISA(Instruction Set Architecture)定義機器級程式的格式,行為。(處理器狀態,指令格式,每條指令對狀態的影響)
(2)虛擬位址。使得提供的記憶體模型看上去是一個很大很大的位元組數組。
機器代碼對C語言程式員隱藏的處理器狀態:
(1)程式計數器PC(%rip):給出將要執行的下一條指令在記憶體中的地址。
(2)整數寄存器檔案:包含16個命名的位置,分別儲存64位的值,(儲存地址,整數資料),選項組,儲存臨時資料。
(3)一組向量寄存器:存放多個整數/浮點數值。
彙編代碼不區分有不帶正負號的整數,不同類型指標。
程式記憶體包括:
(1)程式的可執行機器代碼。
(2)作業系統需要的一些資訊,用來管理程序呼叫和返回的運行時棧。
(3)使用者指派的記憶體塊(如malloc庫函數分配的)。
x86-64的虛擬位址是由64位,目前地址的高16位必須設定為0。所以實際位址範圍為(0 ~ 64TB)。
“-S”選項讓GCC運行編譯器,只產生彙編檔案,不做進一步的工作:
linux> gcc -Og -S mstore.c
【CSAPP】<Chapter 3>