上篇我们讲了汇编指令格式,寻址方式和指令系统分类,这篇我们讲一下单片机伪指令。
伪指令是汇编程序中用于指示汇编程序如何对源程序进行汇编的指令。伪指令不同于指令,在汇编时并不翻译成机器代码,只是会汇编过程进行相应的控制和说明。
伪指令通常在汇编程序中用于定义数据、分配存储空间、控制程序的输入/输出等。在MCS-51系统中,常用的伪指令有7条。接下来我们来一个一个学习。
伪指令
1.ORG伪指令
ORG伪指令称为起始汇编伪指令,常用于汇编语言某程序段的开始或某个数据块的开始。
一般格式为:
[标号:] ORG 16位地址
其标号为可选项。例如:
ORG 0040H
MAIN:
MOV SP,#0DFH
MOV 30H,#00H
此处的ORG伪指令指明后面的程序从0040H单元开始存放。
2.END伪指令
END伪指令称为结束汇编伪指令,用于汇编语言程序段的末尾,指示源程序在END处结束汇编,即便是END后面还有程序,也不做处理。
一般格式为:
END
3.EQU伪指令
EQU伪指令称为赋值伪指令、其一般格式为:
符号名 EQU 项(常数、常数表达式、字符串或地址标号)
EQU的功能是将右边的项赋值给左边。在汇编过程中,遇到EQU定义的符号名,就用其右边的项代替符号名。
注意:EQU只能先定义后使用
例题:EQU应用举例
HOUR EQU 30H ;定义变量HOUR的地址为30H
MINU EQU 31H ;定义MINU的地址为31H
REG EQU R7 ;定义字符串R7
DISP EQU 0800H ;定义变量DISP的地址为0800H
MOV HOUR,#09H ;变量HOUR赋值9
MOV R0,#HOUR ;使变量R0指向30H单元
INC R0 ;指针R0增1
MOV @R0,#25 ;变量MINU赋值25
MOV REG,A ;(A)→R7
LCALL DISP ;调用首地址为0800H处子程序
4.DATA伪指令
DATA伪指令(地址+数据)称为数据地址赋值伪指令。
其一般格式为:
符号名 DATA 常数或常数表达式
DATA的功能与EQU相似,是将右边的项赋值给左边。在汇编过程中遇到DATA定义的符号名,就用其右边的项符号名。该伪指令用于定义片外数据区变量。
与DATA类似的还有一条伪指令XDATA,用于定义片外数据区变量。
注意:DATA可以先定义后使用,当然也可以先使用后定义。
HOUR DATA 30H ;定义变量HOUR的地址为30H
MINU DATA 31H ;定义MINU的地址为31H
MOV HOUR,#09H ;变量HOUR赋值9
MOV R0,#HOUR ;使变量R0指向30H单元
INC R0 ;指针R0增1
MOV @R0,#25 ;变量MINU赋值25
5.BIT指令
BIT伪指令称为位地址符号伪指令。其格式为:
符号名 BIT 位地址
BIT伪指令的功能是把右边的地址赋值给昨天的符号名。位地址可以是前面所述的4中形式的任一种。
例如:
FLAGRUN BIT 00H
FLAGMUS BIT 01H
FLAGKEY BIT 02H
FLAGALAR BIT P1.7
6.DB指令
DB伪指令称为定义字节伪指令。其格式为:
[标号:] DB 项(字节数据、字节数或字符、字符串)
它的功能是从指定单元开始定义(存储)若干个字节的数据或字符、字符串,字符或字符串需要用引号(单引号或双引号皆可)括起来,即用ASCII码表示。其中标号是可选的。
例如:
TABLE: DB 32,24H,'A',"B","EFGH"
7.DW指令
DW伪指令称为定义字伪指令。其格式为:
[标号:] DW 字数据或字数据表
DW伪指令的功能与DB伪指令的相似,是从指定单元开始定义(存储)若干个字数据,每个数据占2个字节,而用DB伪指令定义的数据只占1个字节。其中标号是可选的。
例如:
ORG 1000H
TABLE2: DW 32,24H,1234H
上面这两行程序汇编后,从1000H单元开始,依次存放如下数据:
(1000H)=00H
(1001H)=20H
(1002H)=00H
(1003H)=24H
(1004H)=12H
(1005H)=34H
注意:高字节存放在前面(低地址),低字节存放在后面(高地址)。
汇编语言程序设计
简单程序设计
简单程序是指顺序执行的程序。简单程序从第一条指令开始,依次执行每一条指令,直到程序执行完毕,之间没有任何转移和子程序调用,整个程序只有一个入口和一个出口。
分支程序设计
在许多情况下,程序会根据不同的条件,转向处理不同的处理程序,这种结构的程序称为分支程序。使用条件转移指令、比较转移指令和位条件转移指令,可以实现程序的分支处理。
在汇编语言程序中,分支结构式比较麻烦的,初学时应特别注意。
循环程序设计
循环程序由一下几个部分组成
(1)循环初始化部分
(2)循环体部分
(3)循环结束部分
子程序设计
子程序是指完成某一确定任务,并且能够被其他程序反复调用的程序段。采用子程序,可以简化程序,提高编程效率。
子程序在结构上有一定的要求,编写时需要注意:
(1)子程序第一条指令的地址称为入口地址,该指令前必须要有标号,其标号一般要能够说明子程序的功能。
(2)子程序末尾一定要有返回指令,而调用子程序的指令应该在其他程序中。
(3)在子程序中,要注意保护在主调函数中使用的寄存器和存储单元中的数据,必要时在子程序开始使其进栈保护,在子程序返回前再出栈恢复原来值。
(4)字子程序中,要明确指出“入口参数”和“出口参数”,入口参数就是在调用前需要给子程序准备的数据,出口参数就是程序的返回值。
参数的传递有以下几种方式
(1)通过寄存器R0~R7或累加器A
(2)传递地址。入口参数和出口参数的数据存放在存储器中,使用R0、R1或DPTR传递指向数据的地址。
(3)通过堆栈传递参数
有问题欢迎提出!