INVOKE ADDR PROC PROTO

INVOKE ADDR PROC PROTO

INVOKE 过程名[,参数列表]


eg:
	push TYPE array
	push LENGTHOF array
	push OFFSET array
	call DumpArray

	等价于:
	INVOKE DumpArray,OFFSET array,LENGTHOF array,TYPE array



ADDR
ADDR操作符可在使用INVOKE调用过程的时候传递指针参数
例如:下面的INVOKE语句向FillArray过程传递myArray的地址
INVOKE FillArray,ADDR myArray
通过ADDR操作符传递的参数必须是一个汇编时的常量



PROC
格式:
标号 PROC [属性] [USES 寄存器列表],参数列表

eg:
AddTwo PROC,
	val1:DWORD,
	val2:DWORD
	mov eax,val1
	add eax,val2
	ret
AddTwo ENDP
汇编后如下:
AddTwo PROC
	push ebp
	mov ebp,esp
	mov eax,dword ptr [ebp+8]
	add eax,dword ptr [ebp+0Ch]
	leave
	ret 8
AddTwo ENDP






PROTO  伪指令可以帮助汇编器对比过程定义和过程调用的参数列表是否一致
但检查不如c++严格 masm检查过程掉哦那个的参数数目是否正确并对参数的类型进行有限的匹配检查

假设sub1原型如下 
Sub1 PROTO,p1:BYTE,p2:WORD,P3:PTR BYTE
定义如下变量
.data
byte_1 BYTE 10h
word_1 WORD 2000h
word_2 WORD 3000h
dword_1 DWORD 12345678h
下面是有效的调用
INVOKE Sub1,byte_1,word_1,ADDR byte_1
masm位这条INVOKE语句生成的代码
push 404000h
sub esp,2
push word ptr ds:[00404001h]
mov al,byte ptr ds:[00404000h]
push eax
call 00401071
masm检测不到错误情况:实际参数小雨声明的参数的尺寸,masm不会产生错误


eg:
ArraySum PROC  USES esi ecx,
	ptrArray:PTR DWORD,
	szArray:DWORD

	mov esi,ptrArray
	mov ecx,szArray
	mov eax,0
	cmp ecx,0
	je L2
L1:	
	add eax,[esi]
	add esi,4
	loop L1
L2:		
	ret
ArraySum endp

invoke 调用ArraySum向过程传递了数组的地址以及数组中元素的数目:

.data
array DWORD 10000h,20000h,30000h,40000h,50000h
theSum DWORD ?
.code
main PROC
	INVOKE ArraySum,
		ADDR array,
		LENGTHOF array
	mov theSum,eax





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值