Linux學習之路一電腦是如何工作的

來源:互聯網
上載者:User

標籤:

初次接觸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學習之路一電腦是如何工作的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.