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
INVOKE ADDR PROC PROTO
最新推荐文章于 2021-03-13 23:17:33 发布