《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
学习这门课程的一个心得 感谢实验楼提供的实验环境
来源: 实验楼
链接: https://www.shiyanlou.com/courses/195
C Code
int g(int x){
return x+12;
}
int f(int x){
return g(x);
}
int main(void){
return f(8)+1;
}
asm Code
enter 建立堆栈
pushl %ebp
movl %esp,%ebp
leave 销毁堆栈
movl %ebp,%esp
popl %ebp
ebp 堆栈底部 相对的
esp 堆栈顶部
eax 函数返回至默认使用的寄存器
g:
.LFB0:
//step 3
//enter
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax //将变量8放入eax中
addl $12, %eax // 12+8 的结果存入eax中
popl %ebp
ret //恢复f函数调用前的eip pop eip
f:
//step 2
pushl %ebp
movl %esp, %ebp
subl $4, %esp //让esp
movl 8(%ebp), %eax //将变量8 放入eax中
movl %eax, (%esp) //将eax压栈
call g //将eip 压栈 并调用函数g
leave
ret //恢复main函数调用前的eip pop eip
main:
//enter
pushl %ebp
movl %esp, %ebp
// step 1
subl $4, %esp //esp 地址减去4 存储变量8
movl $8, (%esp)
call f //esp 地址减去4 压入eip 调用函数f
addl $1, %eax //执行20+1的动作
leave
函数调用入
step 1
ebp
8
eip
step 2
ebp
eax 8
eip
step 3
ebp esp