单片机原理及应用教程(第4版)
上QQ阅读APP看书,第一时间看更新

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。