一。模式定义
1。指令集
.386
2。.model语句
.model 内存模式[,语言模式][,其他模式]
内存模式:tiny , small ,medium ,compact ,large ,huge ,flat(常用)
.model后面只能跟stdcall
3。option语句
option casemap:none
二。段的定义
1。段的概念
.data <一些初始化的变量定义>
.data? <一些没有初始化的变量定义>
.const <一些常量定义>
.code <代码>
<开始标号>
<其他语句>
end 开始标号
2。数据段
(1)可读可写的已定义变量 放在.data段中,一般在可执行文件的_DATA节区中
(2)可读可写的未定义变量 放在.data?段中,一把存放在)BSS节区中
(3)一些常量 放在.code段中,可读不可写
3。代码段
所有的指令都必须放在代码段中,在可执行文件中,代码一般放置在_TEXT节区中。
在Win32汇编中,只有代码段具有可执行的属性,不能在EXE文件中对代码段进行改动。
但是,在特权级0下运行的程序,对所有的段都有读写的权利。而且,代码段的属性是由可执行文件的PE头部中的属性位来决定的,通过编辑磁盘上的EXE文件,将可执行文件的PE头部改为可写,那么在程序中就允许修改自己的代码段。典型的应用是:针对可执行文件的压缩软件和加壳软件:Upx和PeCompact等,这些软件靠把代码段做出一些变换来达到解压缩,解密的目的,被处理过的可执行文件在还原时需要有解压代码来将代码段解压缩,所以说这些可执行软件对可执行文件代码段的属性预先做了修改。
4。堆栈段
可读可写可执行。可以靠动态修改代码的反跟踪模块可以拷贝到堆栈段中去边修改边执行。一些病毒和黑客工具用到的缓冲区溢出技术也用到了这个特征。
三。程序结束和程序入口
end 后面的富豪标志就是入口标志
四。注释和换行
;注释
/ 换行