Win32 API的调用
参考《Microsoft Win32 Programmer's Reference》
____________________________________________________________________
例如调用messagebox
原型如下MessageBox proto hwnd:dword,lptext:dword,lpCaption:dword,uType:dword
(MessageBox proto :dword,:dword,:dword,:dword 效果同上)
调用:
push uType
push lpCaption
push lpText
push hWnd
call MessageBox
简单的invoke语句
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
如果参数数量和声明不符,会报错
error A2137:too few arguments to INVOKE
返回值在EAX中,如果EAX无法容纳,则EAX中是一个缓冲区地址.
_____________________________________________________________________
MASM关于标号@@
_____________________________________________________________________
防止过多的标号起名代来不便可以用@@,@F,@B来控制
cmp flag,1
jz @F
mov cx,1000h
@@:
…
loop @B
@F是向后跳,@B是向前跳,他们只找到最近的@@,所以最好@@与跳转指令的距离限制在同一屏
______________________________________________________________________
MASM的伪指令assume
______________________________________________________________________
mov esi,offset stWndClass
assume esi:ptr WNDCLASS
mov eax,[esi].lpfnwndproc
……
assume esi:nothing
______________________________________________________________________
MASM获区变量地址
______________________________________________________________________
对于全局变量
mov 寄存器,offset 变量名
对于局部变量
lea eax,[ebp-4]
但是无法在invoke中用,所以有这个addr伪指令
addr 局部变量或全局变量
只能用在invoke中
invoke test,eax,addr szHello
;反编译后
lea eax,[ebp-4]
push eax ;参数2 addr szHello
push eax ;参数1 eax
call test
可以看出参数1的eax被覆盖了,所以在invoke中用到addr时,左侧不能用到eax
不小心用到了MASM会报错: error A2133:register value overwritten by INVOKE
_____________________________________________________________________
关于变量和函数的命名
_____________________________________________________________________
"匈牙利表示法"格式是类型前缀加上变量的说明.
b 表示 byte
w 表示 word
dw 表示dword
h 表示句柄
lp 表示指针
sz 表示以0结尾的字符串
lpsz 表示以0结尾的字符串的指针
f 表示浮点数
st 表示一个数据结构
例:
hWinMain 主窗口句柄
dwTimeCount 时间计数器,以双字定义
_____________________________________________________________________