通过汇编程序分析函数调用

《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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值