x64汇编fastcall调用约定

news2024/11/27 22:33:09

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结束。

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

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

相关文章

html渲染的文字样式大小不统一解决方案

React Hooks 封装可粘贴图片的输入框组件(wangeditor)_react 支持图片拖拽的输入框-CSDN博客 这篇文章中的wangediter可粘贴图片的输入框,输入的文字和粘贴的文字在dangerouslySetInnerHTML渲染后出现了字体不统一的情况 在html中右键检查可…

前端 CSS 经典:flex + margin 布局

前言&#xff1a;如今我们布局大多时候都是用的 flex 布局&#xff0c;但是有时我们也可以使用 margin 小技巧去完成布局。在弹性盒中当我们把 margin 某一个方向上设置为 auto&#xff0c;他的含义是用 margin 吃掉这个方向的剩余空间。 1. 元素垂直和水平居中 <!DOCTYPE…

昇思25天学习打卡营第4天|网络构建|函数式自动微分

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 网络构建 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也…

Spring AOP实战--之优雅的统一打印web请求的出参和入参

背景介绍 由于实际项目内网开发&#xff0c;项目保密&#xff0c;因此本文以笔者自己搭建的demo做演示&#xff0c;方便大家理解。 在项目开发过程中&#xff0c;团队成员为了方便调试&#xff0c;经常会在方法的出口和入口处加上log输出&#xff0c;由于每个人的log需求和输…

svm和决策树基本知识以及模型评价以及模型保存

svm和决策树基本知识以及模型评价以及模型保存 文章目录 一、SVM1.1&#xff0c;常用属性函数 二、决策树2.1&#xff0c;常用属性函数2.2&#xff0c;决策树可视化2.3&#xff0c;决策树解释 3&#xff0c;模型评价3.1&#xff0c;方面一&#xff08;评价指标&#xff09;3.2&…

js浅拷贝和深拷贝的区别

JavaScript中的浅拷贝和深拷贝的主要区别在于它们如何处理引用类型的数据。 浅拷贝仅复制对象的引用&#xff0c;而不复制对象本身。这意味着新旧对象共享同一块内存空间。因此&#xff0c;如果修改了原始对象&#xff0c;复制的对象也会相应地改变&#xff0c;因为它们实际上是…

Webstorm vue项目@路径不能跳转到对应资源,提示Cannot find declaration to go to

Webstorm vue项目路径不能跳转到对应资源,提示Cannot find declaration to go to 我们 ctrl加鼠标左键点击方法会失效&#xff0c;看了网上很多教程在说需要在此处配置一下webpack.config.js的文件路径&#xff0c;而且指向了node_modules\vue\cli-service\webpack.config.js 我…

网络安全:Web 安全 面试题.(SQL注入)

网络安全&#xff1a;Web 安全 面试题.&#xff08;SQL注入&#xff09; 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面&#xff1a; &#xff08;1&#xff09;基础知识:包括网络基础知识、操作系…

基于PSO粒子群优化的CNN-GRU的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 CNN-GRU模型架构 4.3 CNN-GRU结合PSO的时间序列预测 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软…

Maven笔记(更新中)

一、Maven简介 Maven是一款为Java项目构建,依赖管理的工具(软件),使用Maven可以自动化构建,测试,打包和发布项目,大大提高了开发效率和质量 Maven主要作用理解 依赖管理 Maven可以管理项目的依赖,包括自动下载所需依赖库,自动下载依赖所需的依赖并且保证版本没有冲突,依赖版…

小米红米手机刷Hyper澎湃OS欧版EU教程-全球语言-完整GO框架-纯净飞速

有很多小伙伴喜欢刷小米欧版EU系统&#xff0c;EU版本由于很多base_china&#xff0c;自然稳定性来说&#xff0c;相对于别的区域来说&#xff0c;稳定真的太多&#xff0c;不会出现信号或者相机等奇奇怪怪的BUG&#xff0c;这也是我 们将欧版EU作为第一选择的原因。从界面来看…

OpenHarmony-HDF驱动框架介绍及加载过程分析

前言 HarmonyOS面向万物互联时代&#xff0c;而万物互联涉及到了大量的硬件设备&#xff0c;这些硬件的离散度很高&#xff0c;它们的性能差异与配置差异都很大&#xff0c;所以这要求使用一个更灵活、功能更强大、能耗更低的驱动框架。OpenHarmony系统HDF驱动框架采用C语言面…

综合评价 | 基于因子分析和聚类分析的节点重要度综合评价(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 综合评价 | 基于因子分析和聚类分析的节点重要度综合评价&#xff08;Matlab&#xff09; 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复基于因子分析和聚类分析的节点重要度综合评价&#xff08;Matlab…

张量 Tensor学习总结

张量 Tensor 张量是一种多线性函数&#xff0c;用于表示矢量、标量和其他张量之间的线性关系&#xff0c;其在n维空间内有n^r个分量&#xff0c;每个分量都是坐标的函数。张量在坐标变换时也会按照某些规则作线性变换&#xff0c;是一种特殊的数据结构&#xff0c;在MindSpore…

【odoo】常用的基本视图类型

概要 在Odoo中&#xff0c;有几种基本视图类型&#xff0c;每种视图类型用于不同的目的和场景。这些视图类型包括表单视图&#xff08;form view&#xff09;、树视图&#xff08;tree view&#xff09;、看板视图&#xff08;kanban view&#xff09;、图表视图&#xff08;gr…

海口注册公司代理记账的服务优势与流程解析

在海口注册公司加入代理记账服务有多种优势。代理记账公司提供专业的财务服务&#xff0c;帮助企业节约成本、提高效率&#xff0c;实现财务管理的合规性。以下是代理记账服务的主要优势和流程解析&#xff1a; https://www.9733.cn/news/detail/173.html 一、代理记账服务的…

Python酷库之旅-第三方库openpyxl(02)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

时序预测 | Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于CNN-BiLSTM-Attention多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&…

make与makefile

目录 一、make的默认目标文件与自动推导 二、不能连续make的原因 执行原理 touch .PHONY伪目标 make指令不回显 makefile多文件管理 简写依赖方法 三、回车与换行 四、缓冲区 一、make的默认目标文件与自动推导 假设这是一个makefile文件&#xff0c;make的时候默认生…

百度文心智能体,创建属于自己的智能体应用

百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&#xff0c;可以用来创建属于自己的智能体应用&#xff0c;访问官网链接&#xff1…