C语言函数堆栈调用过程

ebp栈底指针(寄存器)esp栈顶指针(寄存器)

栈底指针(ebp-偏移表示地址

1、函数调用先压实参(从右向左支持可变参),通过(栈底指针-偏移)把实参移到寄存器(eaxecx)再压入栈

2、call指令)先把当前栈帧下一行指令地址入栈,再跳转。

 入栈过程:

1、把调用方栈底指针(ebp)压入当前栈顶,再把调用方栈底指针(ebp)向当前栈顶指针(esp);

2、栈顶指针上移(esp-X)开辟空间;寄存器(ebx、esi、edi)入栈;把(esp)放入(edi)中;把X/4放入(ecx)中;把(0xCCCCCCCC)放入(eax)中;

3、Rep stor循环使用(0xCCCCCCC)初始化开辟空间

总结:

1、把当调用方栈底指针入栈作为当前栈底,并把主调方栈顶指向当前栈底;

2、为当前栈帧开辟空间,保存响应寄存器;

2、循环初始化已开辟的空间。

回退过程:

1、栈顶指针(esp)回退到当前栈底(ebp);

2、(pop ebp)栈顶出栈把值赋给栈底指针(ebp),即ebp指向调用方栈底;

3、ret指令 栈顶(call指令的下一行地址)出栈放入PC寄存器

汇编片段:

Push ebp //把调用方栈底指针(ebp)压入当前栈顶

Move ebp,esp //esp值赋给ebp即ebp拉倒栈顶

Sub esp,4CH //为当前函数开辟栈帧

//Ebx、esi、edi

Rep stos ebp-esp 0xCCCCCCC //初始化栈帧
 

Move esp、ebp //ebp值赋给esp即esp拉回栈底

Pop ebp //栈顶元素出栈把值赋给ebp,即ebp指向调用方栈底

Ret //栈顶(call指令的下一行地址)出栈放入PC寄存器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值