程式的機器級表示
處理器體系結構
優化程式效能
儲存器層次結構
鏈結異常控制流
虛擬記憶體
系統級io
網路程式設計
併發程式設計
為什麼再讀?
————當然是沒讀懂啊摔
學了快三年的計算機,才回頭來梳理這些基礎的知識框架,是了這就是小時候沒好好讀書
這本書隔了兩年感覺還能再讀,也是大浪淘沙的經典好書,當然也是因為我鶸
大多數計算機使用位元組byte(8位bit)作為最小的可定址的記憶體單位,而機器級程式將記憶體看作乙個很大的位元組陣列,也就是虛擬記憶體,記憶體中的每乙個位元組都會有唯一的數字標識?,即是他的位址,這些所有位址的集合就是虛擬位址空間。
而對於各種進製的轉換想必不用多言,這是加減乘除的工作。
對於計算機的字長,2023年前主流的還是32位機器,這裡會有一些基本資料型別預設位元組數的差異,比如c的long和指標,機器中的差異還有大端法和小端法。
想想如何用c列印程式物件的位元組表示?
二進位制是計算機編碼、儲存和處理資訊的核心,數值0和1的研究也於19世紀演化迅速,布林代數就是其中乙個產物。很簡單的,布林代數就是~、&、|、^,對應邏輯運算not、and、or、exclusive-or。
中間都是非常瑣碎的數字計算相關,沒什麼寫頭。
發現乙個有趣的問題:在呼叫分配函式(如malloc)時,可能會有一些表示式溢位的問題,請編寫乙個calloc的可靠版本,題目如下:
可以先不看解答思考一下
#include
#include
#include
#include
#include
void
*another_calloc
(size_t nmemb, size_t size)
size_t buff_size = nmemb * size;
if(nmemb == buff_size / size)
return
null;}
intmain()
首先回顧一下整個編譯系統:
預處理階段
預處理器(cpp)根據以字元#號開頭的命令,修改原始的c程式。比如hello.c中的第一行#include 命令告訴預處理器讀取系統標頭檔案stdio.h的內容,並把它直接插入到程式文字中,結果得到了另乙個c程式,通常是以.i為副檔名。在linux下我們用gcc命令如下,得到乙個hello.i檔案,然後檢視檔案內容發現該程式依然是c語言程式,只不過多了標頭檔案stdio.h的內容。
gcc -e hello.c -o hello.i
編譯階段
編譯器(ccl)將文字檔案hello.i翻譯成文字檔案hello.s,它包含乙個組合語言程式。組合語言中每條語句都以一種標準的文字格式確切地描述了一條低階機器語言指令。其實組合語言是非常有用的,它為所有的高階語言提供了一種通用的輸出語言。比如c編譯器和fortran編譯器產生的輸出檔案用的都是一樣的組合語言。在linux下,我們用下列命令
得到乙個hello.s匯程式設計序:
gcc -s hello.i -o hello.s
彙編階段
彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成一種叫做可定位目標程式的格式,並將結果儲存在目標檔案hello.o中,hello.o是乙個二進位制檔案,它的位元組編碼是「機器語言指令」而不是「字元」,所以,我們用文字編輯器開啟hello.o檔案看到是回事一堆亂碼。使用gcc命令如下將得到hello.o檔案,用vim開啟看一下是亂碼。
gcc -c hello.s -o hello.o
鏈結階段
我們注意到,hello.c中有乙個printf函式,它是每個c編譯器都會提供的標準庫中的乙個函式。printf函式存在於乙個名為printf.o的單獨的預編譯好的目標檔案中,而這個檔案必須以某種方式合併到我們的hello.o程式中。鏈結器(ld)就是負責處理這種合併。最後得到hello檔案,乙個可執行目標檔案(可執行檔案),可被載入到記憶體中,由系統執行。使用命令如下得到hello檔案。
gcc hello.o -o hello
自此,編譯系統的整個過程大致如此。總結一下,從源程式到目標檔案(可執行檔案)的轉化是通過編譯系統完成的,編譯系統包含四個階段:預處理,編譯,彙編,鏈結。一般的編譯驅動程式如gcc都實現了編譯系統的所有功能,我們用編譯驅動程式直接就可以實現源程式到目標檔案的轉化。
這部分非常瑣碎,可以看我另一篇部落格裡有道自旋鎖實現的彙編的例子
自旋鎖彙編簡單實現
挖個小土包
等有例子了再更
等有例子了再更
爛了啊。。。內容好多,等會等會等會
採藥 九度教程第 101 題
首先將這個問題抽象 有乙個容量為 v 的揹包,和一些物品。這些物品分別有兩個屬性,體積 w 和價值 v,每種物品只有乙個。要求用這個揹包裝下價值盡可能多的物品,求該最大價值,揹包可以不被裝滿。因為最優解中,每個物品都有兩種可能的情況,即在揹包中或者不存在 揹包中有 0 個該物品或者 1 個 所以把這...
演算法題目第3題(B樹,B 樹,B 樹,B 樹)
一道筆試題 記不清楚了 b 樹插入操作的平均時間複雜度為o logn 最壞時間複雜度為o n hash表插入操作的平均時間複雜度為o 1 最壞時間複雜度為o n 排序鍊錶插入操作的平均時間複雜度為o n 最壞時間複雜度為o n 紅黑樹插入操作的平均時間複雜度為o logn 最壞時間複雜度為o n 這...
SDUST第6次實驗,第7次作業
new時,和 的區別 不能返回函式的區域性變數的引用,如果真的要返回的話,那就返回值不要返回引用 problema 矩陣的乘法 一定注意,不能傳區域性變數的引用,會出問題的,返回值就傳臨時臨時變數就可以 include using namespace std class matrix friend ...