汇编语言语句分类
语句是汇编语言程序的基本组成单位,有三种常见类型:指令语句、伪指令语句和宏指令语句。
指令语句:在汇编源程序时,每条指令语句都要产生相应的机器语言目标代码,对应着机器的每一天条操作。
伪指令语句:用于指示汇编语言如何对源程序进行汇编工作,伪指令语句的功能在汇编阶段已经全部完成,所以不产生相应的目标代码。
宏指令语句:在不同位置重复执行的多条指令的指令序列,可定义为宏指令,出现时进行宏展开。
汇编语言语句格式:
[名字] 操作数 [操作数] [;注释]
每个组成部分之间以空格分隔,含义如下:
名字:
指令语句的名字是标号,必须以冒号“:”结束,标号是一条指令的符号地址,代表该指令代码的起始字节单元地址。
并不是每条指令都需要标号,只有在循环或分支入口语句前面选用标号,以便给循环或转移指令提供转向地址。
伪指令语句中的名字可以是变量名,过程名,段名和符号名等,伪指令语句的名字不可以冒号“:”结束。
汇编语言中名字由数字和字母组成,应满足以下规则:
- 由数字、字母和专有字符组成
- 数字不能作为第一字符
- 单独的问号“?”不能作为名字
- 最大的有效长度为31
- 保留字不能作为名字使用
操作符:
操作符是各种指令助记符,可以是指令、伪指令和宏指令。
操作数:
不同的指令,伪指令所需的操作数个数不尽相同,需要多个操作数时,各个操作数之间要用逗号或空格分隔。
注释:
注释是以分号“’;”开始的任意字符串,可以写在一条语句后面,也可以独占一行。
符号定义语句
等值语句:
格式:符号名 EQU 表达式
功能:给表达式或表达式的值赋予一个符号名,定义后,程序中可以用该符号名代表该表达式。
说明:表达式可以是常数、数值表达式、另一个符号名或助记符等。用 EQU 语句定义的符号名在同一个程序中不允许重复定义。
等号语句:
格式:符号名 = 表达式
功能:与等值语句的功能基本相同,不同之处在于等号语句中的表达式只能是常数或数值表达式,在同一个程序中可以对一个符号重复定义。
解除定义语句:
格式:PURGE 符号名1,符号名2...
功能:解除指定符号的定义。
数据定义语句
数据定义伪指令为数据项分配存储单元,用一个符号名与这个存储单元相联系且为这个数据提供一个任选的初始值,也可以只给变量分配存储单元,不进行赋值。
常用的数据定义伪指令有 DB、DW、DD、DQ、DT等。
格式:[变量名] 数据定义伪指令 初始化参数表
说明:
如果定义时给出了变量名,则变量名是该数据去的符号地址,在指令中通常利用变量名来引用内存单元。
数据定义伪指令 DB、DW、DD、DQ、DT 所分配的内存单元长度不同,见下表:
伪指令 | 内存单元类型 | 单元所占字节数 |
---|---|---|
DB | BYTE 字节型 | 1 |
DW | WORD 字型 | 2 |
DD | DWORD 双字型 | 4 |
DQ | QWORD 4字型 | 8 |
DT | TBYTE 10字型 | 10 |
初始化参数表可以包含任意个初始化参数,相互之间用逗号“,”隔开,有以下五种形式。
? :仅为变量预留一个存储单元而不对该单元进行初始化。
数字常量及数值表达式,可以是十进制、二进制、十六进制和八进制数字常数,也可以是数值表达式。
地址表达式,用在 DW 伪指令中,存入字单元的偏移量部分(用在 DD 伪指令中,双字单元的低字中存放偏移量,高字中存放段基址)。
字符串,字符串必须用单引号或双引号括起来,其值是字符的 ASCII 码值,字符多于两个时,只能用 DB 定义。
重复次数 DUP(初始化参数) ,其中的重复次数可以是任何整数,初始化参数可以是五种形式中的任意一种。
汇编语言数据表示与运输符
常数
在汇编中,其值保持不变,分为数字常数和字符常数。
数字常数
在汇编语言程序中,可以有十进制、二进制、十六进制、八进制数字常量。
十进制数以字母 D 结尾,汇编语言中默认十进制。 D 可省略不写。
二进制数以字母 B 结尾;十六进制数以字母 H 结尾,为了区别 A(a)–F(f) ,凡是以此为起始的十六进制数前面必须加上0;八进制数以字母 O 或 Q 结尾。
字符常数
字符常数是用单引号或双引号括起来的一个或多个字符,以 ASCII 码编码的形式存储在存储单元中。
符号常量
使用符号定义语句定义的常量。
变量
变量是在程序运行中值发生变化的数据,变量有三种属性:段属性、偏移属性、类属性。
段属性:段属性定义了变量所在段的段地址,其值必须在一个段寄存器中。
偏移属性:表示变量相距段起始地址的字节数,一般用一个16位无符号数表示。
类型属性:类型属性用来表示变量的字节长度。
标号
汇编语言中的标号是机器指令存放位置的标识符号,即机器指令存放地址的符号表示,标号可以作为转移指令或重复控制指令的目的操作数,即指令要转向的目的地址。标号有以下三个属性:
段属性:定义标号所在段的段地址。
偏移属性:表示定义标号的语句相距其所在段起始地址的字节数。
类型属性:标号的类型属性有两种,NEAR 类型和 FAR 类型。前者只能在定义该标号的段内使用,而 FAR 类型的标号即可以在段内使用,也可以在段外使用。
表达式
指由常数、变量和标号通过某些运算符连接而成,根据其运算结果的类型分为数值表达式和地址表达式。表达式的运算符有算术运算符、逻辑运算符、关系运算符、属性返回运算符和属性设定运算符。
算术运算符:+、-、*、/、MOD(取模)。其中 +、- 还可以用于地址表达式,有以下两种情况:
地址表达式+常数 ;运算结果为地址
地址表达式-常数 ;运算结果为地址
注:地址表达式-地址表达式的结果为常数。
逻辑运算符:AND、OR、NOT、XOR、SHL、SHR。
关系运算符:EQ(等于)、NE(不等于)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)。
格式:表达式1 关系运算符 表达式2
属性返回运算符:包括类型返回运算符 TYPE,单元数返回运算符 LENGTH,总字节返回运算符 SIZE,段基址返回运算符 SEG 和偏移量返回运算符 OFFSET。
格式:属性返回运算符 地址表达式
属性返回运算符的运算对象必须是由变量名或标号名构成的地址表达式,运算结果是一个纯数值。
类型返回运算符 TYPE:
返回变量或标号类型属性的数值形式,变量或标号的类型和返回值的关系如下表:
类型变量 | 运算结果 | |
---|---|---|
变量 | BYTE | 1 |
WORD | 2 | |
DWORD | 4 | |
QWORD | 8 | |
TBYTE | 10 | |
标号 | NEAR | -1 |
FAR | -2 |
单元数返回运算符 LENGTH:返回变量所占的存储单元个数,该运算返回的结果根据定义该变量的伪指令中的第一个参数的形式来确定。若第一个参数的形式为重复字句 n DUP (数值表达式) ,则 LENGTH 的运算结果为重复因子 n。
eg:
DAB1 DB 12H,34H,56H,78H,9AH
DAB2 2 DUP(12H),0ABH,0CDH
MOV AX,LENGTH DAB1
;汇编成指令 MOV AX,1
MOV AX,LENGTH DAB2
;汇编成指令 MOV AX,2
总字节返回运算符 SIZE :返回变量所占的总字节数。
eg:
DAB1 DB 12H,34H,56H,78H,9AH
DAB2 2 DUP(12H),0ABH,0CDH
MOV AX,SIZE DAB1
;汇编成指令 MOV AX,5
MOV AX,SIZE DAB2
;汇编成指令 MOV AX,4
段基址返回运算符 SEG:返回变量或标号所在段的段地址。
偏移量返回运算符 OFFSET :返回变量或标号在段内的偏移地址。
属性设定运算符:
段超越前缀运算符“:”:该运算符用于给变量、标号或地址表达式临时指定一个段属性。
格式:段寄存器名:地址表达式 或段名:地址表达式
类型设定运算符 PTR、THIS、SHORT。
- PTR 运算符的功能就是地址表达式所确定的存储单元临时设定为指定类型(BYTE、WORD、DWORD、NEAR、FAR)这种临时设定的类型仅在含有该运算符的语句内有效, PTR 的格式如下:
PTR 地址表达式
- THIS 运算符的功能与 PTR 类似,但具体用法不同,格式如下:
变量名 EQU THIS 类型
- SHORT 运算符用于说明其后的标号在短距离(-128~127之间)内,一般用在向后转移的 JMP 指令中,格式如下:
JMP SHORT 目标地址
分离运算符:
分离高字节运算符 HIGH:该运算的结果是其后的运算对象的高字节。
分离低字节运算符 LOW:该运算的结果是其后的运算对象的低字节。
eg:
MOV BX,0ABCDH
MOV HIGH BX
MOV LOW BX
MOV BX,AX
以上代码实现 BX 内容高、低字节的内容互换。
运算符的优先级:
- 先计算圆括号内的运算,如果圆括号有嵌套,按照由内而外的顺序。
- 没有圆括号或对于一对圆括号内的运算按照运算符的优先级从高到低的顺序。
- 对于优先级相同的运算按照从左到右的顺序计算。
运算符的优先级表:
运算符 | 级别 | 运算符 | 级别 |
---|---|---|---|
LENGTH、SIZE | 1 | EQ、NE、LT、LE、GT、GE | 6 |
:、PTR、OFFSET、SEG、TYPE、THIS | 2 | NOT | 7 |
HIGH、LOW | 3 | AND | 8 |
*、/、MOD、SHL、SHR | 4 | OR、XOR | 9 |
+、- | 5 | SHORT | 10 |