51单片机原理以及接口技术(三)-80C51的指令系统

80C51单片机的指令系统详解

指令是CPU按照人们的意图来完成某种操作的命令。一台计算机的CPU所能执行全部指令的集合称为这个CPU的指令系统。指令系统功能的强弱决定了计算机性能的高低
80C51单片机具有111条指令,其指令系统的特点为:
(1)执行时间短。1个机器周期指令有64条,2个机器周期指令有45条,而4个机器周期指令仅有2条(即乘法和除法指令);
(2)指令编码字节少。单字节的指令有49条,双字节的指令有45条,三字节的指令仅有17条
(3)位操作指令丰富。这是80C51单片机面向控制特点的重要保证。

点击此处访问小编的个人小站在这里插入图片描述
  大部分学单片机就是从C语言开始的,但是汇编语言还是需要了解的。只有了解了汇编语言之后你才能进阶,才能成为真正的大神。这一节看完后你就会明白C语言是如何转换成汇编的。

3.1 指令格式及常用符号

  计算机能直接识别和执行的指令是二进制编码指令,称为机器指令。机器指令不便于记忆和阅读。
为了编写程序的方便,人们采用了有一定含义的符号(助记符)来表示机器指令,从而形成了所谓的符号指令。由于符号指令是机器指令的符号表示, 所以它与机器指令有一一对应的关系。符号指令转换成机器指令后,单片机才能识别和执行。

3.1.1 机器指令的编码格式

  机器指令通常由操作码和操作数(或操作数地址)两部分构成。操作码用来规定指令执行的操作功能,如加、减、比较、移位等 ;操作数是指参与操作 的数据(在指令编码中通常给出该数据的不同寻找方法)。
80C51 的机器指令按指令字节数分为三种格式:单字节指令、双字节指令和三字节指令。
  一、单字节指令
  单字节指令有两种编码格式:

  1.8 位编码仅为操作码
8 位编码仅为操作码
  这种指令的 8 位编码仅为操作码,指令的操作数隐含在其中。例如: INC A
  该指令的编码为 0000 0100B,其十六进制表示为 04H,累加器 A 隐含在操作码中。指令的功能是累加器 A 的内容加 1。
注意:在指令中用“A”表示累加器,而用“ACC”表示累加器对应的地址(E0H)

  2.8 位编码含有操作码和寄存器编码8 位编码含有操作码和寄存器编码
  这种指令的高 5 位为操作码,低 3 位为存放操作数的寄存器编码。如指令MOV A,R0 的编码为 1110 1000B,其十六进制表示为 E8H(低 3 位 000 为寄存器 R0 的编码)。该指令的功能是将当前工作寄存器 R0 中的数据传送到累加器 A 中。

  二、双字节指令
双字节指令
  这类指令的第一个字节表示操作码,第二个字节表示参与操作的数据或数据存放的地址。如数据传送指令 MOV A,#50H 的两字节编码为 0111 0100B,0101 0000B。其十六进制表示为 74H,50H。该指令的功能是将立即数“50H” 传送到累加器 A 中。

三、三字节指令
三字节指令
  这类指令的**第一个字节表示该指令的操作码,后两个字节表示参与操作的 数据或数据存放的地址。**例如数据传送指令 MOV 20H,#50H 的三个字节编码为0111 0101B,0010 0000B,0101 0000B。其十六进制表示为 75H,20H,50H。该指令的功能是将立即数“50H”传送到内部 RAM 的 20H 单元中。

比如一个数10,把他存入内存中,高级语法是int i=10;这个10存入内存之前叫做立即数,放入之后就不是了。

3.1.2 符号指令的格式

  80C51 指令系统的符号指令通常由操作助记符、目的操作数、源操作数及 指令的注释几部分构成。一般格式为: 操作助记符 [目的操作数][,源操作数][;注释]
  操作助记符表示指令的操作功能;操作数是指令执行某种操作的对象,它可以是操作数本身,可以是寄存器,也可以是操作数的地址。
  在 80C51 的指令系统中,多数指令为两操作数指令。当指令操作数隐含在操作助记符中时,在形式上这种指令无操作数。另有一些指令为单操作数指令或三操作数指令。在指令的一般格式中使用了可选择符号“[ ]”,其包含的内容因指令的不同可以有或无。
  在两个操作数的指令中,通常目的操作数写在左边,源操作数写在右边。
  例如:指令 ANL A,#40H 完成的任务是将立即数“40H”同累加器 A 中的数进行“与”操作,结果送回累加器。这里 ANL 为“与”操作的助记符,立即数“40H”为源操作数,累加器 A 为目的操作数(注:在指令中,多数情况下累加器用“A”表示,仅在直接寻址方式中,用“ACC”表示累加器在 SFR 区的具 体地址 E0H。试比较,指令 MOV A,#30H 的机器码为 74H、30H;而指令 MOV ACC,#30H 的机器码为 75H、E0H、30H。)。

3.13 符号指令及其注释中常用的符号及含义如下所示:

Rn(n=0–7)–当前选中的工作寄存器组中的寄存器 R0~R7 之一;
Ri(i=0,1)–当前选中的工作寄存器组中的寄存器 R0 或 R1;
@ -------------间址寄存器前缀;
#data ------------8 位立即数; //一个字节的常量
#data16---------16 位立即数;//两个字节的常量
direct------------片内低 128 个 RAM 单元的地址、SFR 的地址(可用符号名称表示);
addr11-----------11 位目的地址;
addr16-----------16 位目的地址;
rel----------------补码形式表示的 8 位地址偏移量,其值在-128~+127 范围内;
bit----------------片内RAM 位地址、SFR 的位地址(可用符号名称表示);
/-----------------位操作数的取反操作前缀;
(×)-------------表示 × 地址单元或寄存器中的内容;
((×))----------表示以 × 单元或寄存器中的内容为地址间接寻址单元的内容;
← ----------------将箭头右边的内容送入箭头左边的单元中。

3.2 80C51 的寻址方式

  寻址方式就是寻找操作数或指令地址的方式。寻址方式包含两方面内容:,二是指令地址的寻址(如转移指令、调用指令)。寻址方式是计算机性能的具体体现,也是编写汇编语言程序的基础。
  对于两操作数指令,源操作数有寻址方式,目的操作数也有寻址方式。若不特别声明,后面提到的寻址方式均指源操作数的寻址方式。
  80C51 单片机的寻址方式有七种,即寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、基址寄存器加变址寄存器变址寻址、相对寻址和位寻址。这些寻址方式所对应的寄存器和存储空间如表 3.1 所示。
表 3.1 寻址方式所对应的寄存器和存储空间
结合下图80C51 的数据存储器配置图来看:
在这里插入图片描述
  注:前四种寻址方式完成的是操作数的寻址,属于基本寻址方式;变址寻址实际上是间接寻址的推广;位寻址的实质是直接寻址;相对寻址是指令地址的寻址。

3.2.1 寄存器寻址

  若操作数存放在寄存器中,指令中直接给出该寄存器的名称,这种寻址方式称为寄存器寻址。采用寄存器寻址可以获得较高的传送和运算速度。
  在寄存器寻址方式中,用符号名称表示寄存器。在形成的操作码中隐含有指定寄存器的编码(注意:该编码不是该寄存器在内部 RAM 中的地址)。
采用寄存器寻址的寄存器有:

  • 工作寄存器 R0~R7(由 PSW 中的 RS1、RS0 指定当前工作寄存器组号);
  • 累加器 A(注:使用符号 ACC 表示累加器时属于直接寻址);
  • 寄存器 B(以 AB 寄存器对形式出现);
  • 数据指针 DPTR。

  例如:MOV A,R0
  该指令的功能是将R0 中的内容传送到累加器。操作数采用寄存器寻址方式。例如:(R0)=30H,则指令执行后,A 的内容为 30H。
如图 3.1 所示。
图 3.1 指令 MOV A,R0 的执行示意图

3.2.2 直接寻址

  指令操作码之后的字节存放的是操作数的地址码,操作数本身存放在地址码指示的存储单元中,这种寻址方式称为直接寻址。
  采用直接寻址的存储空间为:

  • 片内 RAM 低 128 字节(以地址形式表示);
  • SFR(以地址形式或 SFR 符号形式表示,但符号将转换为相应的 SFR 地址)。

  例如:若(50H)=3AH,执行指令 MOV A,50H 后,结果为:(A)=3AH
  该指令的功能是将片内 RAM 的 50H 单元的内容“3AH”传送到累加器。操作数采用直接寻址方式
如图 3.2 所示。
图 3.2 指令 MOV A,50H 的执行示意图
  在直接寻址方式中的 SFR 经常采用符号形式表示。例如:MOV A,P1(此指令又可以写成 MOV A,90H。这里“90H”是 P1 口的地址)
  需要特别注意的是,片内 RAM 高 128 字节(对于 80C32 或 80C52 的情况) 必须采用寄存器间接寻址方式。

3.2.3 寄存器间接寻址

  寄存器中的内容为地址,从该地址去取操作数的寻址方式称为寄存器间接寻址。寄存器间接寻址对应的空间为:

  • 片内 RAM(采用@R0,@R1 或 SP);
  • 片外 RAM(采用@R0,@R1 或@DPTR)。

  寄存器间接寻址的存储空间为片内 RAM 或片外 RAM。片内 RAM 的数据传送采用“MOV”类指令,间接寻址寄存器采用寄存器 R0 或 R1(堆栈操作时采用 SP)。片外 RAM 的数据传送采用“MOVX”类指令,间接寻址寄存器有两种选择,一是采用 R0 和 R1 作间址寄存器,这时 R0 或 R1 提供低 8 位地址,高 8 位地址由 P2 口提供;二是采用 DPTR 作为间址寄存器。
  例如:若(R0)=30H,(30H)=5AH,执行指令 MOV A,@R0 后,A 的内容为5AH。
  该例中用寄存器间接寻址将片内RAM 中由R0的内容为地址所指示单元的内容传送到累加器。该指令的操作数采用寄存器间接寻址方式
如图 3.3 所示。
图 3.3 指令 MOV A,@R0 的执行示意图
采用“MOVX”类操作的片外 RAM 的数据传送指令如:

MOVX   A,@R0
MOVX   A,@DPTR

3.2.4 立即寻址

  指令编码中直接给出操作数的寻址方式称为立即寻址。在这种寻址方式中,紧跟在操作码之后的操作数称为立即数。立即数可以为一个字节,也可以为两个字节,并要用符号“#”来标识。由于立即数是一个常数,所以只能作为源操作数。
  立即寻址所对应的寻址空间为:ROM 空间。
  例如:MOV A,#50H
  该指令的功能是将 8 位的立即数“50H”传送到累加器。指令的操作数采用立即寻址方式
如图 3.4 所示。
图 3.4 指令 MOV A,#50H 的执行示意图
  又如:MOV DPTR,#2100H; DPTR←2100H
  该指令的功能是将 16 位的立即数“2100H”传送到数据指针寄存器 DPTR 中,立即数的高 8 位“21H”装入 DPH 中,低 8 位“00H”装入 DPL 中。

3.2.5 变址寻址

  以一个基地址加上一个偏移量地址形成操作数地址的寻址方式称为变址寻址。在这种寻址方式中,以数据指针 DPTR 和程序计数器 PC 作为基址寄存器, 累加器 A 作为偏移量寄存器,基址寄存器的内容与偏移量寄存器的内容之和作为操作数地址。
  变址寻址方式用于对程序存储器中的数据进行寻址。由于程序存储器是只读存储器,所以变址寻址操作只有读操作而无写操作。
  变址寻址所对应的寻址空间为:ROM 空间(采用@A+DPTR,@A+PC)。
  例如:MOVC A,@A+DPTR
  若指令执行前:(A)=0FH,(DPH)=24H,(DPL)=00H,即(DPTR)=2400H。程序存储器的 240FH 单元的内容为 88H,即(240FH)=88H。执行指令 MOVC A,@A+DPTR时,首先将 DPTR 的内容 2400H 与累加器 A 的内容 0FH 相加,得到地址 240FH, 然后将该地址的内容 88H 取出传送到累加器。 这时,A 的内容为 88H,原来 A的内容 0FH 被冲掉,
如图 3.5 所示。
图 3.5 指令 MOVC A,@A+DPTR 的执行示意图
  另外两条变址寻址指令为:

MOVC A,@A+PC
JMP	    @A+DPTR

  前一条指令的功能是将累加器的内容与 PC 的内容相加形成操作数地址,把该地址中的数据传送到累加器中。后一条指令的功能是将累加器的内容与 DPTR 的内容相加形成指令跳转地址,从而使程序转移到该地址运行

3.2.6 相对寻址

  相对寻址是以程序计数器 PC 的当前值(指读出该双字节或三字节的跳转指令后,PC 指向的下条指令的地址)为基准,加上指令中给出的相对偏移量 rel 形成目标地址的寻址方式。此种寻址方式的操作是修改 PC 的值,所以主要用于实现程序的分支转移。
  在跳转指令中,相对偏移量 rel 给出相对于 PC 当前值的跳转范围,其值是一个带符号的 8 位二进制数,取值范围是-128~+127,以补码形式置于操作码之后存放。执行跳转指令时,先取出该指令,PC 指向当前值。再把 rel 的值加到 PC 上以形成转移的目标地址,如图 3.6 所示。
图 3.6 指令 JC rel 的执行示意图
  在图 3.6 中,在程序存储器的 1000H 和 1001H 单元存放的内容分别为 40H 和 75H,且(CY)=1。“40H”为指令 JC rel 的操作码,偏移量 rel=75H。CPU 取出该双字节指令后,PC 的当前值已是 1002H。所以,程序将转向(PC)+75H 单元,即目标地址为 1077H 单元。而 1000H 单元可以称作指令“JC rel”的源地址。
  实际应用中,经常需要根据已知的源地址和转向的目的地址计算偏移量rel。正向跳转时,目的地址大于源地址,地址差为目的地址减源地址,对于双字节指令有:
  rel = 地址差-2
  反向跳转时,目的地址小于源地址,地址差为负值,rel 则应以补码表示: rel = FEH-地址差的绝对值
  例如:源地址为 1005H,目的地址为 0F87H。当执行指令“JC rel”时, rel 为多少?
  由公式可知,rel = FEH-地址差的绝对值 = FEH-7EH=80H
  应当注意的是:对于三字节相对转移指令,正向跳转时,rel = 地址差-3; 反向跳转时,rel= FDH-地址差的绝对值。

3.2.7 位寻址

  对位地址中的内容进行操作的寻址方式称为位寻址。采用位寻址指令的操作数是 8 位二进制数中的某一位。指令中给出的是位地址。位寻址方式实质属于位的直接寻址。
  位寻址所对应的空间为:

  • 片内 RAM 的 20H~2FH 单元中的 128 可寻址位;
  • SFR 的可寻址位。
      习惯上,特殊功能寄存器的寻址位常用符号位地址表示。例如:
CLR ACC.0
MOV 30H,C

  第一条指令的功能是将累加器 ACC 的位 0 清 0。第二条指令的功能是把位累加器(注:在指令中用“C”表示)的内容传送到片内 RAM 位地址为 30H 的位置。

3.3 数据传送类指令(29 条)

  在 80C51 单片机中,传送类指令占有较大的比重。数据传送是进行数据处理的最基本的操作,这类指令一般不影响标志寄存器 PSW 的状态。
  传送类指令可以分成两大类。一是采用 MOV 操作符,称为一般传送指令。 二是采用非 MOV 操作符,称为特殊传送指令。这些操作符有 MOVC、MOVX、PUSH、POP、XCH、XCHD 和 SWAP。

3.3.1 一般传送指令

  一般传送指令采用的指令助记符为 MOV(Move)。各指令情况如表 3.2所示。
表 3.2 一般传送指令

一、16 位传送

  MOV DPTR,#data16 ; DPTR <–data16
  这条指令的功能是将源操作数 data16(通常是地址常数)送入目的操作数。源操作数的寻址方式为立即寻址。

  例如:执行指令 MOV DPTR,#1234H 后,(DPH)=12H,(DPL)=34H。

二、8 位传送

  8 位的传送指令属于字节传送,指令完成的任务是将源字节内容拷贝到目的字节,而源字节的内容不变。通用的格式为:
  MOV <目的字节>,<源字节> ;
  由于目的字节和源字节都能够采用多种寻址方式,所以这类指令可以扩展成多条指令。为了方便记忆,先考察下面的关系:

  由于在 5 种源字节中,只有#data不能用作目的字节,所以可以用 4 种目的字节为基础构造 4 类指令。相应的源字节选择依据是:

  • 源字节与目的字节不相同(除 direct 外);
  • 寄存器寻址与寄存器间接寻址间不相互传送。

依此构造的 4 类指令如下:
1.以 A 为目的
在这里插入图片描述
  这组指令的功能是把源字节送入累加器中源字节的寻址方式分别为直接寻址、寄存器间接寻址、寄存器寻址和立即寻址四种基本寻址方式。
  例如:若(R1)= 20H,(20H)= 55H,执行指令 MOV A,@R1 后,(A)= 55H。
2.以 Rn 为目的
在这里插入图片描述
  这组指令的功能是把源字节送入寄存器Rn中。源字节的寻址方式分别为立即寻址、直接寻址和寄存器寻址(由于目的字节为工作寄存器,所以源字节不能是工作寄存器及其间址方式寻址)。
  例如:若(50H)= 40H,执行指令 MOV R6,50H 后,(R6)= 40H。
3.以 direct 为目的

在这里插入图片描述
  这组指令的功能是把源字节送入 direct 中。源字节的寻址方式分别为立即寻址、直接寻址、寄存器间接寻址和寄存器寻址
  例如:若(R1)=50H,(50H)=18H,执行指令 MOV 40H,@R1 后,(40H)=18H。
4.以@Ri 为目的
在这里插入图片描述
  这组指令的功能是把源字节送入 Ri 内容为地址的单元。源字节寻址方式为立即寻址、直接寻址和寄存器寻址(因目的字节采用寄存器间接寻址,故源字节不能是寄存器及其间址寻址)。
  例如:若(R1)=30H,(A)=20H,执行指令 MOV @R1,A 后,(30H)=20H。

3.3.2 特殊传送指令

首先明确一点,操作 片内RAM用MOV助记符,操作 片外RAM用MOVX助记符、操作 ROM用MOVC助记符。

  特殊传送指令的操作符为 MOVC、MOVX、PUSH、POP、XCH、XCHD 和 SWAP。它们可以分为 ROM 查表、外部 RAM 读写、堆栈操作和交换指令,如表 3.3 所示。
3.3  数据传送类指令(29 条)

一、ROM 查表

  通常 ROM 中可以存放两方面的内容:一是单片机执行的程序代码,二是一些固定不变的常数(如表格数据、字段代码等)。访问 ROM 实际上指的是读 ROM 中的常数。在 80C51 单片机中,读 ROM 中的常数采用变址寻址,并须经过累加器完成。
  指令助记符为 MOVC(Move Code)。
  1.DPTR 内容为基址
  MOVC A,@A+DPTR ;A ←((A)+(DPTR))
  该指令首先执行 16 位无符号数加法,将获得的基址与变址之和作为 16 位的程序存储器地址,然后将该地址单元的内容传送到累加器 A。指令执行后 DPTR 的内容不变。但应注意,累加器 A 原来的内容被破坏。
  例如:若(DPTR)=3000H,(A)=20H,执行指令 MOVC A,@A+DPTR 后,程序存储器 3020H 单元的内容送入 A。
  2.PC 内容为基址
  MOVC A,@A+PC ;A ←((A)+(PC))
  取出该单字节指令后 PC 的内容增 1,以增 1 后的当前值去执行 16 位无符号数加法,将获得的基址与变址之和作为 16 位的程序存储器地址。然后将该地址单元的内容传送到累加器 A。指令执行后 PC 的内容不变。但应注意,累加器A 原来的内容被破坏。
  此两条指令主要用于程序存储器的查表。

二、读写片外 RAM

  在片外 RAM 中经常存放数据采集和处理的一些中间数据。访问片外 RAM 的操作可以有读和写两大类。在 80C51 单片机中,读和写片外 RAM 均采用 MOVX 指令,均需经过累加器完成,只是传送的方向不同。数据采用寄存器间接寻址。
  指令助记符为 MOVX(Move External)。
  1.读片外 RAM
    MOVX A,@DPTR ; A ←((DPTR))
    MOVX A,@Ri ; A ←((Ri P2))
  第一条指令以 16 位 DPTR 为间址寄存器读片外 RAM,可以寻址整个 64K 字节的片外 RAM 空间。指令执行时,在 DPH 中的高 8 位地址由 P2 口输出,在 DPL 中的低 8 位地址由 P0 口分时输出,并由 ALE 信号锁存在地址锁存器中。
  第二条指令以 R0 或 R1 为间址寄存器,也可以读整个 64K 字节的片外 RAM 空间。指令执行时,高 8 位地址在 P2 中,由 P2 口输出;低 8 位地址在 R0 或R1 中,由 P0 口分时输出,并由 ALE 信号锁存在地址锁存器中。
  读片外 RAM 的 MOVX 操作,使 P3.7 引脚输出的RD 信号选通片外 RAM 单元, 相应单元的数据从 P0 口读入累加器中。
  例如:若(DPTR)=3000H,(3000H)=30H,执行指令 MOVX A,@DPTR 后,A的内容为30H。
  2.写片外 RAM
    MOVX @DPTR,A ;((DPTR))←(A)
    MOVX @Ri,A ;((P2Ri))←(A)
  第一条指令以 16 位 DPTR 为间址寄存器写外部 RAM,可以寻址整个 64K 字节的片外 RAM 空间。指令执行时,在 DPH 中的高 8 位地址由 P2 口输出,在 DPL 中的低 8 位地址由 P0 口分时输出,并由 ALE 信号锁存在地址锁存器中。
  第二条指令以 R0 或 R1 为间址寄存器,也可以写整个 64K 字节的片外 RAM 空间。指令执行时,高 8 位地址在 P2 中,由 P2 口输出;低 8 位地址在 R0 或R1 中,由 P0 口分时输出,并由 ALE 信号锁存在地址锁存器中。
  写片外 RAM 的“MOVX”操作,使 P3.6 引脚的WR 信号有效,累加器 A 的内容从 P0 口输出并写入选通的相应片外 RAM 单元。
  注:当片外扩展的 I/O 接口映射为片外 RAM 地址时,也要利用这 4 条指令进行数据的输入输出。
  例如:若(P2)= 20H,(R1)= 48H,(A)= 66H,执行指令 MOVX @R1,A 后,外部 RAM 单元 2048H 的内容为 66H。

三、堆栈操作

  堆栈是在内部 RAM 中按“后进先出”的规则组织的一片存储区。此区的一端固定,称为栈底;另一端是活动的,称为栈顶。栈顶的位置(地址)由堆栈指针 SP 指示(即 SP 的内容是栈顶的地址)。
  在 80C51 单片机中,堆栈的生长方向是向上的(地址增大)。入栈操作时, 先将 SP 的内容加 1,然后将指令指定的直接地址单元的内容存入 SP 指向的单元;出栈操作时,先将 SP 指向的单元内容传送到指令指定的直接地址单元,然后 SP 的内容减 1。
系统复位时,SP 的内容为 07H。通常用户应在系统初始化时对 SP 重新设置。SP 的值越小,堆栈的深度越深。
  堆栈操作指令助记符为 PUSH 和 POP。
  PUSH direct ;SP ←(SP)+ 1,(SP)←(direct)
  POP direct ;direct←((SP)),SP ←(SP) 1
  这两条指令可以实现操作数入栈和出栈操作。前一条指令的功能是先将栈指针 SP 的内容加 1,然后将直接地址指出的操作数送入 SP 所指示的单元。后一条指令的功能是将 SP 所指示的单元的内容先送入指令中的直接地址单元,然后再将栈指针 SP 的内容减 1。
  例如:若(SP)=07H,(40H)=88H,执行指令 PUSH 40H 后,(SP)=08H,(08H)=88H。
  若(SP)=5FH,(5FH)=90H,执行指令 POP 70H 后,(70H)=90H (SP)=5EH。

四、数据交换

  对于单一的 MOV 类指令,传送通常是单向的,即数据是从一处(源)到另一处(目的)的拷贝。而交换类指令完成的传送是双向的,是两字节间或两半字节间的双向交换。
  指令助记符为 XCH(Exchange)、XCHD(Exchange low-order Digit)和 SWAP。
  1.字节交换
在这里插入图片描述
  这三条指令的功能是字节数据交换,实现三种寻址操作数内容与 A 的内容互换。
  例如:若(R0)=80H,(A)=20H。执行指令 XCH A,@R0 后,(A)=80H,(R0)=20H。
  2.半字节交换
半字节交换
  XCHD 指令的功能是间址操作数的低半字节与 A 的低半字节内容互换。
  SWAP 指令的功能是累加器的高、低 4 位互换。
  例如:若(R0)=30H,(30H)=67H,(A)=20H。执行指令 XCHD A,@R0 后,(A)=27H,(30H)=60H。
  例如:若(A)=30H,执行指令 SWAP A 后,(A)=03H。

3.4 算术运算类指令(24 条)

  算术运算类指令可以完成加、减、乘、除及加 1 和减 1 等运算。这类指令多数以 A 为源操作数之一,同时又使 A 为目的操作数。如表 3.4 所示。
表 3.4 算术运算类指令
续表
表 3.4 算术运算类指令
  进位(借位)标志 CY 为无符号整数的多字节加法、减法、移位等操作提供了方便。使用软件监视溢出标志可方便地控制补码运算。辅助进位标志用于 BCD 码运算。算术运算操作将影响程序状态字 PSW 中的溢出标志 OV、进位(借位) 标志 CY、辅助进位(辅助借位)标志 AC 和奇偶标志位 P 等。如表 3.5 所示。
算术运算指令对算术标志的影响
  注:符号√表示相应的指令操作影响标志;符号 0 表示相应的指令操作对该标志清 0。符号×表示相应的指令操作不影响标志。另外,累加器加 1(INC A)和减 1(DEC A)指令影响 P 标志。

3.4.1 加法

一、不带进位加法

不带进位加法
  这组指令的功能是把源操作数与累加器的内容相加再送入累加器中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器间接寻址和寄存器寻址。
  影响程序状态字 PSW 中的 CY、AC、OV 和 P 的情况如下:
  进位标志 CY:和的 D7 位有进位时,(CY)=1;否则,(CY)=0。
  辅助进位标志 AC:和的 D3 位有进位时,(AC)=1;否则,(AC)=0。
  溢出标志 OV:和的 D7、D6 位只有一个有进位时,(OV)=1;和的 D7、D6 位同时有进位或同时无进位时,(OV)=0。溢出表示运算的结果超出了数值所允许的范围,如两个正数相加结果为负数或两个负数相加结果为正数时属于错误结果,此时(OV)=1。
  奇偶标志 P:当累加器 ACC 中“1”的个数为奇数时,( P)=1;为偶数时,( P)=0。
  例如:若(A)=84H,(30H)=8DH,执行指令 ADD A,30H 后,由于

即 (A)=11H,(CY)=1,(AC)=1,(OV)=1(D7 有进位,D6 无进位),( P)=0

二、带进位加法


  这组指令的功能是**把源操作数与累加器A 的内容相加再与进位标志CY 的值 相加,结果送入目的操作数 A 中。**源操作数的寻址方式分别为立即寻址、直接寻址、寄存器间接寻址和寄存器寻址。
  这组指令的操作影响程序状态字 PSW 中的 CY、AC、OV 和 P 标志。
  需要说明的是,这里所加的进位标志 CY 的值是在该指令执行之前已经存在的进位标志的值,而不是执行该指令过程中产生的进位。换句话说,若这组指令执行之前 (CY)=0,则执行结果与不带进位位 CY 的加法指令结果相同。

三、增 1

在这里插入图片描述
  这组指令的功能是把源操作数的内容加 1 ,结果再送回原单元。这些指令仅 INC A 影响 P 标志,其余指令都不影响标志位的状态。

四、十进制调整

  DA A ;调整 A 的内容为正确的 BCD 码
  该指令的功能是对累加器 A 中刚进行的两个 BCD 码加法的结果进行十进制调整。
  两个压缩的BCD 码按二进制相加后,必须经过调整方能得到正确的压缩 BCD 码的和。调整要完成的任务是:
  (1)当累加器 A 中的低 4 位数出现了非 BCD 码(1010~1111)或低 4 位产生进位(AC=1)时,应在低 4 位加 6 调整,以产生低 4 位正确的 BCD 码结果。
  (2)当累加器 A 中的高 4 位数出现了非 BCD 码(1010~1111)或高 4 位产生进位(CY=1)时,应在高 4 位加 6 调整,以产生高 4 位正确的 BCD 码结果。
   十进制调整指令执行后,PSW 中的 CY 表示结果的百位值
  例如:若(A)=0101 0110B,表示的 BCD 码为(56) BCD ,(R2)=0110 0111B,表示的 BCD 码为(67) BCD ,(CY)=0。执行以下指令:

ADD	A,R2
DA	A

  由于(A)=0010 0011B,即(23) BCD ,且(CY)=1,即

所以,结果 BCD 码为 123。
  应该注意,DA 指令不能对减法进行十进制调整。当需要进行减法运算时, 可以采用十进制补码相加,然后用 DA 指令进行调整。例如:
  50–20=50+ [20]补 =50+(100–20)=50+80=1 30
  在单片机中十进制补码算法为: [x]补 =9AH– |x|

3.4.2 减法

一、带借位减法


  这组指令的功能是把累加器 A 的内容减去指令指定单元的内容,结果再送入目的操作数 A 中。
  对于程序状态字 PSW 中标志位的影响情况如下:
  借位标志 CY:差的位 7 需借位时,(CY)=1;否则,(CY)=0。
  辅助借位标志 AC:差的位 3 需借位时,(AC)=1;否则,(AC)=0。
  溢出标志 OV:若位 6 有借位而位 7 无借位或位 7 有借位而位 6 无借位时,(OV)=1。
  如果要用此组指令完成不带借位的减法,只需先清 CY 为 0 即可。
  例如:若(A)=C9H,(R2)=54H,(CY)=1,执行指令 SUBB A,R2 之后,由于:

  即(A)=74H,(CY)=0,(AC)=1,(OV)=1(位 7 有借位,位 6 无借位),( P)=0。

二、减 1


  这组指令的功能是把操作数的内容减 1 ,结果再送回原单元。
  这组指令仅 DEC A 影响 P 标志。其余指令都不影响标志位的状态。

3.4.3 乘法

  MUL AB ;累加器 A 与 B 寄存器相乘
  该指令的功能是将累加器 A 与寄存器 B 中的无符号 8 位二进制数相乘 ,乘积的低 8 位留在累加器 A 中,高 8 位存放在寄存器 B 中。
  当乘积大于 FFH 时,溢出标志位(OV)=1。而标志 CY 总是被清 0。
  例如:若(A)=50H,(B)=A0H,执行指令 MUL AB 后,(A)=00H,(B)=32H,(OV)=1,(CY)=0。

3.4.4 除法

  DIV AB ;累加器 A 除以寄存器 B
  该指令的功能是将累加器 A 中的无符号 8 位二进制数除以寄存器 B 中的无符号 8 位二进制数 ,商的整数部分存放在累加器 A 中,余数部分存放在寄存器B 中。
  当除数为 0 时,结果的 A 和 B 的内容不定,且溢出标志位(OV)=1。而标志CY 总是被清 0。
  例如:若(A)=FBH(251),(B)=12H(18),执行指令 DIV AB 后,(A)=0DH,(B)=11H,(OV)=0,(CY)=0。

3.5 逻辑运算与循环类指令(24 条)

  逻辑运算指令可以完成与、或、异或、清 0 和取反操作。当以累加器 A 为目的操作数时,对 P 标志有影响。循环类指令是对累加器 A 的循环移位操作, 包括左、右方向以及带与不带进位位等移位方式。移位操作时,带进位的循环移位对 CY 和 P 标志有影响。累加器清 0 操作对 P 标志有影响。逻辑运算与循环类指令如表 3.6 所示。
表 3.6 逻辑与循环类指令
表 3.6 逻辑与循环类指令

3.5.1 逻辑与

在这里插入图片描述
  前两条指令的功能是把源操作数与直接地址指示的单元内容相与,结果送入直接地址指示的单元。后四条指令的功能是把源操作数与累加器 A 的内容相与,结果送入累加器 A 中。
  例如:若(A)=C3H,(R0)=AAH,执行指令 ANL A,R0 后,(A)=82H。

3.5.2 逻辑或


  前两条指令的功能是把源操作数与直接地址指示的单元内容相或,结果送入直接地址指示的单元。后四条指令的功能是把源操作数与累加器 A 的内容相或,结果送入累加器 A 中。
  例如:若(A)=C3H,(R0)=55H,执行指令 ORL A,R0 后,(A)=D7H。
  前两条指令的功能是把源操作数与直接地址指示的单元内容相或,结果送入直接地址指示的单元。后四条指令的功能是把源操作数与累加器 A 的内容相或,结果送入累加器 A 中。
  例如:若(A)=C3H,(R0)=55H,执行指令 ORL A,R0 后,(A)=D7H。

3.5.3 逻辑异或


  前两条指令的功能是把源操作数与直接地址指示的单元内容异或,结果送入直接地址指示的单元。后四条指令的功能是把源操作数与累加器 A 的内容异或,结果送入累加器 A 中。
  例如:若(A)=C3H,(R0)=AAH,执行指令 XRL A,R0 后,(A)=69H。

3.5.4 累加器清 0 和取反

在这里插入图片描述
  这两条指令的功能分别是把累加器 A 的内容清 0 和取反,结果仍在 A 中。例如:若(A)=A5H,执行指令 CLR A 后,(A)=00H。

3.5.5 累加器循环移位


该组循环移位指令执行情况如图 3.7 所示。
例如:若(A)=C5H,执行指令 RL A 后,(A)=8BH。
   若(A)=45H,(CY)=1,执行指令 RLC A 后,(A)=8BH,(CY)=0。
   若(A)=C5H,执行指令 RR A 后,(A)=E2H。
   若(A)=C5H,(CY)=1,执行指令 RRC A 后,(A)=E2H,(CY)=1。
   有时“累加器 A 内容乘 2”的任务可以利用指令 RLC A 方便地完成。
在这里插入图片描述
  例如:若(A)= BDH = 1011 1101B,(CY)=0。执行指令 RLC A 后,(CY)=1, (A)= 0111 1010B = 7AH,(CY)=1。即结果为 17AH(378)=2×BDH(189)。

3.6 控制转移类指令(17 条)

  通常情况下,程序的执行是顺序进行的,但也可以根据需要改变程序的执行顺序,这种情况称为程序转移。控制程序的转移要利用转移类指令。80C51 的转移类指令有无条件转移、条件转移及子程序调用与返回等。控制转移类指令如表 3.7 所示。
表 3.7 控制转移类指令

3.6.1 无条件转移

一、短跳转

  AJMP addr11 ; PC ←(PC)+2,PC10~0 ← addr11
  该指令执行时,先将 PC 的内容加 2(这时 PC 指向的是 AJMP 的下一条指令),然后把指令中的 11 位地址码传送到 PC10~0,而 PC15~11 保持原来内容不变。
  在目标地址的 11 位中,前 3 位为页地址,后 8 位为页内地址(每页含 256个单元)。当前 PC 的高 5 位(即下条指令的存储地址的高 5 位)可以确定 32 个 2KB 段之一,如表 3.8 所示。所以,AJMP 指令的转移范围为包含 AJMP 下条指令在内的 2KB 区间。
表 3.8 ROM 空间中 32 个 2 KB 地址范围
  例如:若标号“NEWADD”表示转移目标地址 0123H,(PC)=0343H。执行指令 AJMP NEWADD 后,(PC)=0345H(此时该 PC 值指定的 2KB 段为 0000H~07FFH)。因为 PC15~11 为“00000”,该指令提供的低 11 位地址为“001 0010 0011”,组合成新的有效地址为“0000 0001 0010 0011”。程序转向目标地址 0123H 处运行。
  当 AJMP 指令正好落在某 2KB 段的后 2 个单元时(如 0FFFH、0FFFH 单元),目标地址将在下一个 2KB 段内。

二、长跳转

  LJMP addr16 ;PC ← addr16
  其中第一字节为操作码,该指令执行时,将指令的第二、三字节地址码分别装入指令计数器 PC 的高 8 位和低 8 位中,程序无条件地转移到指定的目标地址去执行。
  由于 LJMP 指令提供的是 16 位地址,因此程序可以转向 64KB 的程序存储器地址空间的任何单元。
  例如:若标号“NEWADD”表示转移目标地址 1234H,执行指令 LJMP NEWADD 时,两字节的目标地址将装入 PC 中,使程序转向目标地址 1234H 处运行。

三、相对转移

  SJMP rel ;PC ←(PC)+ 2,PC ←(PC)+ rel
  其中第一字节为操作码,第二字节为相对偏移量 rel。rel 是一个带符号的偏移字节数(2 的补码),取值范围为 +127 ~-128(00H~7FH 对应表示0 ~
+127,80H~FFH 对应表示-128~-1)。负数表示反向转移,正数表示正向转移。指令执行时先将 PC 的内容加 2,再加上相对地址 rel,就得到了转移目标地址。
  在用汇编语言编写程序时,rel 可以是一个转移目标地址的标号,由汇编程序在汇编过程中自动计算偏移地址,并填入指令代码中。在手工汇编时,可用转移目标地址减转移指令所在的源地址,再减转移指令字节数 2 得到偏移字节数 rel。
  例如: 若标号“ NEWADD ” 表示转移目标地址 0123H , PC 的当前值为0100H。执行指令 SJMP NEWADD 后,程序将转向 0123H 处执行(此时 rel=0123H–(0100+2)=21H)。

四、散转移

  JMP @A+DPTR ;PC ←(PC)+1,PC ←(A)+(DPTR)
  该指令具有散转功能,可以代替许多判别跳转指令。其转移地址由数据指针 DPTR 的 16 位数和累加器 A 的 8 位数进行无符号数相加形成,并直接装入 PC。该指令执行时对标志位无影响。
  例如:一段程序如下:
     MOV DPTR,#TABLE
     JMP @A+DPTR
 TABLE:AJMP ROUT0
     AJMP ROUT1
     AJMP ROUT2
     AJMP ROUT3
  当(A)=00H 时,程序将转到 ROUT0 处执行;当(A)=02H 时,程序将转到 ROUT1 处执行;其余类推。

3.6.2 条件转移

一、累加器判 0 转移

在这里插入图片描述
  该指令的功能是对累加器 A 的内容为 0 和不为 0 进行检测并转移。当不满足各自的条件时,程序继续往下执行。当各自的条件满足时,程序转向指定的目标地址。目标地址的计算与 SJMP 指令情况相同。指令执行时对标志位无影响。
  例如:若累加器 A 原始内容为 00H,则
     JNZ L1 ;由于 A 的内容为 00H,所以程序往下执行
     INC A ;
     JNZ L2 ;由于 A 的内容已不为 0,所以程序转向 L2 处执行

二、比较不相等转移

在这里插入图片描述
  这组指令的功能是对指定的目的字节和源字节进行比较,若它们的值不相等,则转移,转移的目标地址为当前的 PC 值加 3 后再加指令的第三字节偏移量rel;若目的字节的内容大于源字节的内容,则进位标志清 0;若目的字节的内容小于源字节的内容,则进位标志置 1;若目的字节的内容等于源字节的内容, 程序将继续往下执行。
  例如:若(R7)=56H,执行指令 CJNE R7,#54H,$ +08H 后,程序将转到目标地址为存放本条指令的地址再加 08H 处执行。
  注意:符号“$”常用来表示存放本条指令的地址。

三、减 1 不为 0 转移

  DJNZ Rn,rel ;PC ←(PC)+ 2,Rn ← (Rn)–1
         ;若(Rn)≠0,则 PC ←(PC )+ rel ,继续循环
         ;若(Rn)= 0,则结束循环,程序往下执行
  DJNZ direct,rel ;PC ←(PC)+ 3,direct ← (direct)–1
         ;若(direct)≠0,则 PC ←(PC )+ rel,继续循环
         ;若(direct)=0,则结束循环,程序往下执行
  这组指令每执行一次,便将目的操作数循环控制单元的内容减 1,并判其是否为 0。若不为 0,则转移到目标地址继续循环;若为 0,则结束循环,程序往下执行。
  例如:一段程序如下:
       MOV 23H,#0AH
       CLR A
  LOOPX: ADD A,23H
       DJNZ 23H,LOOPX
       SJMP $
 该程序执行后,(A)=10+9+8+7+6+5+4+3+2+1=37H

3.6.3 调用与返回

一、调用

  ACALL addr11 ;PC ←(PC)+ 2,SP←(SP)+ 1,(SP)←(PC7~0)
         ;SP←(SP)+ 1,(SP)←(PC158),PC100 ← addr11
  LCALL addr16 ;PC ←(PC)+ 3,SP←(SP)+ 1,(SP)←(PC7~0)
         ;SP←(SP)+ 1,(SP)←(PC15~8),PC← addr16
  这两条指令可以实现子程序的短调用和长调用。目标地址的形成方式与AJMP 和 LJMP 相似。这两条指令的执行不影响任何标志。
  ACALL 指令执行时,被调用的子程序的首址必须设在包含当前指令(即调用指令的下一条指令) 的第一个字节在内的 2K 字节范围内的程序存储器中。
  LCALL 指令执行时,被调用的子程序的首址可以设在 64K 字节范围内的程序存储器空间的任何位置。
  例如:若(SP)=07H,标号“XADD”表示的实际地址为 0345H,PC 的当前值为 0123H。执行指令 ACALL XADD 后,(PC)+2=0125H,其低 8 位的 25H 压入堆栈的 08H 单元,其高 8 位的 01H 压入堆栈的 09H 单元。(PC)=0345H,程序转向目标地址 0345H 处执行。

二、返回

  RET;PC15~8 ←((SP)),SP←(SP)–1
    ;PC7~0 ←((SP)),SP ←(SP)–1
  RETI ;PC15~8 ←((SP)),SP←(SP)–1
    ;PC7~0 ←((SP)),SP ←(SP)–1
  子程序执行完后,程序应返回到原调用指令的下一指令处继续执行。因此, 在子程序的结尾必须设置返回指令。返回指令有两条,即子程序返回指令 RET 和中断服务子程序返回指令 RETI。
  RET 指令的功能是从堆栈中弹出由调用指令压入堆栈保护的断点地址,并送入指令计数器 PC,从而结束子程序的执行。程序返回到断点处继续执行。
  RETI 指令是专用于中断服务程序返回的指令,除正确返回中断断点处执行主程序以外,还有清除内部相应中断状态寄存器(以保证正确的中断逻辑)的功能。

3.6.4 空操作

  NOP ;PC ←(PC) + 1
  这条指令不产生任何控制操作,只是将程序计数器 PC 的内容加 1。该指令在执行时间上要消耗 1 个机器周期,在存储空间上可以占用一个字节。因此, 常用来实现较短时间的延时。

3.7 位操作类指令(17 条)

  位操作又称为布尔操作,它是以位为单位进行的各种操作。80C51 单片机内部有一个布尔(位)处理器,对位地址空间具有丰富的位操作指令。进行位操作时,以进位标志作为位累加器。位操作指令中的位地址有 4 种表示形式:

  • 直接地址方式(如 0D5H);
  • 点操作符方式(如 0D0H.5、PSW.5 等);
  • 位名称方式(如 F0);
  • 伪指令定义方式(如 MYFLAG BIT F0)。
      以上几种形式表示的都是 PSW 中的位 5。
      与字节操作指令中累加器 ACC 用字符“A”表示类似的是,在位操作指令中, 位累加器要用字符“C”表示(注:在位操作指令中 CY 与具体的直接位地址 D7H 对应)。
      位操作类指令如表 3.9 所示。
    表 3.9 位操作类指令

3.7.1 位传送

  MOV bit,C ;bit←(CY)
  MOV C ,bit ;CY ←(bit)
  这两条指令可以实现指定位地址中的内容与位累加器 CY 的内容相互传送。
  例如:若(CY)=1,(P3)=1100 0101B,(P1)=0011 0101B。执行以下指令:
  MOV P1.3,C
  MOV C,P3.3
  MOV P1.2,C
结果为:(CY)=0,P3 的内容未变,P1 的内容变为 0011 1001B。

3.7.2 位状态设置

一、位清 0


  这两条指令可以实现位地址内容和位累加器内容的清 0。
  例如: 若(P1)=1001 1101B , 执行指令 CLR P1.3 后, 结果为(P1)= 1001 0101B。

二、位置位


  这两条指令可以实现位地址单元内容或取反后的值与位累加器的内容“或” 操作,操作的结果送位累加器 C。

3.7.3 位逻辑运算

一、位逻辑“与”


  这两条指令可以实现位地址单元内容或取反后的值与位累加器的内容“与” 操作,操作的结果送位累加器 C。
  例如:若(P1)=1001 1100B,(CY)=1,执行指令 ANL C, P1.0 后,结果为 P1 内容不变,而(CY)=0。

二、位逻辑“或”


  这两条指令可以实现位地址单元内容或取反后的值与位累加器的内容“或” 操作,操作的结果送位累加器 C。

三、位取反


  这两条指令可以实现位地址单元内容和位累加器内容的取反。

3.7.4 位判跳(条件转移)

一、判 CY 转移


  这两条指令的功能是对进位标志位 CY 进行检测,当(CY)=1(第一条指令) 或(CY)=0(第二条指令),程序转向 PC 当前值与 rel 之和的目标地址去执行,否则程序将顺序执行。

二、判 bit 转移

在这里插入图片描述
  这三条指令的功能是对指定位 bit 进行检测,当(bit)=1(第一和第二条指令)或(bit)=0(第三条指令),程序转向 PC 当前值与 rel 之和的目标地址去执行,否则程序将顺序执行。对于第二条指令,当条件满足时(指定位为 1),还具有将该指定位清 0 的功能。

本 章 小 结

  指令系统的功能强弱决定了计算机性能的高低。80C51 单片机的指令系统共有 111 条指令,其指令执行时间短,指令字节少,位操作指令极为丰富。
  指令由操作码和操作数组成。操作码用来规定要执行的操作的性质,操作数用于给指令的操作提供数据和地址。80C51 的指令按其编码长短可以分为三种格式:单字节指令、双字节指令和三字节指令。
  寻址方式是寻找存放操作数的地址并将其提取出来的方法。80C51 单片机有 7 种基本寻址方式:寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、基址寄存器加变址寄存器变址寻址、相对寻址和位寻址。
  数据传送类指令在单片机中应用最为频繁,其特点是执行的结果不影响标志位的状态;算术运算类指令的特点是执行的结果通常影响标志位的状态;逻辑运算类指令执行的结果一般不影响标志位 CY、AC 和 OV,仅在涉及累加器 A 时才对标志位 P 产生影响;控制程序的转移要利用转移类指令,80C51 的转移类指令有无条件转移、条件转移及子程序调用与返回等,位操作具有较强的位处理能力,在进行位操作时,以进位标志 CY 作为位累加器。

思考题及习题

1.80C51 系列单片机的指令系统有何特点?
2.80C51 单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器空间如何?
3.访问特殊功能寄存器 SFR 可以采用哪些寻址方式?
4.访问内部 RAM 单元可以采用哪些寻址方式?
5.访问外部 RAM 单元可以采用哪些寻址方式?
6.访问外部程序存储器可以采用哪些寻址方式?

发布了48 篇原创文章 · 获赞 48 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_39400113/article/details/105609750