3.1 指令系统简介
每一种CPU都有其独立的指令系统,本节主要介绍51单片机指令系统的特点、指令格式、分类及符号说明。
51单片机指令系统共有111条指令,其中有49条单字节指令、45条双字节指令和17条三字节指令,其中有64条指令的执行时间为一个机器周期,45条指令的执行时间为两个机器周期。
3.1.1 指令格式
51单片机指令系统中的每一条指令都有两级指令格式。
1)CPU可直接识别并执行的机器语言指令。
2)汇编语言指令(简称汇编指令)。
机器语言指令是计算机唯一能识别的指令,在设计CPU时由其硬件定义。
机器语言指令由二进制数“0”和“1”编码而成,也称目标代码,执行速度最快。然而,使用时非常烦琐费时,不易阅读和记忆,对用户而言,一般不采用机器语言编写程序。
汇编语言指令是在机器语言指令的基础上,用英文单词或英文单词缩写表示机器语言指令的操作码(助记符),用符号表示操作数或操作数的地址。汇编语言指令实际上是符号化的机器语言。一条汇编指令必有一条相应的机器语言指令与之对应,由于汇编指令易读、便于记忆,在单片机应用时,一般应采用汇编语言编写应用程序。然而,用汇编语言所编写的程序(又称源程序),CPU不能直接执行,必须将其翻译成机器语言的目标代码,这一过程称为汇编。
本章主要通过汇编指令介绍51单片机的指令系统。
51单片机汇编语言指令格式由以下几个部分组成。
[标号:]操作码[目的操作数][,源操作数][:注释]
其中,[]中的项表示为可选项。
例如:
标号:又称为指令地址符号,一般是由1~6个字符组成,是以字母开头的字母数字串,与操作码之间用冒号分开。
操作码:由助记符所表示的指令操作功能。
操作数:指参加操作的数据或数据的地址。
注释:为该条指令作的说明,以便于阅读。
操作码是指令的核心,不可缺少,其他几项根据不同指令为可选项。
在51单片机指令系统中,不同功能的指令,操作数作用也不同。例如,传送类指令多为两个操作数,写在左面的称为目的操作数(表示操作结果存放的寄存器或存储器单元地址),写在右面的称为源操作数(指出操作数的来源)。
操作码与操作数之间必须用空格分隔,操作数与操作数之间必须用逗号“,”分隔。
3.1.2 指令分类及符号说明
1.指令分类
51的指令系统分为以下5大类。
1)数据传送类:片内RAM、片外RAM、程序存储器的传送指令、交换及堆栈指令。
2)算术运算类:加法、带进位加、减、乘、除、加1、减1指令。
3)逻辑运算类:逻辑与、或、异或、测试及移位指令。
4)控制程序转移类:无条件转移与调用、条件转移、空操作指令。
5)布尔变量操作类:分为位数据传送、位与、位或、位转移指令。
2.符号说明
为了便于查阅和学习单片机的指令系统,下面简单介绍描述指令的一些替代符号。
1)#data:表示指令中的8位立即数(data),“#”表示后面的数据是立即数。
2)#data16:表示指令中的16位立即数。
3)direct:表示8位内部数据存储器单元的地址。它可以是内部RAM的单元地址0~127,或特殊功能寄存器的地址,如I/O端口、控制寄存器、状态寄存器等(128~255)。
4)Rn:n=0~7,表示当前选中的寄存器区的8个工作寄存器R0~R7。
5)Ri:i=0或1,表示当前选中的寄存器区中的2个寄存器R0、R1,可作地址指针(即间址寄存器)。
6)Addr11:表示11位的目的地址。用于ACALL和AJMP的指令中,目的地址必须存放在与下一条指令第一个字节同一个2KB程序存储器地址空间之内。
7)Addr16:表示16位的目的地址。用于LCALL和LJMP指令中,目的地址范围在整个64KB的程序存储器地址空间之内。
8)rel:表示一个补码形式的8位带符号的偏移量。用于SJMP和所有的条件转移指令中,偏移字节相对于下一条指令的第一个字节计算,在-128~+127范围内取值。
9)DPTR:数据指针,可用作16位的地址寄存器。
10)bit:内部RAM或专用寄存器中的直接寻址位。
11)/:位操作数的前缀,表示对该位操作数取反,如/bit。
12)A:累加器ACC。
13)B:专用寄存器,用于MUL和DIV指令中。
14)C:进位/借位标志位,也可作为布尔处理机中的累加器。
15)@:间址寄存器或基址寄存器的前缀,如@Ri、@A+PC、@A+DPTR。
16)$:当前指令的首地址。
对于本书中指令注释部分的表示形式,作以下说明。
1)←:表示将箭头右边的内容传送至箭头的左边。
2)若X为任意一个寄存器,(X)作为源操作数则表示寄存器的内容,X作为目的操作数则表示该寄存器。例如,A←(A)+1表示A的内容加1的和送给A,A←(Rn)表示Rn的内容送给A。
3)若X为任意一个寄存器,则((X))作为源操作数表示X所指向的存储单元的内容,(X)作为目的操作数表示X所指的存储单元。例如,(Ri)←((Ri))+1则表示Ri所指向存储单元的内容加1后再送到该单元中去。
4)对于直接地址direct,则(direct)作为源操作数表示该地址单元的内容,作为目的操作数表示该地址单元。例如,(direct)←(direct)+1表示direct单元的内容加1的和送给direct单元,如(20H)←(20H)+1。