1) 指令性语句
指令性语句是指采用指令助记符构成的汇编语言语句,它当然必须符合汇编语言的语法规则。对MCS-51单片机而言,指令性语句是指11l条指令的助记符语句。因此,指令性语句是大量的,是汇编语言语句的主体,也是人们进行汇编语言程序设计的基本语句。每条指令性语句都有与之对应的指令码(即机器码),并由机器在汇编时翻译成目标代码(机器码),以供CPU执行。
2) 伪指令语句
伪指令并不是真正的指令,而是一种假指令。虽然它具有与真指令类似的形式,但并不会在汇编时产生可供机器直接执行的机器码,也不会直接影响存储器中代码和数据的分布。伪指令是在机器汇编时供汇编程序识别和执行的命令,可以用来对机器的汇编过程进行某种控制,令其进行一些特殊操作。例如,规定汇编生成的目标代码在内存中的存放区域、为源程序中的符号和标号赋值以及指示汇编的结束等。
在MCS-51的汇编语言中,常用的伪指令共有8条,现分别介绍如下。
①OPG(起始汇编)伪指令 (ORG伪指令称为起始汇编伪指令,常用于汇编语言源程序或数据块开头,用来指示汇编程序开始对源程序进行汇编。其格式为:
[标号:] ORG 16位地址或标号
在上述格式中,标号段为任选项,通常省略。在机器汇编时,当汇编程序检测到该语句时,它就把该语句下一条指令或数据的首字节按ORG后面的16位地址或标号存入相应存储单元,其他字节和后续指令字节(或数据)便连续存放在后面的存储单元内。例如,在如下程序中
ORG 2000H
START: MOV A, #64H . . . END
ORG伪指令规定了START为2000H,第一条指令及其后续指令汇编后的机器码便从2000H开始依次存放。因此,ORG伪指令可以为其后的程序在64KB程序存储器中定位。
②END(结束汇编)伪指令 END伪指令称为结束汇编伪指令,常用于汇编语言程序末尾,用来指示源程序到此全部结束。其格式为:
[标号:] END
在上述格式中,标号段通常省略。在机器汇编时,当汇编程序检测到该语句时.它就确认汇编语言源程序已经结束,对END后面的指令都不予汇编。因此,一
- 41 -
个源程序只能有一个END语句,而且必须放在整个程序的末尾。
③EQU(赋值)伪指令 EQU伪指令称为赋值(Equate)伪指令,用于给它左边的“字符名称”赋值。EQU伪指令格式为:
字符名称 EQU 数据或汇编符
在机器汇编时,EQU伪指令被汇编程序识别后,汇编程序自动把EQU右边的“数据或汇编符”赋给左边的“字符名称”。这里,“字符名称”不是标号,故它和EQU之间不能用冒号“:”来作分界符。—旦“字符名称”被赋值,它就可以在程序中作为一个数据或地址来使用。因此,“字符名称”所赋的值可以是一个8位二进制数或地址,也可以是一个16位二进制数或地址。例如,如下程序中的语句都是合法的:
ORG 0500H AA EQU R1 A10 EQU 10H DELAY EQU 07E6H
MOV R0, A10 ;R0←(10H) MOV A , AA ;A←R1 . . .
LCALL DELAY ;调用07E6H子程序 . . . END
其中:AA赋值后当作寄存器R1来使用,A10为8位直接地址,DELAY被赋值为16位地址。
EQU伪指令中的“字符名称”必须先赋值后使用,故该语句通常放在源程序的开头。在有些MCS-51汇编程序中,EQU定义的“字符名称”不能在表达式中运算。例如,如下语句是错误的:
MOV A, A10+1
④ DATA(数据地址赋值)伪指令 DATA伪指令称为数据地址赋值伪指令,也
- 42 -
用来给它左边的“字符名称”赋值。DATA伪指令的格式为:
字符名称 DATA 表达式
DATA伪指令功能和EQU伪指令类似,它可以把DATA右边“表达式”的值赋给左边的“字符名称”。这里,表达式可以是一个数据或地址,也可以是一个包含所定义“字符名称”在内的表达式,但不可以是一个汇编符号(如R0~R7)。DATA伪指令和EQU伪指令的主要区别是:EQU定义的“字符名称”必须先定义后使用,而DATA定义的“字符名称”没有这种限制,故DATA伪指令通常用在源程序的开头或末尾。
DATA伪指令一般用来定义程序中所用的8位或16位数据或地址,但也有些汇编程序只允许DATA语句定义8位的数据或地址,16位地址需用XDATA伪指令加以定义。例如:
ORG 0200H AA:DATA 35H DELAY:XDATA 0A7E6H
MOV A, AA ;A←(35H) . . .
LACALL DELAY ;调用A7E6H子程序 . . . END
在程序中,DATA语句也可以放在程序的其他位置上,EQU语句则没有这种灵活性。
⑤ DB伪指令 DB(Define Byte,定义字节)伪指令称为定义字节伪指令,可用来为汇编语言源程序在内存的某区域中定义一个或一串字节。DB伪指令格式为:
[标号:] DB 项或项表
其中:标号段为任选项。DB伪指令能把“项或项表”中的数据依次存放到以左边标号为起始地址的存储单元中,“项或项表”中的数可以是一个8位二进制数或用逗号分开的一串8位二进制数,8位二进制数也可以采用二进制、十进制、十六进制和ASCⅡ码等多种表示形式。例如:
- 43 -
ORG 0600H START: MOV A,#64H . . .
TAB: DB 45H,01011010B,‘5’,‘A’ . . . END
在上述源程序中,TAB是DB伪指令语句的标号,是一个物理地址为16位二进制的标号地址。TAB的具体数值由0600H到TAB之间的实际指令字节数决定,也可以直接在TAB语句前使用一条ORG伪指令语句来定义。上述程序被汇编时,汇编程序自动把TAB单元置成45H、TAB+1单元置成49H(即73的二进制数)、TAB+2单元置成5AH(即:010l1010B)、TAB+3单元置成35H(5的ASCⅡ码)、TAB+4单元置成41H(A的ASCⅡ码)。
⑥DW伪指令 DW(Define Word,定义字)称为定义字伪指令,用于为源程序在内存某个区域定义一个或一串字。相应伪指令格式为:
[标号:] DW 项或项表
其中:标号段为任选项。DW伪指令的功能和DB伪指令类似,其主要区别在于DB定义的是一个字节,而DW定义的是一个字(即两个字节)。因此,DW伪指令主要用来定义16位地址(高8位在前,低8位在后)。例如:
ORG 1500H
START: MOV A, #20H . . .
ORG 1520H
HETAB: DW 1234H,8AH,10 END 上述程序汇编后能使:
(1520H)=12H (1523H)=8AH
- 44 -
(1521H)=34H (1524H)=00H
(1522H)=00H (1525H)=0AH
⑦DS伪指令 DS(Define Storage,定义存储空间)称为定义存储空间伪指令。DS的格式为:
[标号:] DS 表达式
在上述格式中,标号段也为任选项,“表达式”常为一个数值。DS语句可以指示汇编程序从它的标号地址(或实际物理地址)开始预留一定数量的内存单元,以备源程序执行过程中使用。这个预留单元的数量由DS语句中“表达式”的值决定。例如:
ORG 0400H START: MOV A, #32H . . .
SPC: DS 08H DB 25H END
汇编程序对上述源程序汇编时,碰到DS语句便自动从SPC地址开始预留8个连续内存单元,第9个存储单元(即SPC+8)存放25H。
⑧ BIT(位地址赋值)伪指令 BIT称为位地址赋值伪指令,用于给以符号形式的位地址赋值。BIT伪指令的格式为:
字符名称 BIT 位地址
该语句的功能是把BIT右边的位地址赋给它左边的“字符名称”。因此,BIT语句定义过的“字符名称”是一个符号位地址。例如:
ORG 0300H A1 BIT 00H A2 BIT P1.0
MOV C,A1 ;Cy←20H.0 MOV A2,C ;Cy←P1.0 . . .
- 45 -