单片微型计算机原理及应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.2 MCS-51单片机指令系统基础

4.2.1 概述

MCS-51单片机指令系统具有功能强、指令短、执行快等特点。MCS-51单片机指令系统共有42种操作为助记符,用来描述33种操作功能,它由111条指令组成。

从功能上可划分为数据传送类指令(29条)、算术运算类指令(24条)、逻辑运算类指令(24条)、控制转移类指令(17条)、位操作类指令(17条);从空间属性上分为单字节指令(49条)、双字节指令(45条)和最长的三字节指令(17条);从时间属性上可分为单机器周期指令(64条)、双机器周期指令(45条)和乘、除两条需4个机器周期的指令。

MCS-51单片机指令系统在存储空间和执行时间方面具有较高的效率,是一种简明、易掌握、功能强的指令系统。

MCS-51单片机指令系统中有一个处理布尔变量的指令子集。这个指令子集在设计处理大量位变量程序时十分有效、方便,使MCS-51单片机更适合于实时控制,使其指令系统大增特色。

4.2.2 指令描述约定

为便于后面对MCS-51单片机指令系统的学习,在这里先对描述指令的一些符号的约定意义进行说明:

Rn:现行选定的工作寄存器区中8个寄存器R7~R0(n=0~7)。

direct:8位片内数据存储单元地址。它可以是一个内部数据RAM单元(0~127)或一个专用寄存器地址(即I/O接口、控制寄存器、状态寄存器等)(128~255)。

@Ri:通过寄存器R1或R0间接寻址的8位片内数据RAM单元(0~255),i=0,1。

#data:指令中8位立即数。

#data16:指令中16位立即数。

addr16:16位目标地址。用于LCALL和LJMP指令,可指向64KB程序存储器地址空间的任何地方。

addr11:11位目标地址。用于ACALL和AJMP指令,转向至下一条指令第一字节所在的同一个2KB程序存储器地址空间内。

rel:带符号的8位偏移量字节。用于SJMP和所有条件转移指令中。偏移字节相对于下一条指令第一字节计算,在-128~+127范围内取值。

bit:内部数据RAM或专用寄存器里的直接寻址位。

/bit:表示对该位取反操作。

(X):X中的内容。

((X)):由X所指向的单元中的内容。

4.2.3 寻址方式

寻址就是寻找指令中操作数或操作数所在的地址。

在高级语言编程时,程序设计人员不必关心程序和数据的内存空间的安排问题,但在汇编语言程序设计时,要针对系统的硬件环境编程,数据的存放、传送、运算都要通过指令来完成,编程者必须自始至终都十分清楚操作数的位置,以便将它们传送至适当的空间去操作。因此,如何寻找存放操作数的空间位置和提取操作数就变得十分重要。所谓寻址方式,就是如何找到存放操作数的地址,把操作数提取出来的方法,它是计算机的重要性能指标之一,也是汇编语言程序设计中最基本的内容之一。

MCS-51单片机基本寻址方式有7种:立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、基寄存器加变址寄存器间接寻址、相对寻址、位寻址。

1.立即寻址

指令中给出的是一个具体的数值,操作时是对该数据操作。立即数只能作为源操作数出现在指令中,紧跟在操作码的后面,作为指令的一部分与操作码一起存放在程序存储器中,可以立即得到并执行,不需要经过别的途径去寻找,故称为立即寻址。在汇编指令中,在一个数的前面冠以“#”号作为前缀,就表示该数为立即数。例如:

            MOV     A,#70H

指令中70H就是立即数。这一条指令的功能是执行将立即数70H传送到累加器A中的操作。该指令操作码的机器码为74H,占用一个字节存储单元,立即数70H存放在紧跟在其后的一个字节存储单元,作为指令代码的一部分。整条指令的机器码为74H 70H。

2.寄存器寻址

指令中给出的是某一寄存器的名字,操作时是将该寄存器中的内容取出来进行操作。例如:

            MOV     A,R0

指令中源操作数和目的操作数都是寄存器寻址。该指令的功能是把工作寄存器R0中的内容传送到累加器A中,如R0中的内容为70H,则执行该指令后A的内容也是70H。

寄存器寻址按所选定的工作寄存器R0~R7进行操作,指令机器码的低3位的8种组合000, 001, …, 110, 111分别指明所用的工作寄存器R0, R1, …, R6, R7。如MOV A,Rn(n=0~7),这8条指令对应的机器码分别位E8H~EFH。

累加器ACC、寄存器B、数据指针DPTR和进位C(位累加器C)也可用寄存器寻址方式访问,只是对它们的寻址,具体寄存器名隐含在操作码中。

3.直接寻址

指令中给出的是某一存储单元地址,操作时是对该单元中的内容进行操作。该地址指出了参与运算或传送的数据所在的字节单元或位的地址。例如:

            MOV     A,70H

指令中源操作数就是直接寻址,70H为操作数的地址。该指令的功能是把片内RAM地址为70H单元的内容送到A中。该指令的机器码为E5H 70H,8位直接地址在指令操作码中占一个字节。

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

① 特殊功能寄存器(特殊功能寄存器只能用直接寻址方式访问,既可以用它们的地址,也可以使用它们的名字)。

② 片内数据存储器的低128B(对于52子系列芯片,其内部数据存储器高128B(80~0FFH)不能用直接寻址方式访问)。

由于52子系列的片内RAM有256个单元,其高128个单元与SFR的地址是重叠的。为了避免混乱,单片机规定:直接寻址的指令不能访问片内RAM的高128 个单元(80H~FFH),若要访问这些单元只能用寄存器间接寻址指令,而要访问SFR只能用直接寻址指令。另外,访问SFR可在指令中直接使用该寄存器的名字来代替地址,如:

            MOV     A,80H

可以写成

            MOV     A,P0

因为P0口的地址为80H。

③位地址空间。

4.寄存器间接寻址

指令中给出的是某一寄存器的名字,操作时以该寄存器中的内容为地址,将该地址中的数据取出来进行操作。这里需要强调的是,寄存器中的内容并不表示操作数本身,而是操作数的地址,到该地址单元中才能得到操作数。寄存器起地址指针的作用。例如:

            MOV     A,@R1

指令的源操作数是寄存器间接寻址。该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到A中去。若R1中的内容为70H,片内RAM地址为70H的单元中的内容为2FH,则执行该指令后,片内RAM 70H单元的内容2FH被送到A中。寄存器间接寻址示意图如图4-2所示。

图4-2 寄存器间接寻址方式示意图

可用做寄存器间接寻址的寄存器只有工作寄存器R0、R1和DPTR。用R0、R1作为地址指针时,可寻址片内RAM的256个单元,但不能访问SFR块,也可以8位地址访问片外RAM的低256个地址单元。DPTR作为地址指针用于访问片外RAM的64KB范围。

5.基寄存器加变址寄存器间接寻址

指令中给出的是某一基寄存器(数据指针DPTR或PC)和某一变址寄存器(累加器A),操作时以给出的基寄存器和变址寄存器中的内容之和为地址,将该地址中的数据取出来进行操作。这种寻址方式常用于访问程序存储器中的常数表。例如:

            MOVC    A,@A+DPTR

指令中的源操作数就是这种寻址方式。该指令寻址及操作功能如图4-3所示。

图4-3 基寄存器加变址寄存器的间接寻址方式示意图

6.相对寻址

相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel,而构成实际操作数地址的寻址方式。它用于访问程序存储器,常出现在相对转移指令中。

在使用相对寻址时要注意以下两点:

① 当前PC值是指相对转移指令的存储地址加上该指令的字节数。例如:

            JZ  rel

是一条累加器A为0就转移的双字节指令。若该指令的存储地址为2050H,则执行该指令时的当前PC值即为2052H,即当前PC值是相对转移指令取指结束时的值。

② 偏移量rel是有符号的单字节数,以补码表示,其值的范围是-128~+127(00H~0FFH),负数表示从当前地址向前转移,正数表示从当前地址向后转移。所以相对转移指令满足条件后,转移的地址(目的地址)为

目的地址=当前PC值+rel=指令存储地址+指令字节数+rel

7.位寻址

位寻址是在位操作指令中直接给出位操作数的地址,可以对片内RAM中的128位和特殊功能寄存器SFR中的93位进行寻址。

虽然MCS-51单片机的寻址方式有多种,但指令对哪一个存储器空间进行操作是由指令的操作码和寻址方式确定的。总体来说,具有以下几点原则:

① 对程序存储器只能采用基寄存器加变址寄存器间接寻址方式。

② 对特殊功能寄存器空间只能采用直接寻址方式(可以用符号来代表地址),不能采用寄存器间接寻址方式。

③(对52单片机)内部数据存储器的高128B,只能采用寄存器间接寻址方式,不能采用直接寻址方式。

④ 内部数据存储器低128B既能采用寄存器间接寻址方式,又能采用直接寻址方式。

⑤ 外部扩展的数据存储器及I/O接口只能采用MOVX指令来访问。