函数堆栈调用

函数堆栈调用(1,6)

思考:
1,形参开不开辟内存?(开辟,)
2,函数调用完成,系统怎么回退到调用方函数?(压ebp时候是main的)
3,函数调用完成,栈帧回退后,系统怎么沿着下一行继续进行?(call指令下一地址压栈)

寄存器:
eax ebx ecx edx——>存储数据
ebp:栈底指针寄存器
esp:栈顶指针寄存器
pc:下一行指令寄存器(老版)
汇编
Windows :操作码看完,从右往左看(Linux:操作码看完,从左往右看)
用WIndows:
移植指令:mov dword prt[a],0ah(将10放在a对应的地址空间4个字节)
移地址:lea eax,[a];(将a的地址放在eax寄存器)
压栈:push eax;(将eax寄存器的数值放在栈顶,再往下跑4个字节)
出栈:pop eax;(栈顶出栈再放到eax)
累加:add eax,0Ah;(eax+=10;)
累减:sub eax,0Ah; (eax-=10;)
在这里插入图片描述
main函数

在这里插入图片描述
进入Sum
在这里插入图片描述
将实参自右向左依次传递
思考:实参的传递为什么自右向左?----自右向左,可变参参数(从左至右不知道需要几个形参,开辟空间麻烦)

call:1,将下一行指令地址压栈。2,jmp跳转到被用方函数
在这里插入图片描述

开栈
1,实参压栈
2,下一行指令地址压栈(call指令下一行指令压栈,回退时候接着执行)
3,调用方栈底地址压栈(方便清理后回退)
4,被调用方预留空间并作cccccccc的初始化
在这里插入图片描述

清栈
1,清理被调用方预留的活动空间
2,出栈调用方栈底地址
3,出栈下一行指令地址
4,清理形参

总结

main

1,ebp和esp开辟栈帧
2,给表达式的值放在对应的内存空间(inta=10)
3,函数调用
——>a,实参入栈,自右向左(初始化的过程)
——>b,下一行指令地址入栈(call的下行指令地址,jum跳转Sum)

Sum

开栈
1,main栈顶地址压栈(main ebp),ebp和esp指向同一位置
2,预留空间并作cccccccc初始化
3,被调用方局部处理(预留空间内分配)
清栈
1,清理被调用方预留的活动空间
2,出栈调用方栈底地址
3,出栈下一行指令地址
4,清理形参

返回值

非类类型的返回值
第一种
<=4 eax
第二种
4> &&<8 eax edx
第三种
>8 临时量
一,调用约定
1,cdecl (C语言标志调用约定)
2,stdcall (Windows标志调用约定)
3,fastcall (快速调用约定)
4,thiscall (类成员方法的调用约定)

不同调用约定,约定什么不同?
1,约定了函数的符号生成规则
2,约定的函数调用时,实参入栈顺序(自左向右)
3,约定了形参的开辟和清理方式不同
cdecl 调用方开辟 调用方清理
stdcall 调用方开辟 被调用方清理
fastcall 前面寄存器带入 后面参数和stdcall处理一样
C/C++
内置类型:int char short long double *
自定义类型: struct class

注意

一,实参入栈(形参开辟内存并赋值)
2,下一行指令地址压栈
3,调用方栈底地址压栈
4,被调用方开辟栈空间并初始化为CCCC CCCC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值