標籤:
初次接觸MOOC課堂,裡面有個很牛X的老師教Linux,恰好自己有興趣學,顧有了此系列學習博文。
第一講 電腦是如何工作的
學習Linux,涉及到了C語言和彙編以及作業系統的知識,顧第一講要講講彙編的知識,C和作業系統知識自行複習。以下知識都是AT&T彙編的知識,可能與Intel彙編有些不同。
知識一:
Example instruction What it does
知識二:
有這些知識差不多就能看懂彙編了。現在給一個簡單的C程式,main.c,然後讓它編譯成組譯工具,得到main.s。
實驗運行環境:實驗樓64位Linux虛擬機器
//main.c
1 int g(int x) 2 { 3 return x + 333; 4 } 5 6 int f(int x) 7 { 8 return g(x); 9 }10 11 int main(void)12 {13 return f(888) + 111;14 }
編譯命令為:gcc –S –o main.s main.c -m32 (其中-m32是將代碼編譯為32位的意思,因為該命令是在實驗樓64位Linux虛擬機器環境下使用的,32位Linux環境可能會稍有不同)。
以下是main.s代碼,共25行。需要說明的是,編譯後會出現很多以“.”開頭的語句,這些都是起串連作用的,實際上是不執行的語句,顧可以把它們刪除,得到純淨的彙編代碼,如下:
接下來就是分析了。
從main函數開始。
18行,將%ebp壓棧(其中%esp的值會自動減4,因為pushl操作等價於2行代碼,可參考知識二);
19行,將%esp的值給%ebp,形成棧中棧的結構。(其中18,19行代碼就是enter操作)
20行,21行,就相當於將888入棧。
22行,調用f()函數,首先將%eip入棧,然後將f()的地址賦值給%eip(說明:%eip所指的值為下一條代碼執行的地址,所以將f()函數的地址給%eip,那下一次就會執行f()函數)。
18行--22行中的棧的內容的變化如
後續代碼的棧變化類似,入棧、出棧、入棧、出棧……在此就不多加累贅了。
總結:
對於電腦是如何工作的,首先是將進階語言轉換成組合語言,接著將組合語言理解成入棧、出棧操作。整個電腦的工作就是由不斷的入棧,不斷的出棧,外加一些簡單的加減等操作所構成的。
註明:
部落格署名:鄭俊
原創作品轉載請註明出處
參考資料:
《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 ”
Linux學習之路一電腦是如何工作的