x64汇编fastcall调用约定

x64汇编环境:只需要在x86基础上对项目属性进行设置,将平台设置为所有平台;

以及在将debug改为x64模式即可:

后续写完代码直接生成项目再使用本地调试器进行运行即可。

fastcall调用约定

在x64架构下,fastcall调用约定是默认的调用约定。它旨在通过寄存器传递参数以提高调用效率。以下是详细的理论说明,涵盖了参数传递、返回值处理、栈管理和寄存器保存规则。

参数传递规则

前四个整数或指针参数通过以下寄存器传递:

  • 第一个参数:RCX

  • 第二个参数:RDX

  • 第三个参数:R8

  • 第四个参数:R9

超过四个的参数通过栈传递,从右到左的顺序依次入栈;即当参数数量超过四个时,第五个及之后的参数按照从右到左的顺序依次压入栈中。

假设有一个函数foo,定义如下:

void foo(int a, int b, int c, int d, int e, int f, int g);

在调用foo(1, 2, 3, 4, 5, 6, 7)时,参数传递顺序如下:

前四个参数通过寄存器传递

  • a(1)传递到RCX

  • b(2)传递到RDX

  • c(3)传递到R8

  • d(4)传递到R9

剩余的参数通过栈传递

  • e(5)

  • f(6)

  • g(7)

在栈中,参数按照从右到左的顺序依次压入栈中,即最右边的参数(g)最先压入栈,接着是f,最后是e。这样,在栈中的顺序如下(从栈顶到栈底):

栈顶 -> g (7)
        f (6)
        e (5)
栈底

简单的使用示例

段代码用MASM(Microsoft Assembler)编写的x64汇编代码,包含两个过程(proc):myaddmain;它们实现了一个简单的加法操作,myadd将接收的多个参数相加,而main负责设置这些参数并调用myadd

.code
myadd proc
    xor rax,rax
    add rax,qword ptr [rsp + 30h]
    add rax,qword ptr [rsp + 28h]
    add rax,r9
    add rax,r8
    add rax,rdx
    add rax,rcx
    ret
myadd endp
​
main proc
    sub rsp,28h
    mov qword ptr [rsp + 28h],6
    mov qword ptr [rsp + 20h],5
    mov r9,4
    mov r8,3
    mov rdx,2
    mov rcx,1
    call myadd
    add rsp,28h
    ret
main endp
end
代码解释
①main过程

main过程负责设置参数并调用myadd过程:

调整栈指针

  • sub rsp, 28h:调整栈指针,预留40字节(0x28)的栈空间,以对齐栈并为局部变量提供空间。

设置额外参数

  • mov qword ptr [rsp + 28h], 6:将第6个参数6保存到栈上的位置[rsp + 28h]

  • mov qword ptr [rsp + 20h], 5:将第5个参数5保存到栈上的位置[rsp + 20h]

设置寄存器参数

  • mov r9, 4:将第4个参数4存储到r9寄存器。

  • mov r8, 3:将第3个参数3存储到r8寄存器。

  • mov rdx, 2:将第2个参数2存储到rdx寄存器。

  • mov rcx, 1:将第1个参数1存储到rcx寄存器。

调用myadd过程

  • call myadd:调用myadd过程,结果将存储在rax寄存器中。

恢复栈指针

  • add rsp, 28h:恢复栈指针到调用sub rsp, 28h之前的状态。

返回

  • ret:返回,结束程序。

②myadd过程

myadd过程从寄存器和栈中读取6个参数,并将它们相加。具体步骤如下:

初始化累加器

  • xor rax, rax:将rax寄存器清零,作为累加器。

执行加法操作

  • add rax, qword ptr [rsp + 30h]:将参数6(存储在[rsp + 30h])加到rax中。

  • add rax, qword ptr [rsp + 28h]:将参数5(存储在[rsp + 28h])加到rax中。

  • add rax, r9:将参数4(存储在r9寄存器中)加到rax中。

  • add rax, r8:将参数3(存储在r8寄存器中)加到rax中。

  • add rax, rdx:将参数2(存储在rdx寄存器中)加到rax中。

  • add rax, rcx:将参数1(存储在rcx寄存器中)加到rax中。

返回

  • ret:返回,rax寄存器中的结果作为函数返回值。

程序执行结果:

最后RAX寄存器中的值为15h转化为10进制就是21。

x64dbg查看堆栈变化

使用x64dbg进行调试;将程序拖进x64dbg程序中,以下是x64dbg进行调试的四个区域窗口,分别是反汇编、寄存器、内存和堆栈窗口。

刚进来显示的是ntdll.dll的反汇编调试信息,ntdll.dll是Windows操作系统中的一个重要动态链接库(DLL),其全称是NT Layer DLL;这个库包含了许多核心的系统服务和API,直接与Windows NT内核交互。此时要想调试自己的程序可以按下f9单步跳过。

转到自身程序后可以看到两个jmp跳转指令,一个是跳转程序中的入口main,另一个是跳转至自定义过程myadd,接着可以按下f7步进继续执行下一步(f7或者f8需要根据自身x64dbg程序的设置使用),进入main入口点,运行指令。

sub rsp,28h
mov qword ptr [rsp + 28h],6
mov qword ptr [rsp + 20h],5
...
寄存器赋值
...
call myadd

接着往下执行,此时我们对rsp进行查看;转到RSP(查看当前栈顶指针的情况);双击堆栈区并且在堆栈区右击,选择转到rsp即可查看当前rsp的情况:

sub rsp, 28h:调整栈指针,预留40字节(0x28)的栈空间,以对齐栈并为局部变量提供空间;运行此步此时RSP应该在$-28位置,

mov qword ptr [rsp + 28h], 6:将第6个参数6保存到栈上的位置[rsp + 28h]

mov qword ptr [rsp + 20h], 5:将第5个参数5保存到栈上的位置[rsp + 20h]

call myadd:调用myadd过程,结果将存储在rax寄存器中,至此因为使用了call命令,则此时会将函数的返回地址也压入栈内,所以此时RSP在$-30的位置。

继续往下运行进入myadd过程:

xor rax, rax:将rax寄存器清零,作为累加器。

add rax, qword ptr [rsp + 30h]:将参数6(存储在[rsp + 30h])加到rax中。

add rax, qword ptr [rsp + 28h]:将参数5(存储在[rsp + 28h])加到rax中。

...

将rcx、rdx、r8、r9寄存器中的值加入rax中

...

得到最后的结果:

接着进行函数返回,回到入口过程中继续运行;

add rsp, 28h:恢复栈指针到调用sub rsp, 28h之前的状态,此时RSP回到最初的位置。

至此dbg结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android倒计时封装(活动进入后台,倒计时依然能正常计时)

public class TimeUtils { /倒计时时长 单位:秒/ public static int COUNT 20*60; /当前做/ private static int CURR_COUNT 0; /预计结束的时间/ private static long TIME_END 0; /计时器/ private static Timer countdownTimer; /显示倒计时的textVi…

大数据学习-大数据介绍

意义 从海量的数据中分析出海量数据背后的价值 需要分析海量的数据,就需要存储、计算和分析 那就需要分布式多台计算机合适的工具来处理数据 工具 特点 大数据的核心工作:从海量的、高增长的、多类别的、信息密度低的数据中挖掘出高质量的结果 数据存储…

STM32通过SPI软件读写W25Q64

文章目录 1. W25Q64 2. 硬件电路 3. W25Q64框架图 4. 软件/硬件波形对比 5. 代码实现 5.1 MyI2C.c 5.2 MyI2C.h 5.3 W25Q64.c 5.4 W25Q64.h 5.5 W25Q64_Ins.h 5.6 main.c 1. W25Q64 对于SPI通信和W25Q64的详细解析可以看下面这篇文章 STM32单片机SPI通信详解-CSDN博…

开发中遇到的一个bug

遇到的报错信息是这样的: java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [hm-api,hm-common,hm-service] are excluded from annotation processing 翻译过来就是存在循环引用的情况,导…

C++进阶之AVL树

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.插入 三.旋转 3.1右旋 …

postman国内外竞争者及使用详解分析

一、postman简介 Postman 是一款广泛使用的 API 开发和测试工具,适用于开发人员和测试人员。它提供了一个直观的界面,用于发送 HTTP 请求、查看响应、创建和管理 API 测试用例,以及自动化 API 测试工作流程。以下是 Postman 的主要功能和特点…

Docker常用操作和命令

文章目录 1、卸载旧版本 2、yum安装Docker CE(社区版) 3、添加镜像加速器 4、docker --version 查看docker版本 5、docker info 或 docker system info 显示 Docker 系统的详细信息,包括容器、镜像、网络等 6、docker search 搜索镜像 …

JVM类加载器与双亲委派机制

通过上一篇Java的类加载机制相信大家已经搞明白了整个类加载从触发时机,接着我们就来看下类加载器,因为类加载机制是有加载器实现的。 类加载器的分类 启动类加载器 Bootstrap ClassLoader 是 Java 虚拟机(JVM)的一部分&#x…

C#调用OpenCvSharp实现图像的直方图均衡化

本文学习基于OpenCvSharp的直方图均衡化处理方式,并使用SkiaSharp绘制相关图形。直方图均衡化是一种图像处理方法,针对偏亮或偏暗的图像,通过调整图像的像素值来增强图像对比度,详细原理及介绍见参考文献1-4。   直方图均衡化第…

【中学教资科目二】02中学课程

02中学课程 第一节 课程概述1.1 课程的分类 第二节 课程组织2.1 课程内容的文本表现形式2.2 课程评价 第三节 基础教育课程改革3.1 基础教育改革的目标3.2 新课改的课程结构 第一节 课程概述 1.1 课程的分类 学校课程有多种类型,其中最利于学生系统掌握人类所取得的…

多维表格/业务库表格大数据量性能瓶颈

先说最终结论:Angular 组件创建性能损耗是当下主要的性能瓶颈 理由: 基于以往编辑器性能优化的经验,编辑器在动态渲染内容时会创建很多壳子组件(也就是Angular 组件),排查的时候就发现如果略这些壳子组件性…

mysql--安装跳过验证修改密码安全加固

安装mysql 配置mysql的yum源 [rootVM-0-14-rockylinux ~]# tee /etc/yum.repos.d/mysql.repo << EOF > [MYSQL] > namemysql > baseurlhttps://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64 > gpgcheck0 > EOF yum安装mysq…

海南聚广众达电子商务咨询有限公司抖音电商新标杆

在数字经济的浪潮中&#xff0c;抖音电商正成为一股不可忽视的力量。海南聚广众达电子商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领军企业&#xff0c;凭借其专业的团队和创新的思维&#xff0c;不断助力商家在抖音平台上实现商业价值的最大化。 海南聚广众达电子…

【ai】tx2-nx:Yolo V4 直接安装与 测试

Yolo V4环境搭建 git clone https://github.com/AlexeyAB/darknet.gitcuda版本和路径也要改成我们的实际版本和路径,否则会编译失败 编译 sudo make nvidia@tx2-nx:~/twork/02_yolov4/darknet$ vi Makefile nvidia@tx2-nx:~/twork/02_yolov4/darknet$ sudo make [sudo

众爱宠物开源项目介绍

众爱宠物管理系统是一个集会员管理、宠物管理、商品管理、库存管理、数据管理、收银管理、多门店管理等功能于一体的综合管理系统&#xff0c;具有操作方便、简单、安全等优点。 开源项目地址

数学建模系列(3/4):典型建模方法

目录 引言 1. 回归分析 1.1 线性回归 基本概念 Matlab实现 1.2 多元回归 基本概念 Matlab实现 1.3 非线性回归 基本概念 Matlab实现 2. 时间序列分析 2.1 时间序列的基本概念 2.2 移动平均 基本概念 Matlab实现 2.3 指数平滑 基本概念 Matlab实现 2.4 ARIM…

Android修行手册-ImageView的adjustViewBounds和设置透明度

点击跳转>GameFramework文档系列&#xff08;二&#xff09;- 场景相关 点击跳转>GameFramework文档系列&#xff08;三&#xff09;- 日志管理和UI 点击跳转>GameFramework文档系列&#xff08;四&#xff09;- 事件订阅 点击跳转>保姆式Cocos合成大西瓜案例 …

HarmonyOS Next 系列之可移动悬浮按钮实现(六)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

基于强化学习的目标跟踪论文合集

文章目录 2020UAV Maneuvering Target Tracking in Uncertain Environments Based on Deep Reinforcement Learning and Meta-LearningUAV Target Tracking in Urban Environments Using Deep Reinforcement Learning 2021Research on Vehicle Dispatch Problem Based on Kuhn-…

BGP路由反射器实验

实验内容&#xff1a; 通过本实验验证bgp路由反射器的规则 1. 从client收到的路由更新&#xff0c;反射到non-client和client&#xff0c;同时发送给EBGP邻居 2. 从non-client收到的路由更新&#xff0c;只反射到client&#xff0c;同时发送给EBGP邻居 3. 从EBGP邻居收到的路…