汇编proto、proc、invoke伪指令与函数声明、函数定义、函数调用

一、proto伪指令–函数声明

功能和高级语言中的函数声明一样,在代码最前面写函数声明,在后面写函数定义

  • proto伪指令的格式
    函数名 proto [距离] [语言] [参数1]:数据类型,[参数2]:数据类型,……

  • 代码示例:

    Asm_Function_1 proto stdcall arg1:dword,arg2:dword
  • 一些注意事项

    • 32位汇编不需要指定距离
    • 可以指定语言也可也不指定,直接写参数,这里的语言就是和调用约定对等的。写“C”就是cdecl调用约定,写“stdcall”就是stdcall调用约定
    • proto指令、距离、语言和参数之间用空格隔开
    • 在参数与参数之间用“,”隔开
    • 在参数与参数对应的数据类型之间用“:”隔开
    • 可以不用写参数名称,但必须要写上数据类型和“:”

二、proc伪指令–函数定义

使用proto指令用来函数声明,使用proc函数用来函数定义。使用规则和proto指令一样

  • 代码示例:

    proc stdcall arg1:dword,arg2:dword
      函数体代码块...
    Asm_Function_1 endp
  • 注意事项:

    • 函数定义语句和proto一样,写完函数体代码之后需要以[函数名] endp结束函数定义
    • 但proc和proto搭配使用时,proto可以省略参数名,但proc不能省略。(和C中的规则一模一样)

三、invoke伪指令–函数调用

使用invoke伪指令会帮你完成参数校检和压参操作,也就是说不用写压参的push指令。直接和高级语言一样直接调用函数即可

  • invoke伪指令的格式
    invoke 函数名[,参数1][,参数2]……
  • 代码示例:

    invoke  Asm_Function_1,100,0x100
  • 注意事项:
    • 函数名称和参数,参数和参数之间都用 空格 隔开

四、测试代码

.386
.MODEL FLAT, C       
.DATA

.CODE
;------------------------------------------------------
;函数声明
Asm_Function_1 proto stdcall :dword,:dword

;------------------------------------------------------
;主函数
main_proc PROC
    ;函数调用
    invoke    Asm_Function_1,100,100h
    mov        edx,eax
main_proc ENDP

;------------------------------------------------------
;函数定义,实现简单功能 返回 arg1 + arg2 的值
Asm_Function_1 PROC  stdcall arg1:dword,arg2:dword
    mov        eax,arg1
    add        eax,arg2
    ret    8
Asm_Function_1 endp

END

你可能感兴趣的:(Asm)