基于Win64的Masm64函数设计

基于Win64的Masm64函数设计

在Win64的API中,函数调用方法非常灵活,所以用户自己编写的函数也应该符合这种要求,特别是编写库函数,如果不符要求,则会给使用者带来很多麻烦。

在Masm64中,调用函数基本方法为以下3种:

(1) Invoke 宏。这是一个完整的自动化调用宏,可以调用任何函数,但编译器处理的速度也是最慢的,不过没什么关系。要注意的是,如果将寄存器RAX作为参数,则只能用在前4个参数中。
(2) rcall 宏。如果函数的参数不超过4个,则可使用该宏调用。这个宏自动化程度比较低,不支持引号表示的文本,也不支持ADDR操作符,其他与Invoke宏的要求相同。编译器处理该宏的速度比较快。
(3) call 指令。使用指令来调用函数,需要调用者自己处理全部参数,如果参数个数少且为整数类参数,则是非常快速的。

这三种调用方法都遵从一条约定,即前4个参数分别由寄存器RCX、RDX、R8、R9来传递,不放入栈单元,但即保留了栈单元空间。但另一方面,每个函数在创建默认栈帧时,会根据情况来处理前4个参数:当函数有参数名时,将前4个参数置入对应的栈单元中;当函数无参数名时,不处理前4个参数。而我们并不一定总是使用默认栈帧,因此在编写函数时常会造成失误,所以有必要建立一些函数模型,以避免错误的发生。

以下为五种常用的函数形式。

1. 通用函数形式

MyFunction1 proc arg1:QWORD,arg2:QWORD,arg3:QWORD,arg4:QWORD,arg5:QWORD
LOCAL ss_a1:QWORD
LOCAL ss_a2:QWORD
; ......
ret
MyFunction1 endp

(1)这种函数形式与Masm32函数形式相同,所不同的是在Masm64中他是通过默认栈帧构建宏来实施的,所以必须要包含STACKFRAME宏。一般我们会使用Masm64系统预制的包含文件masm64rt.inc,该文件中已包含了STACKFRAME宏。如果你自己定制包含文件(*.inc),则也必须添加STACKFRAME宏。STACKFRAME宏是被编译器调用的(见《masm64栈帧结构的详解》)。
(2)这种函数形式的参数个数可以超过4个,也可以不用参数;局部变量根据需要来设置。
(3)可以使用任何一种调用方式。如果使用call指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值