在汇编语言源程序中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这是通过伪指令来实现的。伪指令不属于指令系统中的汇编语言指令,它是程序员发给汇编程序的命令,也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。“伪”体现在汇编后,伪指令没有相应的机器代码产生。伪指令具有控制汇编程序的输入/输出、定义数据和符号、条件汇编、分配存储空间等功能。
伪指令是对“汇编”过程进行控制,或者对符号、标号赋值的“指令”。在汇编过程中,不被翻译成机器码的指令。
常用伪指令见表3-28。
表3-28 常用伪指令
伪指令不属于指令系统中的汇编语言指令,是控制汇编(翻译)过程的一些控制命令,它是程序员发给汇编程序的命令,也称为汇编程序控制命令。MCS-51系列单片机汇编语言,包含两类不同性质的指令。
1)基本指令:也就是指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。
2)伪指令:汇编时用于控制汇编的指令。它们都是机器不执行的指令,无机器码。
在一个源程序中,可多次用ORG指令,规定不同的程序段的起始地址。但是,程序地址必须由小到大排列,且不能交叉、重叠。对不同的程序段不能相同。如果不用ORG,则汇编得到的目标程序将从0000H地址开始。通常在源程序开头使用伪指令ORG 0000H。
例3-30:在内部RAM中以ADR1、ADR2开始的空间里已存放了被加数、加数(多字节的),它们的字节数长度为L,要求和放回到存放原被加数的空间中。
源程序以及汇编后的目标程序在程序存储器中的安排如图3-17所示。
图3-17 源程序以及汇编后的目标程序在程序存储器中的安排
1 END指令
END指令用于终止源程序的汇编工作。源程序结束标志终止源程序的汇编工作。整个源程序中只能有一条END指令,且位于程序的最后。如果END出现在程序中间,其后的源程序将不进行汇编处理。
2 EQU指令
EQU指令是将一个数据或汇编符号赋予规定的字符名称,汇编程序会自动将EQU右边的数或汇编符号(地址或常数)赋给左边的字符名称。所以应先定义后使用,给予赋值。其值在整个程序有效,一般放在程序开始处。字符名称不是标号,不能用“:”作分隔符。字符名称、EQU、数据或汇编符号之间要用空格符分开。用EQU伪指令赋值的字符名称可以用作数据地址、寄存器、代码地址、位地址或者当作一个立即数来使用。给字符名称所赋的值可以是8位或16位的数据或地址。字符名称一旦被赋值,它就可以在程序中作为一个数据或地址使用。通过EQU赋值的字符名称不能被第二次赋值,即一个字符名称不可以指向多个数据或地址。字符名称必须先定义后使用,所以该语句通常放在源程序的开头。
例3-31:执行以下程序指令。
ORG 0000H
LJMP START
ORG 2000H
COUNT EQU 10H
START:MOV 10H,#20H;(10H)=20H
MOV 11H,#30H;(11H)=30H
MOV R0,#10H;(R0)=10H
MOV R1,#COUNT;(R1)=10H
MOV R2,COUNT;(R2)=20H
MOV R3,#COUNT+1;(R3)=11H
MOV R4,COUNT+1;(R4)=30H
SJMP $
END
执行后结果为:R0=10H,R1=10H,R2=20H,R3=11H,R4=30H。
3 DATA指令
DATA指令是将数据、地址、表达式赋值给规定的字符名称。字符名称、DATA与表达式之间要用空格符分开。
例3-32:执行以下指令。
FST DATA 30H;用FST代表30H
SEC DATA FST*2+8;用SEC代表表达式
ORG 0000H
MOV A,FST;A←(FST)
MOV R1,#SEC;R1←SEC
SJMP $
END
可见,DATA伪指令可将一个表达式赋给字符名称,所定义的字符变量也可出现在表达式中。
4 DB指令
DB指令定义了字节常数或数表。表明从该标号地址单元开始定义一个或若干个字节的数。用于从指定地址开始在程序存储器连续单元中定义字节数据。
例3-33:执行以下指令。
ORG 1000H
TAB:DB-2H,-4H,66H;从1000H单元开始存放数
DB 78H,9AH,00H;换行,仍要先写DB
功能:从指定的地址单元开始,定义若干个8位内存单元的数据,数据与数据间用“,”来分隔。若数据表首有标号,数据依次存放到以左边标号为首地址的存储单元中,这些数可以采用二进制、十进制、十六进制和ASCII码等多种形式表示。其中,ASCII码用引号“”或单引号‘’包括住。
例3-34:执行以下指令。(www.xing528.com)
ORG 0100H
TAB:DB 34,34H
DB 0101B
DB 'a'
DB '2'
以上指令经汇编后,从ROM地址100H开始的相继地址单元中赋值如下:
(100H)=22H;为十进制34对应的十六进制数
(101H)=34H;为十六进制
(102H)=05H;为二进制0101B对应的十六进制数
(103H)=61H;“a”的ASCII码
(104H)=32H;‘2’的ASCII码
5 DS指令
DS指令指定从标号地址单元开始,保留指定数目的字节单元作为存储区,供程序运行使用。预留单元数量由DS语句中“表达式”的值决定。
例如,TAB2:DS 100;通知汇编程序从TAB2开始保留100个字节单元,以备源程序另用。
例3-35:执行以下指令程序段。
ORG 2000H
DS 08H
DB 30H,8AH;则30H从2008H单元开始存放
特别注意:DB、DW和DS指令只能对程序存储器有效,不能对数据存储器使用。
ORG 0100H
DS 7
CLR A
汇编后从100H单元开始,保留7个字节的内存单元,然后从107H放置指令CLR A的机器码0E4H,即(107H)=E4H。
6 BIT指令
BIT指令用于给字符名称赋以位地址,位地址可以是绝对位地址,也可以是符号地址。一般用来将位地址赋给标号名称,以方便用户编程和阅读程序。
例如:
M0 BIT 20H.0
MOV C,M0
FT1 BIT P0.0
FT2 BIT ACC.1
把P0.0和ACC.1的位地址分别赋以字符名称FT1和FT2。在以后的编程中FT1、FT2可作为位地址用。
7 DW指令
DW指令定义字常数或ASCII字符,从指定的地址单元开始,定义若干个16位数据。因为16位数据必须占用两个字节,所以高8位先存入,占低位地址;低8位后存入,占高位地址。不足16位的用0填充。
例如:
ORG 0100H
TAB:DW 12
DW 45H
DW 3343H
以上指令经汇编后,从ROM的100H起的单元依次存放00,0CH,00,45H,33H,43H,共占6个单元。
DW用于从指定的地址开始在程序存储器的连续单元中定义字数据。
例3-36:执行以下指令。
ORG 2000H
DW 1246H,7BH,10
汇编后:
(2000H)=12H;第1个字
(2001H)=46H
(2002H)=00H;第2个字
(2003H)=7BH
(2004H)=00H;第3个字
(2005H)=0AH
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。