《linux核心分析》作業一:反彙編一個C語言程式並分析彙編程式碼執行過程
阿新 • • 發佈:2019-02-08
楊新峰原創作品轉載請註明出處 《Linux核心分析》 MOOC課程http://mooc.study.163.com/course/USTC-1000029000
實驗環境:實驗樓網站64位linux虛擬機器
原始碼如下:
int g(int x){
return x+5;
}
int f(int x){
return g(x);
}
int main(){
return f(6)+2;
}
使用
編譯並檢視彙編原始碼。
將得到的彙編原始碼中前面帶“.”符號的語句刪去,得到精簡的彙編程式碼,如下圖
這段程式碼在記憶體中的工作情況:
首先分析main函式程式碼段,假設ebp起始指向1000;
記憶體示意圖:
18:pushl %ebp ;將ebp壓棧
19:movl %esp,%ebp ;將esp的值賦給ebp
20:subl $4,%esp ;esp-4
21:movl $6,(%esp)
22:call f 相當於movl f(f標記的地址),%eip;
9:pushl %ebp
10:movl %esp,%ebp
11:subl $4,%esp
12:movl 8(%ebp),%eax
13:movl %eax,(%esp)
14:call g
2:pushl %ebp
3:movl %esp,%ebp
4:movl 8(%ebp),%eax
5:addl $5, %eax
6:popl %ebp
7:ret 相當於popl %eip
15:leave 相當於movl %ebp,%esp; popl %ebp;
16:ret
23:addl $2, %eax
24:leave
25:ret