杨新峰原创作品转载请注明出处 《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