在前面章节的学习中,已经对单片机的内部结构和工作原理有了一个基本了解。在此基础上,本章将进一步介绍指令的格式、分类和寻址方式,并用大量实例阐述MCS-51指令系统中每条指令的含义和特点,以便为汇编语言设计打下基础。
单片机的功能是从外部世界接收信息,并在CPU中进行加工、处理,然后再将结果送回外部世界。要完成上述一系列操作,首先要提供一套具有特定功能的操作命令,这种操作命令就称为指令。CPU所能执行的各种指令的集合称为指令系统,不同的机种有不同的指令系统。例如,01001111B(4FH)代码,对于Z80CPU是完成将累加器A中的内容传送给寄存器C;对于M6800CPU是完成将累加器清零操作;而对MCS-51单片机却是完成累加器A和工作寄存器R7的“与”运算。
指令是CPU执行某种操作的命令,CPU所具有的全部指令的集合称为指令系统。指令系统是制造厂家在设计CPU时所赋予它的。用户必须正确书写和使用指令。学习指令系统,掌握指令的功能和应用是非常重要的,这是用汇编语言进行程序设计的基础。本章将详细介绍MCS-51单片机指令系统的寻址方式和各种指令。
以一组二进制码表示的指令称为机器指令。计算机只能识别和执行机器指令。在计算机中,指令依次地存储于程序存储器中。指令的编码规则称为指令格式。一条指令的二进制码位数称为指令的长度。不同类型的计算机,指令的长度和格式是不一样的,所能执行的指令类型和数目也不同,通常把某类计算机所能执行的全部指令的集合称为指令系统。
指令的具体格式依赖于计算机的结构特征,但指令的组成是一样的,都包含操作码和操作数两个部分。指令的一般格式为:
操作码 操作数
操作码用来表示执行什么性质和类型的操作,如加法、减法等。操作码的位数取决于计算机的指令系统中指令的条数。例如,对于32条指令的指令系统,操作码为5位。若指令系统中有N条指令,操作码的位数为n,则有关系式:
N≤2n
操作数用以指出参加操作的数据或数据的存储地址。
不同类型的指令,操作数的个数是不一样的。在具有多个操作数的指令中,各操作数分别称为第一操作数、第二操作数等。例如:加法指令,两个数a和b相加,a和b就是参加操作的两个操作数。对于加法等操作,有些计算机指令还指出存放操作结果的地址,另外一些计算机把运算结果总是存放在某一个寄存器中(称为累加器)。
若指令的操作数字段的内容就是一个参加操作的数据,则这种操作数称为立即数。对于大多数的指令,操作数存放于寄存器或存储器中(这部分存储器常称为数据存储器),此时指令的操作数字段仅指出操作数所在的寄存器或存储器地址。
存储器由若干单元组成,每个单元都有一个相应的地址(这类似于一幢大楼,有若干房间,每个房间都有房间号),计算机是根据地址对存储器存取数据的。存储器的地址也是由一组二进制码表示的,地址的位数依赖于存储器空间的大小。若存储器共有M个单元,地址有m位,则有:
2m≥M
产生操作数地址的方式称为寻址方式,常用的一般有立即寻址、直接寻址、间接寻址、寄存器寻址、相对寻址和变址寻址等。
一台计算机的功能在很大程度上依赖于它的指令系统。指令系统中指令越丰富,指令的功能越强,则程序设计越方便,速度越快,效率也越高。按照指令的功能,指令可以分成数据传送、算术运算、逻辑运算、位操作指令和程序控制等几种类型。
如前所述,计算机中的数据和指令都是一组二进制编码,它们是作为一个整体来进行处理和运算的,统称为机器字,简称字。一个机器字所包含的二进制码位数称为字长,更确切地说,字长是指CPU一次可处理(如数据传送、数据运算等)的二进制数的位数。计算机的字长应和存储器单元、运算器中各部件的位数相一致。
机器字的位数越多,它所表示的数据有效位数越多,精度就越高,运算的误差也越小,在运算速度一定的情况下,“字长”长的计算机,处理数据的速度高。
字长是衡量计算机性能的一个重要指标,为了便于处理,计算机的字长为字节的整数倍。一个字节为8位二进制码,根据字长分类,计算机常可以分为8位机、16位机、32位机和64位机等。
MCS-51单片机的指令系统专用于MCS-51系列单片机,它有42个操作码,代表33种操作功能,其中有的功能可以有几种操作码(如数据传送的操作码助记符有MOV、MOVC、MOVX等),指令的操作码与操作数各种可能的寻址方式相结合共有111条指令。其指令系统有如下特点。
(1)指令执行时间快。64条指令执行时间为1个机器周期,45条为两个机器周期,两条为4个机器周期(乘、除运算)。以12MHz晶振为例,1个机器周期时间为1ms,则64条指令的执行时间为1ms,45条指令的执行时间为2ms,2条指令的执行时间为4ms。
(2)指令短。其中单字节指令有49条,双字节指令有46条,最长的是三字节指令,只有16条。
(3)用一条指令即可实现两个一字节的相乘或相除。
(4)具有丰富的位操作指令。可对内部数据RAM和特殊功能寄存器中的直接位地址作多种位操作。
(5)可直接用传送指令实现端口的输入输出操作。
此外,MCS-51单片机的硬件结构中有一个位处理机,指令系统中相应地设计了一个处理位变量的指令子集。这个子集在设计需大量处理位变量的程序时十分有效和方便,是MCS-51指令系统的一大特色。
MCS-51指令系统可从不同角度进行分类。按指令的长度可分为单字节、双字节和多字节指令;按指令执行时间可分为单机器周期、双机器周期和4机器周期指令。注意,指令执行时间和指令的长度是两个完全不同的概念,前者表示执行一条指令所用的时间,后者表示一条指令在ROM中所占的存储空间,两者不能混淆。若按指令功能进行分类,MCS-51指令系统可分为数据传递与交换、算术运算、逻辑运算、程序转移、位操作、CPU控制6类。其中:
(1)数据传送类指令29条,分为片内RAM、片外RAM和ROM的传送指令,堆栈操作及数据交换指令。
(2)算术运算类指令24条,分为加、减、乘、除、加1、减1及十进制调整指令。
(3)逻辑运算类指令24条,分为逻辑“与”、“或”、“异或”、“非”及移位指令。
(4)位操作类指令12条,分为位传送、置位、清零及位逻辑运算指令。
(5)控制转移类指令22条,分为无条件转移、条件转移、比较转移、循环转移及子程序调用和返回指令。
在描述MCS-51指令系统时,经常使用各种缩写符号,其含义如表3-1所示。
表3-1 指令中常用符号及含义
符 号 |
含 义 |
A |
累加器ACC |
B |
寄存器B |
续上表
符 号 |
含 义 |
C |
进(借)位标志位,在位操作指令中作为位累加器使用 |
direct |
直接地址 |
bit |
位地址,内部RAM中的可寻址位和SFR中的可寻址位 |
#data |
8位常数(8位立即数) |
#data 16 |
16位常数(16位立即数) |
@ |
间接寻址 |
rel |
8位带符号偏移量,其值为-128~+127。在实际指令中通常使用标号,偏移量的计算由汇编 程序自动计算得出,不需要人工计算 |
Rn |
当前工作区(0~3区)的8个工作寄存器R0~R7 |
Ri |
可作为地址寄存器的工作寄存器R0和R1(i=0,1) |
(X) |
X寄存器内容 |
((X)) |
由X寄存器寻址的存储单元的内容 |
→ |
表示数据的传送方向 |
/ |
表示位操作数取反 |
∧ |
表示逻辑与操作 |
∨ |
表示逻辑或操作 |
" |
表示逻辑相异或操作 |