Win32汇编语言程序结构
默人整理 http://blog.youkuaiyun.com/HelloMei
.386 :指定使用的指令集
.model:定义程序的工作模式
.option casemap:none : 定义是否区分大小写
数据段:.data .data? .const
代码段:.code
堆栈段:系统自动分配堆栈空间(堆栈段内存属性是可读可写可执行,黑客方面缓冲区溢出技术)
end start:此处是程序的结束..入口就在start那
;注释符号
API方面:
Kernel32.dll 系统服务功能
Gdi32.dll 图形设备接口
User32.dll 用户接口服务
调用API:
1. push..push..push….xxx….call…..
2. invoke :masm编译器的伪指令
返回值永远放在eax中..或数据或指针
调用的时候..函数原型必须声明…
xxx proto aaa:dword, bbb:dword,…….
在程序开头include 相关的文件可以省略此步
Inc:声明函数原型
Lib:Link时能到指定的文件中去找API函数的位置信息
标号:……->作用域是当前的子程序
标号::……->作用域是整个程序
当用@@做标号时:
@F:本条指令后的第一个@@标号
@B:本条指令前的第一个@@标号
变量:
全局变量:
1, 定义在.data 或 .data?段
2, 数据类型(db,dw,dd,df,dq,dt…..)
3, Xxx type initvalue1, initvalue2…
4, Xxx type repeatnum dup (initvalue1, initvalue2…)
5, 问号可以预留空间,实际运行的时候全部初始化为0
局部变量:(堆栈的出现)
1,定义:local xxx[repatnum]:type,…..
2,对局部变量一定要初始化
变量的使用:
1, 类型不同:type ptr value
2, sizeof :取得以字节为单位的长度
lengthof:取得数据的项数
3, offset:取变量地址的伪操作符
对于局部变量..是用ebp来做指针操作的..编译时不确定..不能用offset来操作
addr: 对于局部变量…只能用在invoke参数中
子程序
1, 定义
procName proc uses 寄存器列表,xxx:type..,VARARG
local …..
…..
procName endp
2, 不同语言调用方式(VARARG:表示参数的个数不确定)
syscall, stdcall : 从右入栈,子程序清除堆栈,允许使用VARARG
fortran,basic , pascal:从左入栈,子程序清除堆栈,不允许使用VARARG
c: 从右入栈,调用者清除堆栈,允许使用VARARG
条件测试语句:
寄存器或变量 操作符 操作数
分支语句:
.if 条件表达式1
………..
.elseif条件表达式2
………
.else
…………
.endif
循环语句:
1:
.while 条件表达式1
指令
[.break [.if 退出条件]]
[.continue]
.endw
2:
.repeat
指令
[.break [.if 退出条件]]
[.continue]
until 条件表达式(或untilcxz 条件表达式) :类似pascal那个repeat
命名:汇编
1,匈牙利表示法
b : byte
w : word
dw : dword
h : Handle(句柄)
lp : 指针
sz : 以0结尾的字符串
lpsz : 指向0结尾的字符串的指针
f : 浮点数
st : 数据结构
2, 全局变量在前面加_
局部变量在前面加@
3, 在内部子程序的名称前面也加_