指令语句是功能性语句,由Intel 8086/8088 CPU提供的指令形成,实现一定的操作功能,能够被编译成机器代码。
伪指令语句也叫指示性语句,只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不产生机器代码。
如:
BUF1 DB 34H
BUF2 DB 2AH
SUM DB ?
名字的标识符
可由下列符号组成:
(1) 英文字母(A~Z,a~z);
(2) 数字(0~9);
(3) 特殊符号(?、@、_等)。
名字的定义规则
(1) 数字不能作为名字的第一个符号;
(2) 单独的问号(?)不能作为名字;
(3) 一个名字的最大有效长度为31,超过31的部分计算机不再识别;
(4) 汇编语言中有特定含义的保留字,如操作码、寄存器名等,不能作为名字使用。
名字为了便于记忆,应该做到见名知义,如用BUFFER表示缓冲区、SUM表示累加和等。
名字的两种主要形式
(1) 标号:
标号有三种属性:段基值、段内偏移量(或相对地址)和类型属性。
段基值(SEG)属性:是标号所在逻辑段的段基值,即段起始地址的前16位。此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中。
段内偏移量(OFFSET)属性:是标号距离段起始地址的字节数,对于16位段是16位无符号数;对于32位段则是32位无符号数。
类型(TYPE)属性:类型表示该标号所代表的指令的转移范围,分为NEAR和FAR两种。如果为NEAR型,则标号只能在段内引用;如果为FAR型,则标号可以在段间引用。
(2) 变量:
BYTE(DB,1个字节长)、WORD(DW,2个字节长)、DWORD(DD,4个字节长)、FWORD(DF,6个字节长)、QWORD(DQ,8个字节长)、TBYTE(DT,10个字节长)。
指令助记符用来指明不同的操作指令。如MOV,ADD等都是指令助记符。
由分号(;)开始
续行符用(&)
(1) SEG:返回变量或标号所在段的段基值
OFFSET:返回变量或标号的段内偏移量。
(2)TYPE:返回变量或标号的类型属性值
(3) LENGTH:返回变量数据区分配的数据项总数。
SIZE:返回变量数据区分配的字节个数。
(1)PTR: 对已分配的存储器地址临时赋予另一种类型属性,但不改变操作数本身的类型属性,同时保留存储器地址的段基址和段内偏移量的属性。
(2)THIS:用来定义一个新类型的变量或标号。
(1) LOW运算符。
格式:LOW 表达式
功能:取表达式的低字节返回。
(2) HIGH运算符。
格式:HIGH 表达式
功能:取表达式的高字节返回。
例如:
MOV AL,LOW 2238H ;AL←38H
MOV AH,HIGH 2238H ;AH←22
格式:PURGE <符号1,符号2,…,符号N>
功能:解除指定符号的定义。解除符号定义后,可用EQU重新进行定义。
如:
Y1 EQU 7 ;定义Y1的值为7
PURGE Y1 ;解除Y1的定义
Y1 EQU 36 ;重新定义Y1的值为36
BYTE(DB,1个字节长)、
WORD(DW,2个字节长)、
DWORD(DD,4个字节长)、
FWORD(DF,6个字节长)、
QWORD(DQ,8个字节长)、
TBYTE(DT,10个字节长)。
开始部分:可以用NAME或TITLE为模块命名
NAME MODULE_NAME
TITLE TEXT(可指定列表文件的每一页上打印的标题)
结束部分:
END [LABEL]
(标号(LABEL)指示程序开始执行的起始地址)
(1) .8086:选择8086指令系统。
(2) .286:选择80286指令系统。
(3) .286P:选择保护方式下的80286指令系统。
(4) .386:选择80386指令系统。
(5) .386P:选择保护方式下的80386指令系统。
(6) .486:选择80486指令系统。
(7) .486P:选择保护方式下的80486指令系统。
(8) .586:选择Pentium指令系统。
(9) .586P:选择保护方式下的Pentium指令系统。
ORG伪操作用来设置当前地址计数器的值
如:
VECTORS SEGMENT
ORG 10
VECT1 DW 47A5H
ORG 20
VECT2 DW 0C596H
VECTORS ENDS
则VECT1的偏移地址值为0AH,而VECT2的偏移地址值为14H。
使下一个变量或指令开始于偶数字节地址。
为保证双字类型数组边界从4的倍数开始创造了条件,其格式为
ALIGN BOUNDARY
其中,BOUNDARY必须是2的幂,
例如:
.DATA
…
ALIGN 4
ARRAY DB 100 DUP(?)
…
就可保证ARRAY的值为4的倍数。当然,ALIGN 2和EVEN是等价的。
例如,下面是一个的对应关系标准的汇编源程序段定义。
DATE_SEG1 SEGMENT ;定义数据段
...
DATE_SEG1 ENDS ;数据段结束
DATA_SEG2 SEGMENT ;定义数据附加段
...
DATA_SEG2 ENDS ;数据附加段结束
CODE_SEG SEGMENT ;定义代码段
ASSUME CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2
START: ;开始执行的入口地址
;设置DS寄存器为当前数据段
MOV AX,DATA_SEG1 ;将数据段地址赋予DS
MOV DS,AX
;设置ES寄存器为当前附加段
MOV AX,DATA_SEG2 ;将附加数据段地址赋予ES
MOV ES,AX
CODE_SEG ENDS ;代码段定义结束
END START ;源程序结束
在计算机上运行汇编语言程序的步骤是:
(1) 用编辑程序建立 .ASM源文件;
(2) 用MASM程序把 .ASM文件汇编成 .OBJ文件;
(3) 用LINK程序把 .OBJ文件连接成.EXE文件;
(4) 用DOS命令直接键入文件名就可执行该程序。
例如 MOV AH,0 ;分功能号为0
MOV AL,10H ;置入口参数
INT 1AH ;1AH为中断号,功能为读时间计数器的值
MOV AH,0 ;请求打印
MOV AL,CHAR ;写入打印字符
MOV DX,0 ;设置0#打印口
INT 17H ;调用BIOS
MOV AH,01 ;初始化打印机
MOV DX,0 ;设置0#打印口
INT 17H ;调用BIOS
MICRO
INPUT MACRO ;定义一条从键盘输入一个字符的宏指令INPUT
LF MACRO ;定义一条换行宏指令LF