C/C++ 调用规则

news2024/11/28 8:30:50

平栈:清理参数

对调用栈的操作步骤:

  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:平栈,然后切换到返回地址,继续执行

内存分布图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hadoop简介

文章目录1:hadoop简介2:Hadoop系统2.1:hadoop架构1:MapReduce2:YARN架构3:HDFS2.2:HDFS、YARN、MapReduce三者关系1:hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础…

如何快速删除CSV、Excel、Markdown表格的重复行?

如果你正在使用 CSV、Excel 或 Markdown 表格,你可能会遇到重复行的问题。这可能是因为你手动输入了重复的数据,或者是因为你从其他源导入了重复的数据。无论原因是什么,删除重复行是一项重要的数据清理任务。本文将向你展示如何使用几种不同…

RESTful的风格提倡 URL 地址使用统一的风格设计

RESTful概念实现REST:Representational State Transfer,表现层资源状态转移。资源:资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。资源的表述资源的表…

nnUNet 训练 AMOS22数据集 Task216(抽丝剥茧指令+原理篇)

环境准备篇 安装hiddenlayer(用来生成什么网络拓扑图?管他呢,装吧) pip install --upgrade githttps://github.com/nanohanno/hiddenlayer.gitbugfix/get_trace_graph#egghiddenlayer 安装环境,由于服务器已经装好py…

网络安全日益严峻下计算机主机加固的意义

​ 近年来,计算机以及互联网应用在中国得到普及和发展,已经深入到社会每个角落,政府,经济,军事,社会,文化和人们生活等各方面都越来越依赖于计算机和网络,电子政务,无纸办…

【计算机体系结构】指令集体系结构、微体系结构简介

1. “虚拟” to “现实” 首先可以看这张图片,下面的 Physics 所指的是我们的物理世界中看得见摸得到或者是客观存在的事物,而人类希望将自己的工作内容或者需求以某种方式映射到物理层面上,用物理变化带来的影响来完成人类工作内容。例如早期…

《Linux Shell脚本攻略》学习笔记-第二章

2.1 简介 本章将为你介绍一些最值得关注同时也是最实用的命令。 2.2 用cat进行拼接 cat命令能够显示或者拼接文件内容。cat能够将标准输入数据与文件数据组合在一起。 通常的做法是将stdin重定向到一个文件,然后再合并两个文件。而cat命令一次就能搞定这些操作。 1&…

【Linux】基础常见指令

目录​​​​​​​ 前言 一、Linux的环境搭建与远程控制 Linux 环境的搭建方式主要有三种 使用 XShell 远程登陆到 Linux 二、常见指令 1. ls 指令 2. pwd命令 3. cd 指令 4. touch指令 5. mkdir指令 6. rmdir指令 && rm 指令 7. man指令 8. cp指令 9. mv指令 10.…

【微信小程序】实用教程02-添加全局页面配置、页面、底部导航

开始前,请先完成项目创建,详见 【微信小程序】实用教程01-注册登录账号,获取 AppID、下载安装开发工具、创建项目、上传体验 前期准备 因我们的项目是根据模板创建的,需先清理掉无效的页面代码,具体操作方式如下&…

LeetCode 64. 最小路径和

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 64. 最小路径和,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode 64…

【Redis】使用阻塞队列+Redis优化秒杀业务

【Redis】使用阻塞队列Redis优化秒杀业务 文章目录【Redis】使用阻塞队列Redis优化秒杀业务1. 为什么要优化2. 怎么优化2.1 查询优惠卷2.2 判断秒杀库存2.3 校验一人一单2.4 减库存2.5 创建订单2.6 保证redis操作的原子性3. 确认优化方案4. 实现优化方案4.1 编写lua脚本4.2 定义…

jvm系列(3)--运行时数据区Runtime

目录运行时数据区概述及线程前言运行时数据区结构运行时数据区与内存线程的内存空间Runtime类线程JVM 线程JVM 系统线程程序计数器(PC寄存器)PC寄存器介绍PC寄存器的作用举例两个面试题CPU 时间片本地方法接口本地方法举例为什么要使用 Native Method?与Java环境外交…

Tomcat打破双亲委派模型

tomcat的类加载器结构tomcat的类加载(loadClass)过程和原本的双亲委派模型思路差不多,先看有没有加载过。先在本地 Cache 查找该类是否已经加载过,也就是说 Tomcat 的类加载器是否已经加载过这个类。如果 Tomcat 类加载器没有加载…

【学习笔记】【Pytorch】张量(Tensor)的基础操作

【学习笔记】【Pytorch】张量(Tensor)的基础操作一、创建张量1.使用数据创建张量2.无需数据的创建选项3.torch.Tensor与torch.tensor的区别4.PyTorch中张量的创建方法的选择二、张量的属性1.张量的 torch.dtype2.张量的 torch.device3.张量的 torch.layo…

阿维塔冲击年10万台订单,第二款车型Q2发布

1月13日,阿维塔科技在重庆总部召开渠道合作伙伴大会。今年,阿维塔计划推出: •阿维塔11后驱版本 •并发布第二款产品,代号E12,定位中大型轿车。阿维塔今年计划冲击10万辆订单目标。在当前CHN平台的基础上,阿…

Openresty记录笔记

最近由于项目需要学习了安全代理的相关知识,其实刚开始的时候是非常需要一个入门的介绍,大概说明下这个到底是个什么东西,能干啥,简单的原理是什么,为此我记录下我看完用完的心得,记录成笔记。 一般我们代码…

Redis 持久化详解

目录一、简介二、RDB持久化2.1、SAVE2.2、BGSAVE2.3、SAVE选项2.4、RDB文件结构2.5、RDB文件载入三、AOF持久化3.1、开启AOF功能3.2、配置AOF文件的冲洗频率3.3、AOF重写3.3.1、BGREWRITEAOF命令(手动)3.3.2、AOF重写配置选项(自动&#xff0…

Android | Service

Android Service Service 概念 实现程序后台运行的解决方案,一种可在后台执行长时间运行操作而不提供界面的应用组件。Service 的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,Service 仍然能…

Vue3——第十五章(计算属性:computed)

一、基础示例 模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。推荐使用计算属性来描述依赖响应式状态的复杂逻辑。 在这里定义了一个计算属性 publishedBooksMessage。computed() 方…

【设计模式】创建型模式·原型模式

设计模式学习之旅(五) 查看更多可关注后查看主页设计模式DayToDay专栏 一. 概述 用一个已经创建的实例作为原型,通过复制(克隆)该原型对象来创建一个和原型对象相同的新对象。 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现…