汇编语言与x64函数参数传递

news2024/11/20 15:21:58

本节课学习视频:https://pan.quark.cn/s/429055967dfd

汇编语言作为编程语言与机器语言之间的桥梁,直接反映了硬件的工作方式。在不同的操作系统和硬件架构中,函数参数的传递方式可能有所不同。今天,我们将探讨x64位环境下函数参数如何传递,并通过一些代码示例来加深理解。

x64 Calling Conventions

在x64架构下,存在两种主要的调用约定:Microsoft x64 calling convention 和 System V AMD64 ABI。这两种约定规定了如何在函数调用中传递参数,以及如何从函数返回结果。

Microsoft x64 Calling Convention

在Windows操作系统下,x64体系结构遵循Microsoft x64 calling convention。在这种约定中,前四个整数或指针参数通过寄存器​​RCX​​、​​RDX​​、​​R8​​和​​R9​​传递。如果参数多于四个,则额外的参数将通过栈传递。函数的返回值通过​​RAX​​寄存器返回。

示例代码:加法函数
; Microsoft x64 Calling Convention
; 函数将两个整数相加

section .text
global add_integers

add_integers:
    mov rax, rcx    ; 将第一个参数从 RCX 移到 RAX
    add rax, rdx    ; 将第二个参数 RDX 加到 RAX 上,结果存储在 RAX
    ret             ; 返回结果,结果在 RAX 中

System V AMD64 ABI

在Unix-like系统,例如Linux和macOS中,遵循的是System V AMD64 ABI。在这种约定中,前六个整数或指针参数通过​​RDI​​、​​RSI​​、​​RDX​​、​​RCX​​、​​R8​​和​​R9​​寄存器传递。函数返回值通过​​RAX​​传递。

示例代码:求和函数
; System V AMD64 ABI
; 函数将两个整数相加

section .text
global sum_integers

sum_integers:
    mov rax, rdi    ; 将第一个参数从 RDI 移到 RAX
    add rax, rsi    ; 将第二个参数 RSI 加到 RAX 上,结果存储在 RAX
    ret             ; 返回结果,结果在 RAX 中

浮点参数传递

对于浮点参数,不论是在Windows还是Unix-like系统,都使用​​XMM0​​到​​XMM7​​寄存器来传递前8个浮点参数。

示例代码:浮点数相加函数
; 浮点数相加,此代码适用于Windows和Unix-like系统

section .text
global add_floats

add_floats:
    movsd xmm0, xmm1    ; 将第二个参数从 XMM1 移到 XMM0
    addsd xmm0, xmm2    ; 将第三个参数 XMM2 加到 XMM0 上,结果存储在 XMM0
    ret                 ; 返回结果,结果在 XMM0 中

总结

在x64架构下,通过寄存器传递函数参数而不是通过堆栈,这种方法显著提高了函数调用的效率。微软和System V的调用约定虽然在参数传递的寄存器上有所区别,但都利用了寄存器来提供更快的参数访问和处理速度。以上的代码示例提供了在x64位环境下如何使用汇编语言进行函数参数传递的基础知识。在实际编程中,确保根据你的操作系统和工具选择正确的调用约定是至关重要的。

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

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

相关文章

KDD‘23 | AlphaMix: 高效专家混合框架(MoE)显著提高上证50选股表现

KDD23 | AlphaMix: 高效专家混合框架(MoE)显著提高上证50选股表现 原创 QuantML QuantML 2024-04-18 09:17 上海 Content 本文提出了一个名为AlphaMix的新型三阶段专家混合(Mixture-of-Experts,MoE)框架,…

c++使用spdlog库打日记

打日记 打日志的本质就是多输出,c没有自带的日志库,只能使用第三方库实现,当然,直接cout输出也可以,但是一般日志库都进行了优化,比我们使用cout输出的效率更高,同时效果也更好,这里…

正大国际:什么是庞氏骗局?

在金钱的诱惑下,人性的贪婪与恐惧交织成一张无形的网,让无数人沉迷其中,无法自拔。这其中,庞氏骗局作为一种极具欺骗性的金融诈骗手段,更是将人们的贪婪与信任利用到了极致。那么,究竟什么是庞氏骗局呢&…

1096 大美数

solution B被A整除&#xff0c;B是A的倍数。B / AA整除B A把B整除 &#xff22;被A整除 B / A >n可以整除不同的四个因数之和 等价于 (a b c d) % n 0 #include<iostream> #include<cmath> using namespace std; int main(){int k, n, t;scanf("%d&q…

基于TCC的分布式事务

优质博文&#xff1a;IT-BLOG-CN 一、分布式事务简介 分布式的架构中&#xff0c;分布式的事务是一个绕不过的挑战&#xff0c;微服务理念的流行让分布式的问题日益突出。 在公司内部&#xff0c; 笔者所接触的管理系统中实际上也存在着分布式事务。 这里假设有这三个系统&…

Redis从入门到精通(二十二)Redis原理之数据结构、网络模型、通心协议、内存回收

文章目录 第8章 Redis原理8.1 Redis数据结构8.1.1 RedisObject8.1.2 动态字符串&#xff08;SDS&#xff09;8.1.3 string8.1.4 List8.1.5 Set8.1.6 ZSet8.1.7 Hash 8.2 Redis网络模型8.2.1 五种网络模型介绍8.2.1.1 用户空间和内核空间8.2.1.2 阻塞IO8.2.1.3 非阻塞IO8.2.1.4 …

第二证券策略:股指预计维持震荡格局 关注金融、工程建设等板块

第二证券指出&#xff0c;一季度GDP同比增加5.3%&#xff0c;符合我们早前5%—5.5%的预测。边际上看&#xff0c;3月工业增加值、社零总额、出口同等比增速均显着回落&#xff0c;主要是1—2月阶段性提振因素衰退&#xff08;如闰年、集中假日、新年错位等&#xff09;以及去年…

LeetCode in Python 200. Number of islands (岛屿数量)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决&#xff0c;本文给出两种方法的代码实现。 示例&#xff1a; 图1 岛屿数量输入输出示意图 方法一&#xff1a;广度优先搜索(bfs) 代码&#xff1a; class Solution:def numIslands(self, grid):if not grid:return 0…

回应评论区剪映疑问

关于这篇文章 插件以及对应版本剪映重新打包整理&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1D2-pH1JhecGFxiTyFb6tGQ?pwd2k5n 提取码&#xff1a;2k5n 单独需要插件资源&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1NsIyfAZTO3arnBzFdNBizQ?pwdri…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT&#xff08;JSON Web Token&#xff09;和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证&#xff1a;无状态。服务器生成一个令牌&#xff0c;客户端存储该令牌并随每个请求一起提供&#xff0c;服务端仅需按照…

提取点云-------PCL

提取点云 /// <summary> /// VoxelGrid滤波下采样 /// </summary> /// <param name"cloud">需要滤波的点云</param> /// <param name"lx">三维体素栅格的x</param> /// <param name"ly">三维体素栅格…

分布式系统——全站监控

文章目录 全站监控要点**监控范围与对象****监控指标与数据****监控工具与技术****监控策略与实践****全站监控的价值** 实例展示 全站监控要点 全站监控是针对分布式架构中所有组件和服务进行全方位、多层次、实时的性能监控、状态检测和故障告警的系统化方法。在分布式环境下…

Linux系统——Zabbix监控

目录 前言 一、Zabbix概述 1.简介 2.监控原理 3.Zabbix由哪两部分组成 4.主要特点 5.运行机制 6.监控对象 7.监控模式 8.Zabbix程序 9.Zabbix架构 9.1Server-Client 9.2Server-Proxy-Client 9.3Master-Node-Client 二、Zabbix-Server安装与部署 1.环境准备 2.…

vue3的一般使用

vue3的一般使用 ** 1.子组件写模版时 可以省略props

【SpringBoot实战篇】获取用户详细信息

1 明确需求 1需要获取用户详细信息 2 接口文档 1基本信息 2请求参数 无 3 响应数据 响应数据类型&#xff1a;application/json 响应参数说明&#xff1a; 响应数据样例 3 思路分析 1用户名在请求头里获取 4 开发 4.1 控制器usercontroller GetMapping("/userInfo")p…

C/C++易错知识点(4):static修饰变量和函数

static是C/C中一个非常容易混淆的语法&#xff0c;在不同的地方针对不同的对象有不同的效果。 它在大型项目中有至关重要的作用&#xff0c;需要我们详细研究。 1.变量 所有static修饰的变量的生命周期都是自调用它起到程序结束&#xff0c;期间这些变量都只会初始化一次 ①…

yolov8实战第七天——pyqt5-yolov8实现车牌识别系统(参考论文(约7000字)+环境配置+完整部署代码+代码使用说明+训练好的模型)

基于 pyqt5-yolov8实现车牌识别系统,包括图片车牌识别,视频车牌识别,视频流车牌识别。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(视频检测,视频车辆只会添加一条记录,下文更多实际应用中的优化策略): 基于YOLOv8和PyQt5的车牌识别系统设计与…

Linux 操作系统非缓冲区的文件操作、时间编程

1、文件操作 1.1 基于缓冲区的文件操作 基于缓冲区的文件操作---高级Io 以f开头的是基于缓冲区的文件操作 printf是一个基于缓冲区的函数 输出条件&#xff1a; 1.程序正常运行 2.遇到换行\n也能输出 3.缓存区内存已满 1024大小 4.遇到fflush&#xff08;stdout&a…

【每日刷题】Day19

【每日刷题】Day19 &#x1f955;个人主义&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 2. 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 3. 63. 不同路径…

48-PCIE转串口和并口电路设计

视频链接 PCIE转串口和并口电路设计01_哔哩哔哩_bilibili PCIe转串口和并口电路设计 1、PCIe转串并口电路设计基本介绍 2、PCIe转串口和并口的方案(京东) 2.1、PCIe转串口 2.1.1、ASIX (亚信)MCS9922-PCIe转2路RS232扩展卡 2.1.2、ASIX (亚信)MCS9900-PCIe转4路RS232扩展卡…