本文主要是介绍汇编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中的规则一模一样)
- 函数定义语句和proto一样,写完函数体代码之后需要以
三、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,100hmov edx,eax
main_proc ENDP;------------------------------------------------------
;函数定义,实现简单功能 返回 arg1 + arg2 的值
Asm_Function_1 PROC stdcall arg1:dword,arg2:dwordmov eax,arg1add eax,arg2ret 8
Asm_Function_1 endpEND
这篇关于汇编proto、proc、invoke伪指令与函数声明、函数定义、函数调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!