tgut 原创作品转载出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
编写main.c如下小程序
然后
gcc -S -o main.s main.c -m32
然后
vi main.s
看到如下代码(删除一些不相关的代码后)
下面让我们分析一下这些汇编代码:
ebp(main) |
6 |
eip23 |
ebp(f) |
6 |
eip15 |
ebp(g) |
move$6,(%esp)
call f
pushl %ebp; mov %esp, %ebp;sub $4, %esp
movl %eax,(%esp);
call g;
pushl %ebp;movl %esp,%ebp; /*eax=6
add $2, %eax; /*eax=6+2=8
注释:ebp(main),ebp(f),ebp(g)分别是各个函数的栈底指针。
下面给出一些指令的宏定义:
enter:
push %ebp;
movl %esb,%ebp;
leave:
movl %ebp,%esp;
popl %ebp;
call:
push eip
mov(函数入口地址) eip
ret:
pop eip;
addl $4,%esp ;