关于使用MASM的技巧

Posted by 老沙
8月 29 2008

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 时间计数器,以双字定义
_____________________________________________________________________

Trackback URL for this entry