目录
一、数据定义伪指令
1. 格式
2. 操作数
3. 重复操作数
4. 变量的使用
5. 属性定义伪指令 LABEL
6. 表达式运算符
二、符号定义伪指令
伪指令
指示性语句中的伪操作命令,无论表示形式或其在语句中所处的位置都与 CPU 指令相似,因此也称为伪指令,但两者之间有着重要的区别。
首先,CPU 指令在程序运行时由 CPU 执行,每条指令对应 CPU 的一种特定的操作,如数据传送、算术运算等;而伪指令在汇编过程中由汇编程序执行,如定义数据、分配存储区、定义段以及定义过程等。其次,汇编以后,每条 CPU 指令都被汇编并产生一条与之对应的目标代码,而伪指令则不产生与之对应的目标代码。
一、数据定义伪指令
1. 格式
{变量名} 伪指令 操作数1 {,操作数 ...}
花括号中的变量名为可选项。常用的数据定义伪指令有以下 5 种。
2. 操作数
操作数的值不能超过伪指令所定义的范围。
(易错)若想要实现 2 个以上字符,则必须使用 DB 字节方式进行定义。
(易错)DW 和 DD 伪指令不能用两个以上字符构成的字符串赋初值,否则将会出错。
3. 重复操作数
当同样的操作数重复多次时,可用 DUP 表示。
格式:变量名 伪指令 表达式1 DUP (表达式2)
- 表达式 1 为重复次数
- 表达式 2 为重复内容
4. 变量的使用
(1)在指令语句中引用
若在指令语句中直接引用变量名,则表示该操作数为存储器操作数,其表现形式为:
段地址:[ 偏移地址 ]
变量名代表:
- 是一个存储器操作数
- 段地址、偏移地址、类型
汇编后,表达式必须要有一个确定的值。这个值可能是数值,也可能是段地址和偏移地址。
对于 DATA2,汇编时只会写入它的段地址和偏移地址。这两个地址是汇编程序知道的,因为地址本来就是在汇编中分配的。但是汇编程序不知道这两个地址对应的存储单元存储的内容,因为内容要在执行后才能确定。因此,DATA2 + 1 代表偏移地址 + 1,而不是对应内容 + 1 。
当变量出现在寄存器间接寻址的操作数中时,它表示该变量的偏移地址。
(2)在伪指令中引用
5. 属性定义伪指令 LABEL
LABEL 对属性进行永久性修改,PTR 对属性进行暂时性修改。
举例
- SUB1_FAR 与 SUB1 两个标号具有相同的逻辑地址。
- SUB1_FAR 与 SUB1 被转移指令或调用指令使用时是指同一个入口地址。
- SUB1只能被段内调用,SUB1_FAR可以被段间指令调用。
举例
- DATA_BYTE 与 DATA_WORD 具有相同的段基址和偏移量。
-
DATA_BYTE 可以被用来存取一个字节数据,而 DATA_WORD 则不能。
6. 表达式运算符
关系运算符用来比较两个表达式的大小。
关系运算符比较的两个表达式必须同为常数或同一逻辑段中的变量。
- 若是常量的比较,则按无符号数进行比较。
- 若是变量的比较,则比较它们的偏移量的大小。
关系运算的结果只能是 “真” 或 “假”,即全 1 或全 0 。
举例
举例
该语句在汇编时,根据符号常量 CNUM 的大小来决定 VAR 存储单元的值。
当 CNUM < 0ABH 时,则变量 VAR 的内容为 0FFFFH;否则,VAR 的内容为 0 。
举例
不能用来分离一个变量、寄存器或存储单元的内容。
二、符号定义伪指令
符号定义伪指令将常数或表达式等形式用某个指定的符号来表示。
格式:符号名 EQU 表达式
功能:用符号名来表示 EQU 右边的表达式。后面的程序中一旦出现该符号名,汇编程序就把它替换成该表达式。