最近在学习SEH的东西,所以需要用到汇编,我下载了masm32.
解压后是个安装文件,直接安装即可,安装成功后运行qeditor,进入MASM的集成开发环境。
1.创建新文件:File->New,编辑代码,保存成***.asm的文件即可。
2.编译源文件:Project->Assemble Asm File,汇编结束后会出现一个txt的结果文档,如果有错,可以根据相应的结果进行调试然后在进行汇编,此步会产生***.obj文件。
3.连接:Project->Link Obj File,链接2步骤中产生的Obj文件,产生exe文件。
4.运行:Project->Run Program,运行程序。
附注:Masm32语法问题[1]:
.386
.model flat,stdcall
option casemap:none
.model flat代表在执行如下伪指令:
assume cs:FLAT,ds:FLAT,ss:FLAT,es:FLAT,fs:ERROR,gs:ERROR
所以在使用fs,gs之前要
assume fs:nothing,gs:nothing
函数声明
MessageBox Proto hWnd:dword,lpText:dword,lpCaption:dword,uType:dword
定义全局变量
xx db ?
yy db 'hello',0
zz db 100 dup(1,2) ;重复100次
;db也可用dw,dd,dq,dt,byte,word,dword,qword,tbyte,sbyte,sword,sdword,real4,real8,real10定义
定义局部变量:变量名[\[<重复次数>\]]:类型
local local[1024]:byte
函数模版
mov edi,edi
push ebp
mov ebp,esp
pushad
...
popad
mov esp,ebp
pop ebp
ret xxx
MASM标号特点,两个jmp都跳到@@处
jmp @F
@@
jmp @B
定义结构:
sname struct
item1 dword ?
item2 dword ?
...
sname ends
结构使用:
arg1 sname <1,1,...>
mov eax,arg1.item1 ;跟下面的几种方法效果一样
mov esi,offset arg1
mov ebx,[esi + sname.item1]
assume esi:ptr sname
mov ecx,[esi].item1
assume esi:nothing
;下面的可以当成指针的强制转换
mov esi,val
assume esi:ptr EXCEPTION_RECORD
;下面的可以当成C语言中指针所指的内容
[esi] ;相当与*esi
sizeof <变量名|类型名> ;取得所占字节大小
lengthof <变量名> ;变量所有元素的个数
offset <全局变量名> ;取得变量地址,编译时能确定的全局变量地址,一般在数据节
addr <全局变量名|局部变量名> ;全局变量同offset;用lea取得局部变量地址,存入eax,用eax做返回值
所以invoke的时候有addr的参数时候若要用eax做参数,eax必须最先入栈
定义函数
子程序名 proc [ NEAR | FAR | NEAR16 | NEAR32 | FAR16 | FAR32 ] [ StdCall | C | SysCall | BASIC | FORTRAN | PASCAL] [ PRIVATE | PUBLIC | EXPORT ] [USES 寄存器列表] [,变量名:类型] [VARARG]
;VARARG说明函数后面可以跟多个参数,若用在StdCall中要调用者清栈.且只能在StdCall,C,SysCall中使用.
...
子程序名 endp
.if
.elseif
...
.else
.endif
CARRY? OVERFLOW? PARITY? SIGN? ZERO?
.while <条件表达式> ;为真循环
...
.break
[.continue]
.endw
.repeat
...
.break
[.continue]
.until <条件表达式> ;为假循环
;.untilcxz [条件表达式]