通过反汇编helloworld对话框来看invoke伪指令
invoke是调用WinAPI的伪指令
把上一个helloworld对话框编译并连接成hello.exe然后用OD打开得到下图
前文说过ML.EXE编译invoke时会把invoke的参数PUSH入栈和一个CALL,在代码段中只有两个invoke指令
invoke MessageBox,NULL,offset messageS,offset titleS,MB_OK
invoke ExitProcess,NULL
OD反汇编出invoke指令:
push 0 ;MB_OK的数值为 0H
push 00403000 ;titleS字符串的地址
push 0040300f ;messageS字符串的地址
push 0 ;NULL
call <jmp.&user32.MessageBoxA>;从OD看出 MessageBoxA的地址为0040101A
;编译器编译出会把MessageBoxA编译为目标地址
;相当于call 0040101A
push 0 ;ExitProcess函数的参数
call <jmp.&kernel32.ExitProcess>
在OD中F8执行到call前看到栈中数据
invoke MessageBox,NULL,offset messageS,offset titleS,MB_OK
最先入栈的是MB_OK然后参数依次入栈
F8单步执行 最后按下按钮"确定" EAX寄存器保存返回值 1H(表示按下了确定按钮)
总结:刚学WIn32和OD,有不正确的还请大家指教,
为了调用函数的方便MASM提供了一个invoke伪指令当编译器遇到这个伪指令时会把此伪指令所调用的函数的参数依次压入栈中并CALL函数.