API函数返回值的类型对汇编程序来说只有一种类型dword,返回值永远放eax寄存器,如果eax放不下这个返回值,把这个返回值内存地址放进eax,程序员说法就是指针吧!
If Unicode
MessageBox equ < MessageBoxW > ; Unicode类型
Else
MessageBox equ < MessageBoxA> ; ANSI类型
遇到和MASM的关键字同名的时候,用<>。比如include
YY Proc
Local @A:dword ,@B: word
Local @C:byte
Mov eax,@A
Mov ax,@A
Mov al,@A
Ret
YY endp
变量类型的转换与使用
Mov ax,dword ptr A
Mov ax,word ptr A
把A的类型转换成dword,就是类型加ptr
注意:前面的内容添0,要符合寄存器容量
变量的大小与数量
Sizeof查变量大小
Lengthof查变量个数(变量数组个数)
–
子程序的定义
子程序开始名proc 属性:距离 语言类型 可视区域 uses寄存器列表 参数类型
距离:内存模式
语言类型:参数的使用方式和堆栈平衡方式是stdcall,c,syscall,之类的,默认.model定义的值
可视区域:PRIVATE只对子程序模块可见,PUBLIC对所有模块可见,EXPORT导出函数,默认PUBLIC
uses寄存器列表: 编译器在子程序指令开始前自动安排push寄存器,并在ret后自动pop,开头用pushad和结尾popad,比较灵活。
参数和类型: 定义参数名的时候不能跟全局变量和子程序中局部变量重名。类型win32中的参数类型只有32位一种,可以省略
子程序结束名endp
用invoke调用子程序
用invoke调用子程序报错 err0r a2006:undefined symbol :子程序名
意思是说,invoke不知道子程序的定义所以无法进行参数的检测,
处理方法:在子程序头部用proto
-
VARARG:参数个数可以不确定,
数据结构的引用
Mov eax , stWndClass.IpfnWndProc:把IpfnWndProc字段的值放入eax中
esi寄存器作指针寻址
Mov esi ,offt stWndClass
使用esi寄存器作指针寻址
Move ax,[esi+WndClass.IpfnWndProc]=mov eax,[esi+4]
粗心大意的用法
Move ax,[esi+stWndClass.IpfnWndProc]=mov eax,[esi+403004h]