单片机中级教程 第3章 指令系统

第3章 MCS-51系列单片机的指令系统

学习和使用单片机的一个最重要的环节就是理解和熟练掌握它的指令系统。不同种类的机型指令系统是不同的,本章将详细介绍MCS-51系列单片机指令系统的寻址方式、各类指令的格式及功能。

3.1 指令系统概述

指令是规定计算机进行某种操作的命令。一台计算机所能执行的指令集合称为该计算机的指令系统。计算机的主要功能是由指令系统来体现的。指令系统与机器密切相关,指令系统是由计算机生产厂商定义的,不同系列的机器其指令系统是不同的。

3.1.1 指令概述

计算机内部只识别二进制数。因此,能被计算机直接识别、执行的指令是使用二进制编码表示的指令,这种指令被称为机器语言指令。机器语言具有难学、难记、不易书写、难于阅读和调试、容易出错而且不易查找错误,程序可维护性差等缺点。为方便人们的记忆和使用,制造厂家对指令系统的每一条指令都给出了助记符,助记符是用英文缩写来描述指令的功能,它不但便于记忆,也便于理解和分类。以助记符表示的指令就是计算机的汇编语言指令,汇编语言指令与机器语言指令具有一一对应的关系。

与通常的计算机一样,MCS-51系列单片机也只能识别二进制编码表示的机器语言。同样,为了人们记忆和使用方便,也采用汇编语言指令来描述它的指令系统。

MCS-51系列单片机指令系统共有111条指令,按功能划分,可分为五大类:

1)数据传送类指令(29条); 2)算术运算类指令(24条); 3)逻辑运算及移位类指令(24条); 4)控制转移类指令(17条); 5)位操作类指令(17)。

3.1.2 指令格式

一条完整的MCS-51系列单片机汇编语言的指令格式如下:

[标号:] 〈操作码〉 [操作数] [;注释]

标号——标号是该指令的起始地址,是一种符号地址。

标号可以由1~8个字符组成,第一个字符必须是字母,其余字符可以是字母、数字或其他特定符号。标号后跟分界符“:”。

操作码——即指令的助记符。它规定了指令所能完成的操作功能。

操作数——指出了指令的操作对象。操作数可以是一个具体的数据,也可以是存放数据的单元地址,还可以是符号常量或符号地址等。

在一条指令中可能有多个操作数,操作数与操作数之间用逗号“,”分隔。 注释——为了方便阅读而添加的解释说明性的文字,用“;”开头。

操作码与操作数之间必须用空格分隔,带方括号项称为可选项。由指令格式可见,操作码是指令的核心,不可缺少。

1

在MCS-51系列单片机指令系统中,指令的字长有单字节、双字节、三字节三种,在程序存储器中分别占用1~3个单元。

3.1.3 指令中常用符号说明

在描述MCS-51系列单片机指令系统的功能时,经常使用的符号及意义如下: Rn ——当前选中的工作寄存器组中的寄存器R0~R7之一,所以n=0~7。

Ri ——当前选中的工作寄存器组中可作地址指针的寄存器R0、R1,所以i=0、1。 #data ——8位立即数。 #data16 ——16位立即数。

direct ——内部RAM的8位地址。即可以是内部RAM的低128个单元地址,也可以是特殊功能寄存器的单元地址或符号。因此在指令中direct表示直接寻址方式。 addr11 ——11位目的地址,只限于在ACALL和AJMP 指令中使用。

addr16 ——16位目的地址,只限于在LCALL和LJMP 指令中使用。 re l——补码形式表示的8位地址偏移量,在相对转移指令中使用。

bit ——片内RAM位寻址区或可位寻址的特殊功能寄存器的位地址; @ ——间接寻址方式中间址寄存器的前缀标志;

C ——进位标志位,它是布尔处理机的累加器,也称之为位累加器;

/ ——加在位地址的前面,表示对该位先求反再参与操作,但不影响该位的值; (x)——由x指定的寄存器或地址单元中的内容; ((x))——由x寄存器的内容作为地址的存储单元的内容; $ ——本条指令的起始地址;

← ——指令操作流程,将箭头右边的内容送到箭头左边的单元中。

3.2 寻址方式

在指令系统中,操作数是一个重要的组成部分,它指出了参加运算的数或数所在的单元地址。而如何找到这个操作数就称为寻址方式。寻址方式越多,则计算机的功能越强,灵活性亦越大,但指令系统也就越复杂。

寻址方式是汇编语言程序设计中最基本的内容之一,必须十分熟悉,牢固掌握。在上一章中,我们已介绍过MCS-51系列单片机系统的存储器分布,在学习寻址方式时,要特别注意在各种不同的存储区中,分别可以采用什么寻址方式。

MCS-51系列单片机提供了七种寻址方式,下面分别介绍。

3.2.1 立即寻址

所谓立即寻址就是操作数在指令中直接给出。通常把出现在指令中的操作数称为立即数。为了与直接寻址指令中的直接地址相区别,在立即数前面加“#”标志。例如: MOV A,#3AH

其中3AH就是立即数,该指令功能是将3AH这个数本身送入累加器A中。 3.2.2 直接寻址

在指令中直接给出操作数地址,这就是直接寻址方式。此时,指令的操作数部分就是操作数的地址。例如:

2

MOV A,3AH

其中3AH就是表示直接地址,其操作示意图如图3-1所示,该指令功能是把内部RAM地址为3AH单元中的内容68H传送给累加器A。

直接寻址方式可访问以下存储空间:

① 内部RAM低128个字节单元。在指令中直接地址以单元地址的形式给出。

② 特殊功能寄存器。

对于特殊功能寄存器,其直接地址还可以用特殊功能寄存器的符号名称来表示。 应注意,直接寻址是访问特殊功能寄存器的唯一方法。

图3-1 直接寻址示意图 图3-2 寄存器间接寻址示意图

3.2.3 寄存器寻址

寄存器寻址就是以寄存器的内容作为操作数。因此在指令的操作数位置上指定了寄存器就能得到操作数。采用寄存器寻址方式的指令都是一字节的指令,指令中以符号名称来表示寄存器。例如:

MOV A,R0 MOV R2,A

以上两条指令都是属于寄存器寻址。前一条指令是将R0寄存器的内容传送到累加器A。后一条是把累加器A中的内容传送到R2寄存器中。

由于寄存器在CPU内部,所以采用寄存器寻址可以获得较高的运算速度。能实现这种寻址方式的寄存器有:R0~R7、A、AB寄存器对和数据指针DPTR 3.2.4 寄存器间接寻址

所谓寄存器间接寻址就是以寄存器中的内容作为RAM地址,该地址中的内容才是操作数。寄存器间接寻址也需在指令中指定某个寄存器,也是以符号名称来表示寄存器的,为了区别寄存器寻址和寄存器间接寻址,用寄存器名称前加“@”标志,来表示寄存器间接寻址。例如:

MOV A,@R0 其操作示意图如图3-2所示。

这时R0寄存器的内容3AH是操作数地址,内部RAM的3AH单元的内容65H才是操作数,并把该操作数传送到累加器A,结果A=65H。若是寄存器寻址指令:

MOV A,R0 则执行结果A=3AH。对这两类指令的差别和用法,一定要区分清楚。间接寻址理解起来较为复杂,但在编程时是极为有用的一种寻址方式。

MCS-51系列单片机规定只能用寄存器R0、R1、DPTR作为间接寻址的寄存器。间接寻址可以访问的存储空间为内部RAM和外部RAM。

① 内部RAM的低128个单元采用R0、R1作为间址寄存器

3

② 外部RAM的寄存器间接寻址有两种形式:一是采用R0、R1作为间址寄存器,可寻址256个单元。二是采用16位的DPTR作为间址寄存器,可寻址外部RAM的整个64KB地址空间。

对于52子系列的单片机,其内部RAM是256个字节,其高128个字节与特殊功能寄存器的地址是重叠的,二者由不同的寻址方式加以区分。对52子系列的高128字节RAM,必须采用寄存器间接寻址方式访问。

3.2.5 变址寻址

变址寻址是以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器(存放地址偏移量),并以二者内容相加形成的16位地址作为操作数地址。例如:

MOVC A,@A+DPTR ;A ←((A)+(DPTR))

MOVC A,@A+PC ;A ←((A)+(PC))

第一条指令的功能是将A的内容与DPTR的内容相加形成操作数的地址(即程序存储器

的16位地址 ),把该地址中的内容送入累加器A中,如图3-3所示。第二条指令的功能是将A的内容与PC的内容相加形成操作数的地址(ROM16位地址),把该地址中的内容送入累加器A中。

这两条指令常用于访问程序存储器中的数据表格。且都为一字节指令。

图3-3 变址寻址示意图

3.2.6 相对寻址

相对寻址只在相对转移指令中使用,指令中给出的操作数是相对地址偏移量rel。相对寻址就是将程序计数器PC的当前值与指令中给出的偏移量rel相加,其结果作为转移地址送入PC中。此种寻址方式的操作是修改PC的值,故可用来实现程序的分支转移。

PC当前值是指正在执行指令的下条指令的地址。rel是一个带符号的8位二进制数,取值范围是-128~+127,故rel给出了相对于PC当前值的跳转范围。例如:

SJMP 54H

这是无条件相对转移指令,是双字节指令,指令代码为80H、54H,其中80H是该指令的操作码,54H是偏移量。现假设此指令所在地址为2000H,执行此指令时,PC当前值为2000H+02H,则转移地址为:

2000H+02H+54H=2056H 故指令执行后,PC的值变为2056H,程序的执行发生了转移。其寻址方式如图3-4所示。 3.2.7 位寻址

4

联系客服:779662525#qq.com(#替换为@)