当前位置: 首页 > news >正文

C/C++ 调用规则

平栈:清理参数

对调用栈的操作步骤:

  1. 参数传递

三种调用约定:

  1. cdecl (C调用约定):

从右往左传参,参数通过栈传递,调用方(caller)负责平参(支持类似printf的不定参)

  1. stdcall (标准调用约定,其实是微软定义的调用约定):

从右往左传参,参数通过栈传递,被调方(callee)负责平栈(不支持不定参)

  1. fastcall (只有微软自己编译器可用的调用约定):

从右往左传参,左边两个参数通过寄存器传递,其余参数通过栈传递,被调方(callee)负责平栈(不支持不定参)

  1. 在栈顶保存返回地址

  1. 保存调用方的栈信息(栈底地址)

  1. 更新栈位置到被调方的栈底处(更新SIP栈寄存器的地址)

  1. 在栈内开辟局部变量的空间

A. 编译选项有/Zi+/Od(debug模式)时,则用0xcc填充局部变量空间

  1. 保存寄存器环境

  1. 执行函数体

  1. 恢复寄存器环境

  1. 释放局部变量空间

  1. 恢复栈信息到调用方(更新SIP栈寄存器的地址)

  1. 取出调用方的返回地址

  1. cdecl:切换到返回地址后,由调用方平栈

  1. stdcall, fastcall:平栈,然后切换到返回地址,继续执行

内存分布图:

相关文章:

  • 王爷不能撩小说/短视频seo询盘获客系统软件
  • 建设了网站怎么管理系统/今日国内新闻10则
  • 优化网站排名/快速排名工具免费
  • 简单网站建设/登封seo公司
  • 网站设计项目策划ppt/安卓优化大师旧版本
  • 上饶市住房和城乡建设局网站/上海公司排名
  • VUE: Vue3+TS的项目搭建及基础使用
  • 大数据采集技术简述
  • AtCoder Beginner Contest 285 青大蒟蒻训练日常(A-F) 上分场(可惜unr)
  • 机器学习的几个公式
  • 广告业务系统 之 敏捷交付 —— “基于 Docker 容器同机部署”
  • 简单步骤比别人抢红包快一步
  • 和涤生大数据的故事
  • 一个另类博主的辩白
  • 《Buildozer打包实战指南》第一节 在虚拟机中安装Ubuntu系统
  • c++通讯录管理系统
  • 算法记录Day49|leetcode121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
  • 项目管理平台,如何助力CMMI3-5级高效落地?