编写没有prolog / epilog代码的函数
语法
参数
identifier - 程序的名称。
calling_convention - 程序的调用约定可以是
cdecl,
pascal或
stdcallasm_statements - 程序体中的代码。用于处理参数和返回值的代码必须手动完成。请注意,这些方法可以改变,具体取决于
通话约定.
param_list ?? - 要传递给过程的参数。
data_type - 函数的
数据类型.
说明
Naked允许程序员编写程序,而不需要编译器生成任何序言/ epilog代码。在
Asm中编写小而快速的函数时,这并不需要任何开销,这是非常有用的。
例子
''裸体cdecl功能
Function subtract_c Naked cdecl _ ''参数按相反的声明推送到调用堆栈上
( _
ByVal a As Integer, _
ByVal b As Integer _ ''参数首先推到堆栈上
) As Integer
Asm
mov eax, dword Ptr [esp+4] ''eax = a
Sub eax, dword Ptr [esp+8] ''eax - = b
ret ''返回结果在eax
End Asm
End Function
Print subtract_c( 5, 1 ) ''5 - 1
''---------------------------------------------------------------------------------------------------------------------
''裸体功能
Function subtract_s Naked stdcall _ ''参数按相反的声明推送到调用堆栈上
_ ''称为过程负责从堆栈中删除参数
_ ''(将常量附加到RET指令,指定要释放的字节数)
( _
ByVal a As Integer, _
ByVal b As Integer _ ''参数首先推到堆栈上
) As Integer
Asm
mov eax, dword Ptr [esp+4] ''eax = a
Sub eax, dword Ptr [esp+8] ''eax - = b
ret 8 ''返回结果eax和8个字节(2个整数)释放
End Asm
End Function
Print subtract_s( 5, 1 ) ''5 - 1
''---------------------------------------------------------------------------------------------------------------------
''裸体Pascal功能
Function subtract_p Naked pascal _ ''参数以与声明相同的顺序推送到调用堆栈上
_ ''称为过程负责从堆栈中删除参数
_ ''(将常量附加到RET指令,指定要释放的字节数)
( _
ByVal a As Integer, _ ''参数首先推到堆栈上
ByVal b As Integer _
) As Integer
Asm
mov eax, dword Ptr [esp+8] ''eax = a
Sub eax, dword Ptr [esp+4] ''eax - = b
ret 8 ''返回结果eax和8个字节(2个整数)释放
End Asm
End Function
Print subtract_p( 5, 1 ) ''5 - 1
''裸体cdecl功能
''加上通过创建用户堆栈保留在asm块中的ecx寄存器
Function subtract_cp Naked cdecl _ ''参数按相反的声明推送到调用堆栈上
( _
ByVal a As Integer, _
ByVal b As Integer _ ''参数首先推到堆栈上
) As Integer
Asm
push ebp ''push ebp to stack = >esp - = 4
mov ebp, esp ''ebp = esp
''= >创建用户堆栈高于调用堆栈4个字节
push ecx ''将ecx推送到用户堆栈= >esp - = 4
mov eax, dword Ptr [(ebp+4)+4] '' eax = a (supplementary offset of +4 bytes only due to 'push ebp')
mov ecx, dword Ptr [(ebp+8)+4] '' ecx = b (supplementary offset of +4 bytes only due to 'push ebp')
Sub eax, ecx ''eax - = ecxen
pop ecx ''pop ecx从用户堆栈= >esp + = 4
mov esp, ebp ''esp = ebp
pop ebp ''pop ebp from stack = >esp + = 4
''= >丢弃用户堆栈
ret ''返回结果在eax
End Asm
End Function
Print subtract_cp( 5, 1 ) ''5 - 1
平台差异
- 默认调用约定取决于目标平台,因此最好在使用裸时明确指定预期的调用约定。
与QB差别
参考