工具选择
目前发现RadASM比较好用,代码补全和高亮好评,可以修改配色。
helloworld与基本框架
.386
.model flat, stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
szCaption db 'Hi', 0
szMsg db 'Hello World!', 0
.code
start:
invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
invoke ExitProcess, NULL
end start
.386指定指令集,类似的还有.8086(dos汇编下的默认指令集),.186,.286,.386/.386p,.486/.486p,.586/.586p。带p的伪指令表示程序中可以使用特权指令。
如果要在程序中使用MMX指令进行图像处理,还需要加上.MMX伪指令,如:
.586
.mmx
.model指定内存模式,win32下只有flat一种,所有的数据和代码都位于4GB的一个段中。如果定义了.model flat,MASM会自动为段寄存器进行如下定义:
ASSUME cs:flat,ds:flat,ss:flat,es:flat,fs:error,gs:error
即默认不使用fs和gs寄存器,如果在程序中进行使用就会得到一个错误。要使用的话可以显示地指定fs:nothing或fs:flat,这样就可以把这个错误留给有需要的人。
option语句的选项不少,不过常用的只有casemap:none这一个选项,用于指定大小写敏感。因为windows API 是区分大小写的,不打开的话出问题的概率会比较大。
简化段伪指令的格式如下表:
简化段伪指令 | 功 能 | 注释 |
---|---|---|
.CODE [段名] | 创建一个代码段 | 段名为可选项,如不给出段名,则采用默认段名。对于多个代码段的模型,则应为每个代码段指定段名。 |
.DATA | 创建一个数据段 | 段名是:_DATA |
.DATA? | 创建无初值变量的数据段 | 段名是:_BSS |
.FARDATA [段名] | 建立有初值的远调用数据段 | 可指定段名,如不指定,则将以FAR_DATA命名。 |
.FARDATA? [段名] | 建立无初值的远调用数据段 | 可指定段名,如不指定,则将以FAR_BSS命名。 |
.CONST | 建立只读的常量数据段 | 段名是:CONST |
.STACK [大小] | 创建一个堆栈段并指定堆栈段大小 | 段名是:stack。如不指定堆栈段大小,则缺省值为1KB |
值得注意的是,在.model flat模式中的段其实是对一整块儿内存的分段,因为32位的寄存器寻址能力以及超过了4GB,理论上来说是不需要段的,这种分段是为了编程时的方便,可以避免一些不必要的错误。
ctrl+F5构建并运行此程序。