INVOKE ADDR PROC PROTO

来源:互联网 发布:网络布线 编辑:程序博客网 时间:2024/06/06 00:51
INVOKE ADDR PROC PROTOINVOKE 过程名[,参数列表]eg:push TYPE arraypush LENGTHOF arraypush OFFSET arraycall DumpArray等价于:INVOKE DumpArray,OFFSET array,LENGTHOF array,TYPE arrayADDRADDR操作符可在使用INVOKE调用过程的时候传递指针参数例如:下面的INVOKE语句向FillArray过程传递myArray的地址INVOKE FillArray,ADDR myArray通过ADDR操作符传递的参数必须是一个汇编时的常量PROC格式:标号 PROC [属性] [USES 寄存器列表],参数列表eg:AddTwo PROC,val1:DWORD,val2:DWORDmov eax,val1add eax,val2retAddTwo ENDP汇编后如下:AddTwo PROCpush ebpmov ebp,espmov eax,dword ptr [ebp+8]add eax,dword ptr [ebp+0Ch]leaveret 8AddTwo ENDPPROTO  伪指令可以帮助汇编器对比过程定义和过程调用的参数列表是否一致但检查不如c++严格 masm检查过程掉哦那个的参数数目是否正确并对参数的类型进行有限的匹配检查假设sub1原型如下 Sub1 PROTO,p1:BYTE,p2:WORD,P3:PTR BYTE定义如下变量.databyte_1 BYTE 10hword_1 WORD 2000hword_2 WORD 3000hdword_1 DWORD 12345678h下面是有效的调用INVOKE Sub1,byte_1,word_1,ADDR byte_1masm位这条INVOKE语句生成的代码push 404000hsub esp,2push word ptr ds:[00404001h]mov al,byte ptr ds:[00404000h]push eaxcall 00401071masm检测不到错误情况:实际参数小雨声明的参数的尺寸,masm不会产生错误eg:ArraySum PROC  USES esi ecx,ptrArray:PTR DWORD,szArray:DWORDmov esi,ptrArraymov ecx,szArraymov eax,0cmp ecx,0je L2L1:add eax,[esi]add esi,4loop L1L2:retArraySum endpinvoke 调用ArraySum向过程传递了数组的地址以及数组中元素的数目:.dataarray DWORD 10000h,20000h,30000h,40000h,50000htheSum DWORD ?.codemain PROCINVOKE ArraySum,ADDR array,LENGTHOF arraymov theSum,eax

0 0