第4章 MCS-51系列单片机指令系统
指令是CPU执行某种操作的命令,CPU所具有的全部指令的集合称为指令系统。计算机的指令系统是表征计算机性能的重要指标,每种类型的计算机都有自己的指令系统。指令系统是制造厂家在设计CPU时所赋予它的功能,用户必须正确书写和使用。因此,学习指令系统,掌握指令的功能和应用是十分重要的,这是用汇编语言进行程序设计的基础。本章我们将详细介绍MCS-51系列单片机指令系统的功能和使用方法。
4.1 概述
4.1.1 指令和指令系统
微型计算机的功能是从外部世界接受信息,经CPU加工、处理,然后把结果送到计算机外部。设计一台计算机,首先要提供一套具有特定功能的操作命令,这种操作命令称为指令。CPU所能执行的各种指令的集合称为指令系统。从指令是反映计算机内部的一种操作来看,指令系统全面展示了计算机的操作功能,也就是它的工作原理;从用户使用的角度看,指令系统是提供用户使用计算机功能的软件资源。
设计一种微处理器,一般从设计指令开始。指令系统因机种不同而异。例如代码01001111B(4FH),对Z80CPU是将累加器A中的内容传送给寄存器C;对于M6800 CPU是将累加器A清零;而对MCS-51单片机却是将累加器A和工作寄存器R7进行“与”操作。
指令一般有功能、时间和空间三种属性。功能属性是指每条指令所对应的一个特定的操作功能;时间属性是指一条指令执行所用的时间,一般用机器周期来表示;空间属性是指一条指令在程序存储器中存储时所占用的字节数。这三种属性在使用中最重要的是功能属性,但时间、空间属性在有些场合也要用到。如一些实时控制应用程序中,有时需要计算一个程序段的确切执行时间或编写软件延时程序,这时就都要用到每条指令的时间属性;在程序存储器的空间设计或进行相对转移指令的偏移量计算时,就要用到指令的空间属性。不同情况下关注的属性是不同的。
微型计算机的指令系统由几十条到几百条指令构成。每种指令又由两个字段构成,即操作码字段和操作数字段。操作码字段表明指令执行何种性质的操作,例如加法操作、减法操作、传送操作等。它由一组二进制代码表示,在汇编语言中又用助记符代表。操作数字段指明指令的操作所需要的数据。该字段中,可以是操作数本身或操作数地址。在指令中,操作数可有一个或两个,前者称为单操作数指令,后者称为双操作数指令,而双操作数又分别称为源操作数和目的操作数。
一种CPU的指令系统是该CPU本身所固有的,用户无法改变,只能接受和应用它。虽然各种CPU指令系统各不相同,但它们的指令类型、指令格式、指令基本操作及寻址方式有很多共同之处。因此学习好一种CPU的指令系统,再掌握其他CPU的指令系统就容易了。
4.1.2 程序与程序设计
计算机要完成一项工作,必须按要求去执行各种操作,即一步步地执行一条条指令,这些按预定要求编排的指令序列称为程序。编排程序的过程称为程序设计。程序必须存放在存储器中,CPU逐条取出指令并执行之,从而完成预定的任务。下面通过一个例子进行说明。
【例4-1】 在程序存储器中存放着一个ASCII码表,通过查表,将十六进制数转换成ASCII码。设十六进制数存放在R0中的低4位,要求将转换后的ASCII码送回到R0中(用MCS-51单片机指令编写)。
如图4-1 所示,程序和数据块已存放在存储器中,都是以二进制数的形式存放的。带“·”的地址中存放的是指令的操作码,这些操作码规定了机器执行什么操作;程序中还有指令的操作数,是指令的操作对象,地址单元3008H~3017H中存放的是0~F的ASCII码。在微机应用中,大量的工作是编写程序。程序设计过程就是根据任务要求和算法,从指令系统中选取合适的指令,给出必要的操作数(或操作数地址),加以合理的排列而得到程序的一个过程。
图4-1 程序和表格在存储器中存放示意图
上例中的二进制代码称为指令代码。由于计算机的CPU只能认识和识别二进制代码,所以又称为机器码。一种计算机有几十种甚至上百种机器指令,都用二进制码表示是很困难的。所以,通常用十六进制码表示指令码,但这仍解决不了记忆问题和阅读问题。
为了记忆和阅读方便,制造厂家对指令系统中的每一条指令都给出了符号作为指令助记符。如图4-1中的第一个操作码“11101000”用MOV A,R0表示,“01010100”和“00001111”用ANL A,#0FH表示等,这就容易记忆,容易理解,清晰可读。
用助记符(操作符)、操作数(或其地址)和标号编写的程序称为汇编(符号)语言程序。用汇编语言编写的例4-1的程序如下:
标号 操作码 操作数 注释 ORG 0000H ASCCB: MOV A,R0 ;取数 ANL A,#0FH ;屏蔽高4位 ADD A,#02H ;变址调整 MOVC A,@A+PC ;查表 MOV R0,A ;送结果 RET ;返回 ASCTAB: DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H
汇编(符号)语言程序也称为源程序,计算机要执行程序,需要将源程序翻译成机器语言,这个过程称为汇编。有时需要将机器语言翻译成源程序,这个过程称为反汇编。
为了完成源程序的汇编工作,汇编程序给程序员在程序格式上做了一些规定。上例中给出的是汇编语言的标准格式。一个汇编语言程序由若干行组成,每行包含一条指令。每行分为4个区段:
[标号:] 操作码 [操作数] [;注释]
每行除操作码部分是必需的外,其他带中括号的区段是任选项,不是必需的。
在4个区段之间要用分隔符分开,标号后接一冒号,操作码和操作数之间用一空格隔开,注释段用一分号开始。另外,使用汇编语言编写的程序(源程序)不要求每行的各个区段都一一对齐,但将各个区段对齐可使程序就更加清晰、可读。
① 标号是该指令的符号地址,标号值代表这条指令在程序存储器中的存放地址,可根据需要设定。标号必须以字母开始,以冒号“:”结束,所用字符一般不超过8个(视汇编程序版本不同而异)。系统中保留使用的字符或字符组成不能用做标号。一旦某个标号赋给某个语句,则其他语句的操作数可以直接引用该标号,以便寻址或控制程序转移。标号在每条语句中是任选项。
② 操作码在汇编语言中由英文字母缩写而成。操作码是汇编语言程序每一句所必需的部分,它决定了语句的操作性质,反映了指令的功能。操作码和操作数之间用空格分开。
③ 操作数指示出的是参加运算的数据,可以是数字、操作数地址、寄存器等。操作数又分为目的操作数和源操作数两种,二者之间用逗号“,”分开。另外,有些语句中可以无操作数,只是一个命令。
④ 注释以分号“;”开头,计算机在汇编时对这部分不予处理,是程序员对指令操作的解释。注释必须在一行之内写完,换行时需要另外以分号“;”开始。注释内容可为任何字符。不需要每行都加注释,仅在某些关键行注释就可以了。
编程者(程序员)在编程时,一定要严格按规定的格式书写程序。
4.1.3 操作数的类型
计算机在工作过程中,主要是对数据的处理,即对操作数的处理。
操作数的类型有三种:立即数、寄存器操作数、存储器操作数。
1.立即数
立即数是作为指令代码的一部分出现在指令中的,它通常作为源操作数使用。
在汇编指令中,立即数可以用二进制、十六进制或十进制等数制形式表示,也可以写成一个可求出确定值的表达式来表示。
2.寄存器操作数
寄存器操作数把操作数存放在寄存器中,即用寄存器存放源操作数或目的操作数。
通常在指令中给出寄存器的名称,在双操作数指令中,可以作为源操作数,也可以作为目的操作数。
3.存储器操作数
存储器操作数把操作数放在存储器中,因此在汇编指令中给出的是存储器的地址。