5. 函数调用过程汇编分析

函数调用约定

image.png

__cdecl 调用方式

image.png

__stdcall 调用方式

image.png

__fastcall 调用方式

image.png

函数调用栈帧分析

image.png

补充说明

  1. 不同的编译器实现不一样,上述情况只是VC++6.0的编译实现
  2. 即便是在同一个编译器,开启优化和关闭优化也不一样
  3. 即便是同一个编译器同一种模式,32位和64位下情况也会不一样

fastcall 实例分析

[[gnu::fastcall]] int fun1(int a, int b, int c, int d) {return a * a + b * b + 2 * a * b + c + d;
}
int main() {int c = fun1(3, 4, 5, 6);return 0;
}
#!/bin/bash
set -ex/mnt/e/code/llvm-project/build/bin/clang fastcallTest.c -o fastcallTest -O0 -g -m32 -c
# 编译生成汇编代码
objdump -dS fastcallTest &> fastcallTest.asm
# sudo apt-get install -y build-essential module-assistant  
# sudo apt-get install -y gcc-multilib g++-multilib  

参考 GCC GNU 文档属性描述

fastcall
On x86-32 targets, the fastcall attribute causes the compiler to pass the first argument (if of integral type) in the register ECX and the second argument (if of integral type) in the register EDX. Subsequent and other typed arguments are passed on the stack. The called function pops the arguments off the stack. If the number of arguments is variable all arguments are pushed on the stack.

翻译: 在 x86-32 目标机上,fastcall 属性会导致编译器在寄存器 ECX 中传递第一个参数(如果是 INT 类型),在寄存器 EDX 中传递第二个参数(如果是INT类型)。后面的参数和其他类型的参数会传递到堆栈中。被调用函数将参数从堆栈中弹出。如果参数个数不固定,所有参数都会被推入堆栈。

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我在代码随想录|写代码Day12之栈-.栈理论基础,232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项

学习目标: 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 👍👍👍👍👍👍👍👍👍👍👍👍 ☆*: .。. o(≧▽≦)…

Kubernetes operator(一)client-go篇

云原生学习路线导航页(持续更新中) 本文是 Kubernetes operator学习 系列第一篇,主要对client-go进行学习,从源码阅读角度,学习client-go各个组件的实现原理、如何协同工作等参考视频:Bilibili 2022年最新k…

Centos7 设置每5分钟同步系统时间

在我们本地电脑使用的虚拟机中,经常电脑睡眠导致系统时间总是不正确,从而导致应用程序的时间不正确 下面简单操作几步,让系统定时同步远程时间 先确保同步时间的软件安装了 yum install ntp # 安装 ntp ntpdate ntp3.aliyun.com # 同步…

Vue前端环境搭建以及项目搭建

安装node.js 安装node.js主要是为了安装npm工具,用于管理js包等,类似于java的maven。 去官网下载安装。 配置新的镜像源 npm config set registry https://registry.npmmirror.com安装webpack webpack是前端项目打包工具。 命令: npm…

ATFX汇市:本周重磅经济数据前瞻(0122~0126)

ATFX汇市:本周的数据、事件重要性由高到低分别为:美国12月核心PCE物价指数年率、日本央行开年首个利率决议、加拿大央行1月份利率决议。我们来逐一分析解读: ▲ATFX图 本周五21:30, 美国商务部将公布美国12月核心PCE物价指数年率…

【修改idea推送代码的远程仓库地址】

公司部门调整,git地址变了,对于一个新手来说真的不知道从哪下手,后来整明白了怎么修改idea推送代码的远程仓库地址 第一步:打开idea中的terminal第二步:输入命令 git remote -vv(查看远程仓库的地址&#x…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

API 测试- Postman Vs Rest Assured

介绍: 创新和现代化的目标已经从简单的市场差异化转变为更有道德地追求整个社会的进步。提出了新的要求服务器端软件是持续数字中断和创新移动的结果技术。因此,服务器端编程现在必须适应笔记本电脑,智能手机和硬件平台(如 IoT&a…

肠道微生物组对卵巢衰老的影响

谷禾健康 卵巢的衰老发生在其他器官系统的衰老之前,可以看作是多个器官衰老过程的“起搏器”。随着预期寿命的延长,预防卵巢衰老已成为促进女性延长生殖功能、改善与卵巢衰老相关的骨骼和泌尿生殖系统状况的重要目标。 卵巢衰老是指卵巢功能随着年龄的增…

【Linux】第三十三站:日志

文章目录 一、实现一个简单的日志1.简介2.可变参数3.错误等级4.时间5.打印每一条参数6.与前面的一些代码搭配使用 二、完整代码 一、实现一个简单的日志 1.简介 我们运行代码的时候,我们希望有各种各样的运行时候的一些信息。这也就是日志 它一半有日志时间&…

亚信安慧AntDB全链路实时化的未来之选

近年来,随着数字化时代的到来,企业对实时数据的需求日益增长。在复杂的商业环境中,企业需要实时了解市场变化、实时响应客户需求,以保持竞争力。为了满足这一需求,亚信安慧AntDB应运而生,成为企业实时数据处…

Python 算法交易实验67 第一次迭代总结

说明 在这里对第一次迭代(2023.7~ 2024.1)进行一些回顾和总结: 回顾: 1 实现了0~1的变化2 在信息隔绝的条件下,无控制的操作,导致被套 总结: 思路可行,在春暖花开的时候&#x…