正如高级语言一样,汇编语言也分为很多种,不同的汇编语言存在着不同的语法格式,NASM是其中的一种。
一、程序行的组成
【标号】: 【操作码】【操作数】【注释】
这四个均是可选的,有的程序行没有标号、只有标号或者既有标号也有指令(操作码+操作数)。
标号其实就是当前程序行的首地址。
二、伪指令
伪指令是为了便于编程,告诉汇编器如何编译程序。
1、DB、DW、DD、DQ和DT
这5个伪指令是定义含有初值的数据,如:
DB 12H ;定义字节数据,初始值为十六进制的12H
DW 1234H;定义两个字节数据,
DD 12345678H ; 定义四个字节数据,
DQ 定义四个字节数据
DT定义10个字节数据
2、RESB、RESW、RESD、RESQ和REST
这几个伪指令定义不包含初始值的数据,实际上这些指令只是预留了一些内存空间而已。
3、INCBIN
引用二进制文件,如:INCBIN “test.dat”
4、EQU
EQU伪指令为一个符号定义了一个常量,一旦定义之后就不能再改变了,如:
message DB ‘hello, world’ ;定义了一个标号message,它表示一个地址,从该地址开始存储12个字符
mesglen EQU $-message ;$表示取当前程序行开始的地址,$-message就是message占用内存的大小。
5、TIMES
TIMES 次数 指令 ;表示重复执行指令的次数
三、[]
汇编语言中标号均做地址处理,[]表示取地址中的内容。
四、常量
常量有数字、字符、字符串和浮点数。
注意:当字符常量超过一个时拍在前面的存储在低地址。
mov ax ab; al中存储a,ah中存储b
对于字符串常量,只适用于伪指令:DB类和INCBIN
下述三个指令是相当的,
DD ‘ninechars’ ;占用内存12个字节
DD ‘nine’,'char','s';占用内存12个字节
DB 'ninechars','0','0','0';占用内存12个字节
五、运算符
1、$表示当前程序行的首地址
2、$$表示当前段的首地址
3、OR(|)、XOR(^)、AND(&)、<<(移位运算符,左移)
六、临界表达式
NASM是一个二次汇编器,即第二次编译时就会产生机器代码,在第一次编译时编译器要能知道所有数据或代码占用 的内存大小。在第一次汇编中能够确定数据或代码占用空间大小的表达式称为临界表达式。
TIMES label-$ DB 0
label: DB ‘test’
上述程序就肯定汇编不过,因为编译到第一行时不知道label-$是多少。
七、局部标号
.label 就是一个局部标号,注意前面有个. ,局部标号与非局部标号的结合可以够成独立标号、
八、预处理器
1、多行宏
%MACRO 宏名称 参数个数
宏体
%MACRO
阅读(1119) | 评论(0) | 转发(1) |