Naked
 
编写没有prolog / epilog代码的函数

语法

{Sub | Function} identifier Naked [calling_convention ] ( param_list ) [As data_type ]
asm_statements
End {Sub | Function}

参数

identifier - 程序的名称。
calling_convention - 程序的调用约定可以是cdeclpascalstdcall
asm_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差别

  • 新的FreeBASIC

参考