標籤:
本周學習了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
從彙編看電腦的工作過程