從彙編看電腦的工作過程

來源:互聯網
上載者:User

標籤:

  本周學習了Linux核心分析第一課,老師通過講解一個簡單的c程式使我瞭解了電腦(特別是堆棧部分)工作過程。

下面通過一個簡單的例子來分析一下:

下面是c程式:

int g(int x){  return x + 6;} int f(int x){  return g(x);} int main(void){  return f(5) + 2;}

使用下面命令反組譯碼c程式得到組譯工具

gcc –S –o main.s main.c -m32

首先從main函數開始分析,可以發現每個函數中前兩步都是將原來的ebp值壓棧,並將ebp與esp對齊以為一段新的函數準備堆棧空間。

然後main中將數字5存入了esp中,再調用函數f,call f時會將eip值(call的下一條指令地址)壓入棧中。

跳到f函數後也是先將ebp壓棧,並對其ebp esp。而後將ebp地址加8的記憶體空間中的值(ebp指向4 也就是將2中的值5)傳給eax.以上其實就是完成了從main函數中將參數5傳給

函數f,然後參數5也被存入棧中。繼而調用函數g。

g的前3步也是完成了將ebp壓棧 ,對齊,將參數傳給eax等操作。而後則執行g函數將x+6.至此上面堆棧的左部分分析完畢。

下面執行pop %ebp彈出ebp然後再ret 則讓ebp esp恢複成了call g之前的狀態,同時eip則指向了第15行也就是leave,

leave起到的作用是將ebp ,esp之間的堆棧空間清除,而後再pop ebp ,ret則跟上面一樣,這倆步完成後esp ebp又回到了調用f之前的狀態。

程式返回到main中的第23行繼續執行。

 

從上面簡單的分析我們可以看出。當我們的電腦運行程式時,程式與資料存放區在記憶體空間之中,電腦根據ip中值按序執行程式。而同時記憶體中開闢堆棧空間儲存各種資料,通過幾個常用寄存器的協同工作,資料在記憶體空間與寄存器中傳遞來實現資料的運算與儲存。同時ip值儲存在堆棧中的概念,則讓程式可以非順序的執行。

這種儲存程式電腦的運行方式使我們的cpu和記憶體協同工作,記憶體儲存資料和指令,cpu則進行解析、運算。這樣將程式和運算有機的結合在了一起,讓現代電腦得以高效的運行。

 

陳浩 + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

從彙編看電腦的工作過程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.