NASM(NetWide Assembler)是可移植性高的80x86汇编器,支持多种目标文件格式。
- 源代码行格式
[标号] [指令] [注释]
标号由字母、数字、下划线、点号、问号、~、$、@、#组成,必须以字母、下划线、点号或问号开始,区分字母大小写,后缀冒号可选。标号所辖区域从当前开始直到另一标号开始,以点号开始的标号称局部标号,属于当前非局部标号,可用所属标号限定。
指令包括计算机支持的机器指令和NASM支持的伪指令,通常由操作码和操作数组成,多个操作数之间用逗号分隔。
注释以分号开始,直到行尾。
- 伪指令
1、 定义数据(初始化)
DB|DW|DD|DQ|DT <数据> ;DQ、DT只允许小数,DD可以是小数。
2、 保留空间(未初始化)
RESB|RESW|RESD|RESQ|REST <数量>
3、包含二进制文件(插入数据)
INCBIN “文件名”[,<跳过字节数>[,最多插入字节数]]
4、定义符号常量
<符号名> EQU <数字> ;定义后不可修改
5、重复汇编
TIMES <次数> <指令> ;将指令重复n次
- 表达式
表达式主要用来形成操作数,在汇编时计算。其中$和$$分别表示当前汇编地址与汇编起始地址。
1、 常量
A、 整数:二进制(前缀B)、八进制(前缀Q)、十进制、十六进制(前缀0X或$以及后缀H)。
B、 小数:数字.[数字][[E|e][+|-]数字]
C、 字符或字符串:用单引号或双引号括起来,表示数值时,前字符在低字节。
2、 位运算符:|或OR、^或XOR、&或与、<<、>>
3、 算术运算符:+、-、*、/(无符号整数除法)、//(有符号整数除法)、%(无符号整数求余)、%%(有符号整数除法)
4、 单目运算符:+、-、~、SEG(取段地址,非二进制输出时有效)
- 预处理指令
预处理指令由预处理器在汇编前进行文本替换及处理,均以百分号开始。
1、 定义宏:无论单行宏还是多行宏,均可相互引用。
%define sum(a,b) a+b ;带参数的单行宏,可用sum(1,2)
%define pi 3.1415926 ;不带参数的单行宏,%idefine定义不区分字母大小写的宏
%undef pi ;取消宏定义,只单行宏有效
%macro puts 1 ;定义多行宏,可用puts msg
… ;用%n引用参数
%endmacro
2、 定义宏变量
%assign i 3 ;定义宏变量,可用%assign i i+1修改i的值
3、 条件汇编
%ifdef <macro_name>|%if <expression> ;当宏被定义或表达式非0时汇编
…
%endif
4、 重复汇编
%rep <n> ;重复汇编多条指令,而TIMES只能重复汇编一条指令
…
%endrep
5、 文件包含
%include “filename”
- 汇编指引
汇编指引用来给汇编器提供汇编指示或引导,以便正确汇编,汇编指引均用方括号括起来。
1、 处理器模式:[BITS 16]或[BITS 32]
2、 定义段:对于纯二进制文件,NASM可识别[SECTION .text]、[SECTION .data]、[SECTION .bbs],其它目标文件需要自定
3、 汇编起始地址:[ORG <数字>]
其它补充
1、编绎:nasm -f<文件格式> <源代码文件名> -o<输出文件名> -l<列表文件名>
来源:oschina
链接:https://my.oschina.net/u/4272947/blog/3169257