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

  • 32
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值