Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 80C51单片机指令系统 教学基本要求: (1)、了解单片机的指令系统、编程语言等基本概念;

Similar presentations


Presentation on theme: "第3章 80C51单片机指令系统 教学基本要求: (1)、了解单片机的指令系统、编程语言等基本概念;"— Presentation transcript:

1 第3章 80C51单片机指令系统 教学基本要求: (1)、了解单片机的指令系统、编程语言等基本概念;
(2)、熟悉单片机汇编语言指令格式中符号的意义; (3)、熟悉单片机汇编语言指令系统每条指令的功能; (4)、掌握单片机指令系统的7种寻址方式; (5)、掌握单片机指令系统每类指令的用法。 教学重点: (1)、单片机指令系统的寻址方式; (2)、片内、外RAM单元之间的数据传送; (3)、加法运算指令组的用法; (4)、逻辑运算指令组的用法; (5)、控制转移指令组的用法。

2 教学难点: (1)、寄存器间接寻址、变址寻址、相对寻址等概念; (2)、堆栈操作指令的应用。 (3)、十进制调整指令DA A的应用; (4)、控制转移指令转移目的地址、偏移量rel的计算; (5)、子程序调用、返回指令的用法。

3 3.1 单片机指令系统概述 1、指令系统概述 指令:是供用户使用的单片机的软件资源,是单片机所能接受 的软件工作者的命令的最小工作单位。 指令系统:单片机所能执行的指令集合。 机器语言:指令以二进制码来表示。 汇编语言:指令以助记符形式来表示。 机器语言程序:使用机器语言编写的程序。 汇编语言程序:使用汇编语言编写的程序。 注意:MCS-51单片机指令系统不具有通用性,因此,用其编写 的汇编语言程序也不具有通用性,不能移植。

4 MCS-51系列单片机的汇编语言指令系统共有111条指令,其中49条为单字节指令,45条为双字节指令,17条为三字节指令。
从指令执行的时间来看,单机器周期指令64条,双机器周期指令45条,四机器周期指令2条。 MCS-51单片机的指令系统共有33个功能,用汇编语言编程时,只需44个助记符。 (1)、数据传送类指令(29条) (2)、算术运算类指令(24条) (3)、逻辑运算及移位类指令(24条) (4)、控制转移类指令(17条) (5)、位操作类指令(17条)

5 [标号:] 操作码助记符 [目的操作数],[源操作数] [;注释]
2、MCS-51单片机指令格式 指令格式:即指令的表示方法,其内容包括指令的长度和指令内部信息的安排。 采用助记符表示的汇编语言指令格式如下: [标号:] 操作码助记符 [目的操作数],[源操作数] [;注释] (1)一条指令中标号、操作数、注释部分可有可无,但操作码部分必不可少。 (2)标号是程序员根据编程需要给指令设定的符号地址,标号由1~8个字符组成,不能用系统规定的寄存器名,也不能用指令系统中的助记符名称,它的第一个字符必须是英文字,不能是数字或其它符号,标号后必须用冒号“:”。

6 (3)操作码表示指令的操作种类,用来规定指令进行什么操作,常用操作码的英文名称或缩写形式来表示,操作码后必须有一个或多个空格“ ”作间隔符。
例如:MOV 表示数据传送操作,ADD 表示加法操作。 (4)操作数表示指令操作的对象,它可能是一个具体的数据,也可能是指出到哪里取得数据的地址或符号。 一条指令中,可能没有(RET指令),也可能有一个(CPL A指令)、两个(MOV A,#00H指令, MOV 30H,#50H指令)或三个(CJNE A,#00H,NEXT)操作数。 根据操作数的位置的不同,可分为目的(左)操作数和源(右)操作数,操作数之间也以逗号“,”相隔(乘法指令MUL AB和除法指令DIV AB除外)。

7 (5)注释是对指令的解释说明,用以提高程序的可读性。注释前必须加分号“;”。
(6)书写汇编语言指令必须注意以上规则。

8 3、指令格式中符号意义说明 Rn:当前寄存器组的8个通用寄存器R0~R7(n=0~7)。 Ri:当前寄存器组中的2个寄存器RO,R1,可作地址指针,即间接寻址的寄存器(i=0,1)。 direct:内部RAM的8位地址,既可以是内部RAM的低128个单元地址(0~127),也可以是专用寄存器的单元地址或符号,如I/O端口,控制寄存器,状态寄存器等(128~255)。 #data:包含在指令中的8位立即数。 #data16:包含在指令中的16位立即数。 addr16:表示16位目的地址,只限于在LCALL和LJMP指令中使用,目的地址范围是64KB的程序存储器地址空间。

9 addr11:表示11位目的地址,只限于在ACALL和AJMP指令中使用,目的的地址必须存放在与下一条指令第一个字节同一个2KB程序存储器地址空间之内。
Rel:相对转移指令中的偏移量,为8位带符号补码数。 DPTR:数据指针,可用作16位的地址寄存器。 Bit:内部RAM或专用寄存器中的直接寻址位。 A:累加器(直接寻址方式的累加器表示为Acc) B:B寄存器,用于MUL和DIV指令中。 C:进位标志位或布尔处理机中的累加位。 @:为间址寄存器或基址寄存器的前缀标志。 /:位操作数的前缀,表示对该位状态取反。 (X):某寄存器或某单元中的内容。

10 ((X)):由X间接寻址的单元中的内容。
←:表示将箭头右边的内容传送至箭头的左边。

11 C51单片机指令寻址方式 MCS-51单片机指令系统中的大多数指令执行时都需要使用操作数,而在单片机中只有指定了操作数的存储单元才能得到操作数,因此,要得到操作数,就只需找到操作数存放的单元即可。 所谓寻址方式:即如何确定参与操作的数的真正单元。 根据操作数单元指定方法的不同,就有了不同的寻址方式。 MCS-51单片机共有7种寻址方式。 由于指令中的操作数有目的(左)操作数和源(右)操作数之分,因此,在讲解寻址方式时,均以源(右)操作数为例。 (1)寄存器寻址方式 a)、寄存器寻址就是指操作数在寄存器中,因此,指定了寄存器就得到了操作数。

12 b)寄存器寻址的指令中,以符号名称来表示寄存器。
例: 假设原来(A)=30H,(R1)=40H,现执行指令MOV A, R1; 指令功能:将R1中的内容(操作数)送A中; 指令执行过程:A←(R1); 指令执行结果:(A)=(R1)=40H。 c)寻址范围:1)当前工作寄存器组R0~R7; 2)部分专用寄存器A,AB,DPTR等。 例:MOV P1, A; 将累加器A的内容送到P1口 MOV P1, R4;将寄存器R4的内容送到P1口 CLR A; 将累加器A清0 CPL A; 将累加器A中的内容取反 MUL AB; 将累加器A的内容与寄存器B的内容相乘

13 (2)直接寻址方式 a)直接寻址即指令所需的操作数直接以操作数存放的单元地址的形式给出。 例:假设内部RAM 3AH单元的内容是88H,累加器A的内容是10H,现执行指令 MOV A,3AH。 指令功能:将3AH中的内容(操作数)送A中; 指令执行过程:A←(3AH); 指令执行结果:(A)=(3AH)=88H。 b)采用直接寻址的指令一般是双字节或三字节指令。 c)直接寻址是访问专用寄存器的唯一方法。 d)寻址范围: 1)内部RAM低128个单元,低128单元地址在指令中须以

14 直接单元地址形式给出; 2)专用寄存器,专用寄存器除以单元地址形式给出外,还可以以寄存器符号的形式给出。 例:MOV P1, 20H;将内部RAM 20H单元的内容传送到P1口 MOV A, P0; 将P0口的内容传送到A MOV A, 80H;将P0口的内容传送到A (3)寄存器间接寻址方式 a)寄存器间接寻址是指指令所需的操作数是通过寄存器间接得到的,寄存器中存放的则是操作数存放的单元地址。 例:假设内部RAM 3AH单元的内容是65H,寄存器R0的内容是3AH,现执行指令 MOV 指令功能:先将R0的内容3AH作为内部RAM的单元地址,再将

15 内部RAM单元地址为3AH中的内容65H(操作数)送A中。
指令执行过程: A←((R0))或 A←(3AH) 指令执行结果:(A)=((R0))=(3AH)=65H。 b)间址寄存器:R0、R1、DPTR、SP。 c)寻址范围: 例:MOV ;将R1指示的地址单元中内容传送至A中。 假设(R1)=40H,(40H)=90H,即把内部RAM中40H单元中的内容90H送到A。

16 2)外部(片外)RAM 64KB单元,可使用DPTR作间址寄存器,其形式为@DPTR。
例:MOVX 假设(DPTR)=1000H,(1000H)=80H,即把外部RAM 1000H单元中的内容80H送到A。 3)外部(片外)RAM的低256单元(0000H~00FFH),它是一个特殊的寻址区,既可以使用DPTR作间址寄存器寻址,也可以使用R0或R1作间址寄存器寻址。 例:假设外部RAM 0020H单元中的内容是45H,现需将其送A中。 MOV DPTR, #0020H; MOVX 或 MOV R0, #20H; MOVX

17 4)在执行堆栈操作指令(PUSH,POP)时,也算为寄存器间接寻址 ,即以堆栈指针(SP)作间址寄存器的间接寻址方式。
例:PUSH ACC;将A中的内容压入堆栈 POP ACC;将堆栈中的内容弹出,送到A (4)立即寻址方式 a)立即寻址即指令所需的操作数已在指令中直接给出。 通常,把直接出现在指令中的操作数称之为立即数。为了与直接寻址指令中的直接单元地址相区别,一般应在立即数前面加“#”标志。 b)采用立即寻址的指令,一般为双字节。第一个字节为指令的操作码,第二个字节为立即数。 c)寻址范围:程序存储器空间。

18 例:MOV A, #40H; 指令功能:将程序存储器中某单元的内容3AH (立即数)送A中 指令执行过程: A←3AH 指令执行结果:(A)=3AH d)除8位立即数外,MCS-51指令系统中还有一条16位立即寻址指令,即:MOV DPTR,#data16,其功能是把16位立即数送数据指针DPTR。 例:MOV DPTR, #1000H; 指令功能:将程序存储器中某单元的内容1000H(立即数)送DPTR中 MOV P1, #55H ;将立即数55H送P1口 MOV 20H, #55H ;将立即数55H送20H单元 MOV R0, #20H ;将立即数20H送寄存器R0

19 (5)变址寻址方式 a)变址寻址用于访问程序存储器中的常数或数据表格。 变址寻址即是以DPTR或PC作为基址寄存器,以累加器A为变址寄存器,并以两者的内容相加形成16位地址作为目的操作数地址,以达到访问程序存储器中的常数或数据表格的目的。 b)寻址范围:程序存储器空间。 c)指令数目:三条,均为一字节指令 MOVC 指令执行过程: A←((A)+(DPTR)) 指令执行结果:(A)=((A)+(DPTR)) MOVC A, @A+PC; 指令执行过程: A←((A)+(PC))

20 指令执行结果:(A)=((A)+(PC))
JMP @A+DPTR 指令执行过程: PC←((A)+(DPTR)) 指令执行结果:(PC)=((A)+(DPTR)) d)注意:三条指令中A的内容均为8位二进制无符号数。

21 (6)位寻址方式 a)位寻址即对二进制数据位进行寻址。 b)寻址范围: 1)、内部RAM中的位寻址区(单元地址20H~2FH),128个位,位地址是00H~7FH。位地址区中的位有两种表示方法: 直接使用位地址表示;单元地址加位数表示 例:MOV C, 20H;将位地址为20H的位状态传送给累加位C。 例:MOV C, 24H.0;将位地址为20H的位状态传累加位C。 例:SETB 3DH;将内部RAM位寻址区中的3DH位置1。 假设内部RAM 27H单元的内容是00H,执行SETB 3DH后,由于3DH对应内部RAM 27H的第5位,因此该位变为1,也就是27H单元的内容变为20H。该指令的执行过程如图所示。

22 2)、专用寄存器的可寻址位 可供位寻址的专用寄存器有11个,PSW,IP IE,PO,P1,P2,P3,SCON,A,TCON,B,实有可寻址位83位。 专用寄存器的可寻址位有四种表示方法: 直接使用位地址表示 例:MOV C,D5H;将PSW中位地址为D5H的位状态传给累加位C 单元地址加位数表示 例:MOV C,D0H.5;将PSW中位地址为D5H的位状态传给累加位C 位名称表示 例:MOV C, F0;将PSW中位地址为D5H的位状态传给累加位C 专用寄存器符号加位数表示 例:MOV C,PSW.5;将PSW中位地址为D5H的位状态传给累加位C

23 (7)相对寻址方式 a)相对寻址是为解决程序转移而设置的,为转移指令所用。 相对寻址是将程序计数器PC的当前值与指令中给出的地址偏移量(rel)相加,其和为转移指令的目的地址。 注意:PC当前值是指执行完该转移指令后的PC值,即转移指令的PC值加上转移指令的字节数。 转移指令转移到的目的地址=转移指令PC当前值+偏移量rel =转移指令首地址+转移指令字节数+rel。 偏移量rel是一个带符号的8位二进制补码数,所能表示数的范围为-128~+127。 b)寻址范围:程序存储器空间 具体地说,相对转移是以转移指令所在地址为基点,向前

24 (地址增加方向)最大可转移(127+转移指令字节数)个单元地址,向后(地址减少方向)最大可转移(128-转移指令字节数)个单元地址。

25 3.3 80C51单片机指令分类介绍 MCS-51单片机指令系统包括111条指令,按功能可以划分为以下5类: 数据传送类指令(29条);
数据传送类指令(29条);    算术运算类指令(24条); 逻辑运算类指令(24条); 控制转移类指令(17条); 位操作类指令(17条);

26 数据传送类指令 a)指令数目:29条; b)指令通用格式: 助记符操作码 目的操作数, 源操作数; c)指令功能:数据传送,属于数据复制性质; d)助记符类型(8种): MOV, MOVC, MOVX XCH, XCHD, SWAP, PUSH, POP e)寻址方式 源操作数:寄存器,寄存器间接、直接、立即、变址寻址; 目的操作数:寄存器,寄存器间接、直接寻址

27 例:MOV 20H, #20H;指令执行后(20H)=20H 例:MOV SP, #60H;指令执行后(SP)=60H
1、内部RAM数据传送指令组 a)立即数传送指令 指令格式 相应操作 操作结果 说明 MOV A, #data A←data (A)=data MOV direct, #data direct←data (direct)=data MOV Rn, #data Rn←data ( Rn )=data n=0~7 MOV @Ri, #data (Ri)←data (( Ri))=data i=0,1 MOV DPTR,#data16 DPTR←data16 (DPTR)=data16 例:MOV A, #20H; 指令执行后(A)=20H 例:MOV 20H, #20H;指令执行后(20H)=20H 例:MOV SP, #60H;指令执行后(SP)=60H 例:MOV B, #30H;指令执行后(B)=30H

28 例:MOV R1, #20H; 指令执行后(R1)=20H 例:MOV R0, #20H; 指令执行后(R0)=20H MOV @R0, #30H; 指令执行后((R0))=30H或(20H)=30H 例:MOV DPTR, #1020H; 指令执行后(DPTR)= 1020H; (DPH)=10H, (DPL)=20H 本指令是三字节指令,第一个字节是操作码信息,第二、第三字节分别是操作数(立即数)的高、低8位信息,其二进制目标代码存放格式如下: 操作码 程序 存储器 立即数高8位 (DPH) 立即数低8位 (DPL)

29 例:MOV 30H, 20H; 指令执行后(30H)=(20H) 例:MOV P1, 20H; 指令执行后(P1)=(20H)
b)内部RAM单元之间的数据传送指令 指令格式 相应操作 操作结果 MOV direct2, direct1 direct2←(direct1) (direct2)=(direct1) MOV direct, Rn direct←(Rn) (direct)=(Rn) MOV Rn, direct Rn←(direct) (Rn)=(direct) MOV direct←(( Ri)) (direct)=(( Ri)) MOV @Ri, direct (Ri)←(direct) ((Ri))=(direct) 例:MOV 30H, 20H; 指令执行后(30H)=(20H) 例:MOV P1, 20H; 指令执行后(P1)=(20H) 例:MOV P2, P0; 指令执行后(P2)=(P0) 例:MOV 40H, P3; 指令执行后(40H)=(P3) 例:MOV 0A0H, R7; 指令执行后(P2)=(R7) 例:MOV PSW, R1; 指令执行后(PSW)=(R1)

30 例:MOV R2, 20H; 指令执行后(R2)=(20H) 例:MOV R3, B; 指令执行后(R3)=(B)
例:MOV 40H, @R0; 指令执行后(40H)=((R0)) 例:MOV P0, @R1; 指令执行后(P0)= ((R1)) 例:MOV @R0, 0A0H;指令执行后((R0))=(P2) 例:MOV @R1, 30H; 指令执行后((R1))=(30H) c)通过累加器的数据传送指令 指令格式 相应操作 操作结果 MOV A, Rn A←(Rn) (A)=(Rn) MOV Rn, A Rn ←(A) (Rn)=(A) MOV A, direct A←(direct) (A)=(direct) MOV direct, A direct←(A) (direct)=(A) MOV A←((Ri)) (A)= ((Ri)) MOV @Ri, A (Ri)←(A) ((Ri))=(A)

31 例:MOV A, R0; 指令执行后(A)=(R0)
例:MOV R3, A; 指令执行后(R3)=(A) 例:MOV A, B; 指令执行后(A)=(B) 例:MOV A, 40H; 指令执行后(A)= (40H) 例:MOV PSW, A; 指令执行后(PSW)= (A) 例:MOV 60H, A; 指令执行后(60H)= (A) 例:MOV A, @R0; 指令执行后(A)= ((R0)) 例:MOV @R1, A; 指令执行后((R1))=(A)

32 例:将外部RAM 2000H单元的内容20H送至A中。 MOV DPTR, #2000H;外部RAM 2000H单元地址作为16位立
指令格式 相应操作 操作结果 MOVX A←((DPTR)) (A)=((DPTR)) MOVX @DPTR, A (DPTR)←(A) ( (DPTR))=(A) MOVX A←((Ri)) (A)=((Ri)) MOVX @Ri, A (Ri)←(A) ((Ri))=(A) 例:将外部RAM 2000H单元的内容20H送至A中。 MOV DPTR, #2000H;外部RAM 2000H单元地址作为16位立 即数送数据指针DPTR MOVX 外部RAM 2000H单元的内容20H送A (A)=((DPTR))=(2000H)=20H

33 例:将累加器A中的内容40H送至外部RAM 4000H单元中。
MOV DPTR, #4000H;外部RAM 4000H单元地址作为16位立 即数送数据指针DPTR MOVX @DPTR, A ; A的内容40H送外部RAM 4000H单元 ((DPTR))=(4000H)=(A)=40H

34 例:将外部RAM 0050H单元的内容20H送至A中。
a)MOV DPTR, #0050H;外部RAM 0050H单元地址作为16位立 即数送数据指针DPTR MOVX 外部RAM 0050H单元的内容20H送A (A)=((DPTR))=(2000H)=20H b)MOV R0, #50H; 外部RAM 0050H单元地址作为8位立 即数送间址寄存器R0 MOVX 外部RAM 0050H单元的内容20H送A (A)=((R0))=(50H)=20H 例:将累加器A中的内容40H送至外部RAM 0050H单元中。

35 MOVX @DPTR, A ; A的内容40H送外部RAM 0050H单元
((DPTR))=(0050H)=(A)=40H b)MOV R1, #50H; 外部RAM 0050H单元地址作为8位立 即数送间址寄存器R1 A; A的内容40H送外部RAM 0050H单元 ((R1))=(50H)=(A)=40H

36 例:将内部RAM 60H单元的内容40H送至外部RAM 4000H单元中。
MOV A, 60H; 将60H单元的内容40H先送A中,(A)=40H MOV DPTR, #4000H;外部RAM 4000H单元地址送DPTR MOVX @DPTR, A ; A的内容40H送外部RAM 4000H单元 ((DPTR))=(4000H)=(A)=40H

37 例:将外部RAM 4000H单元的内容40H送至内部RAM 60H单元中。
MOV DPTR, #4000H;外部RAM 4000H单元地址送DPTR MOVX A, @DPTR ;外部RAM 4000H单元的内容40H送A (A)=((DPTR))=(4000H)==40H MOV 60H, A ;将A的内容40H送60H单元,(60H)=40H

38 例:将外部RAM 4000H单元内容40H送至外部RAM 0050H单元中。
MOV DPTR, #4000H;外部RAM 4000H单元地址送DPTR MOVX A, @DPTR ;外部RAM 4000H单元的内容40H送A (A)=((DPTR))=(4000H)=40H MOV R0, #50H ;外部RAM 0050H单元地址送间址寄存器R0 MOVX @R0,A; 外部RAM(0050H)=(A)=40H

39 例:将内部RAM 60H单元内容40H送至内部RAM 50H单元中。
a)MOV 50H, 60H;内部RAM 60H单元内容40H送至内部RAM 50H单元中,(50H)=(60H)=40H b)MOV A,60H;先将内部RAM 60H单元内容40H送A,(A)=40H MOV 50H,A;再将A的内容送内部RAM 50H单元,(50H)=40H

40 注意: 1)外部RAM与外部RAM单元之间、外部RAM与内部RAM单元之间的数据传送必须采用寄存器间接寻址的方式,而且必须通过累加器A进行; 2)MCS-51指令系统中没有专用的存储器读写指令,实际上外部数据存储器数据传送指令就是外部RAM的读写指令; 3)内部RAM单元之间的数据传送可有多种寻址方式。

41 (4)程序存储器数据传送指令组 程序存储器数据传送指令组既可用于内部程序存储器,也可用于外部程序存储器。 程序存储器数据传送指令组的指令只有两条,均为单字节指令,采用变址寻址方式。数据只能从程序存储器单向读出,而且也必须通过累加器A进行传送。 MOVC MOVC 这两条指令用于访问程序存储器中的数据表格,因此也称之为查表指令。其功能非常重要,将在第四章汇编语言程序设计中讲解。

42 数据交换主要在内部RAM单元与A之间、A的高、低4位之间进行,有整字节和半字节两种交换。
(5)数据交换指令组 数据交换主要在内部RAM单元与A之间、A的高、低4位之间进行,有整字节和半字节两种交换。 指令类型 指令格式 相应操作 整字节交换 XCH A, Rn (A)⇌(Rn) XCH A, direct (A)⇌(direct) XCH (A)⇌((Ri)) 半字节交换 XCHD (A)3~0 ⇌((Ri))3~0 A高低半字节交换 SWAP A (A)3~0 ⇌(A)7~4 例:假设(A)=38H,(R0)=54H,执行指令XCH A, R0; 结果为(A)= 54H,(R0)= 38H。 例:假设(A)=88H,(30H)=45HH,执行指令XCH A, 30H; 结果为(A)= 45H,(30H)= 88H。

43 例:假设(A)=34H,(R1)=50H,(50H)= 56H,
执行指令XCH 结果为(A)= 56H,((R1))=(50H)=34H。 执行指令XCHD ; 结果为(A)= 36H, ((R1))=(50H)=54H。 例:假设(A)=34H,执行指令SWAP A; 结果为(A)= 43H。 思考题:分析下列程序段执行的过程及结果: 假设内部RAM 2AH、2BH单元中连续存放有4个BCD码(1个BCD码占4个二进制位) 2AH单元 2BH单元 a3 a2 a1 a0

44 MOV R0, #2AH; MOV A, @R0; SWAP A; MOV @R0, A; MOV R1, #2BH; MOV A, @R1; XCH A, @R0; MOV @R1, A; 程序段执行后的最终结果: (2AH)= ;(2BH)= ;(A)= ;

45 思考题:解 MOV R0, #2AH;(R0)=2AH MOV A, @R0; (A)=a3a2 SWAP A; (A)=a2a3 MOV @R0, A; ((R0))=(2AH)=a2a3 MOV R1, #2BH;(R1)=2BH MOV A, @R1; (A)=a1a0 SWAP A; (A)=a0a1 XCH A, @R0; (A)=a2a3,((R0))=(2AH)=a0a1 MOV @R1, A; ((R1))=(2BH)=(A)=a2a3 程序段执行后的最终结果: (2AH)= a0a1 ;(2BH)= a2a3 ;(A)= a2a3 ;

46 (6)堆栈操作指令组 堆栈操作指令组只有两条指令:进栈指令和出栈指令。 a)进栈指令: PUSH direct; 功能:为内部RAM低128单元或专用寄存器内容送至栈顶单元。 指令操作过程:SP←(SP)+1;(SP)←(direct) b)出栈指令: POP direct; 功能:栈顶单元内容送内部RAM低128单元或专用寄存器。 指令操作过程: direct←((SP));(SP)←(SP)-1 注意:进栈指令和出栈指令均采用寄存器间接寻址方式,间址寄存器是SP,

47 例:将片外RAM 2500H单元的内容88H送到片内RAM 40H单元,
MOV DPTR, #2500H; (DPTR)=2500H MOVX A, @DPTR; (A)=((DPTR))=88H MOV SP, #60H; (SP)=60H PUSH ACC; (SP)=61H,(61H)=88H POP 40H; (40H)=88H,(SP)=60H

48 例:分析以下程序段的执行结果 MOV SP, #60H;(SP)=60H MOV A, #30H;(A)=30H MOV B, #40H;(B)=40H PUSH ACC; PUSH B POP DPH; POP DPL; 执行结果: (DPH)= (DPL)=

49 例: 单片机应用系统程序设计时,经常需要用到中断服务程序和各类子程序,在执行中断服务程序和子程序前, 常常需要把程序状态寄存器PSW、 累加器A、 数据指针DPTR的内容保护起来(现场进栈保护),在中断服务程序和子程序执行结束之前,再恢复它们的内容(现场出栈恢复)。以下程序段可实现上述功能。 MOV SP, #60H; PUSH PSW; PUSH ACC; PUSH DPL; PUSH DPH; ……………

50 POP DPH; POP DPL; POP ACC; POP PSW; 注意:堆栈深度、堆栈平衡,数据进栈、出栈的先后次序。

51 算术运算类指令 a)指令数目:24条; b)指令通用格式: 助记符操作码 目的操作数, 源操作数; c)指令功能:数据算术运算(加 减 乘 除),此类指令对程序状态字PSW的进位位(CY),辅助进位位(AC),溢出位(OV)三种标志位有影响,即对它们自动置位或复位,但是,加1和减1指令不影响这些标志; d)助记符类型(8种): ADD、ADDC、SUBB、INC、DEC、DA、MUL、DIV e)注意: 算术运算类指令都是针对8位二进制无符号数的。

52 a)将A中的数与源操作数所指出的内容相加,其相加结果仍存在A中。
(1)加法指令组 指令格式 相应操作 操作结果 ADD A, Rn A←(A)+(Rn) (A)=(A)+(Rn) ADD A, direct A←(A)+(direct) (A)=(A)+(direct) ADD A←(A)+((Ri)) (A)=(A)+ ((Ri)) ADD A, #data A←(A)+ data (A)=(A)+ data a)将A中的数与源操作数所指出的内容相加,其相加结果仍存在A中。 b)8位二进制数加法运算指令的一个加数总是累加器A。 c)运算影响PSW的位状态 相加过程中,若位3有进位,则AC置1,否则,AC清0,若位7有进位,则CY置1,否则,CY清0。

53 d)、对于无符号数相加,若CY置位,说明和产生溢出,即大于255。
e)、对于有符号数相加,当位6或位7之中只有一位进位时,溢出标志位OV置位,说明和产生了溢出,结果出错。 OV位只对有符号数加法有意义,对于无符号数加法无意义。 溢出表达式:OV=D6cy⊕D7cy D6cy:位6向位7的进位 D7cy:位7向cy的进位 例:假设(A)=C2H,(R0)=A9H,执行ADD A, R0 1←

54 OV=D6cy⊕D7cy=0⊕1=1 若C2H,A9H为无符号数,则(A)=6BH,(AC)=0,(CY)=1,则表示溢出,结果大于255。 若C2H,A9H为有符号数,则OV=1,表示有溢出,结果出错,因为两个负数相加不可能得到正数的和。 例:假设(A)=78H,(10H)=64H,执行指令ADD A, 10H,求两无符号数之和,并说明PSW的有关标志位状态。 +) PSW: OV=D6cy⊕D7cy=1⊕0=1,CY=0, AC=0。 练习题:(A)=53H,(R0)=FCH,执行指令:ADD A, R0

55 (A)=(A)+(direct) +(CY)
(2)带进位加法指令组 指令格式 相应操作 操作结果 ADDC A, Rn A←(A)+(Rn)+(CY) (A)=(A)+(Rn) +(CY) ADDC A, direct A←(A)+(direct)+(CY) (A)=(A)+(direct) +(CY) ADDC A←(A)+((Ri))+(CY) (A)=(A)+((Ri))+(CY) ADDC A, #data A←(A)+ data +(CY) (A)=(A)+ data +(CY) a)把源操作数所指示的内容和A中的内容及进位标志CY相加,结果存入A中。运算前一个加数必定在A中,运算后和存于A中。 b)此类指令运算结果同样对PSW中相关位有影响,影响规则与加法指令组相同。 c)它一般用于多字节数的加法运算,低字节相加的和可能产生进位,可通过带进位加法指令将低字节的进位加到高字节上去,高字节求和时,必须使用带进位的加法指令。

56 例:假设(A)=AEH,(20H)=81H,(CY)=1,求两数之和,及PSW相关位内容,执行指令ADDC A, 20H。
+) 1← OV=D6cy⊕D7cy=0⊕1=1;CY=1 AC=1 (A)=30H 练习题:假设(A)=85H, (20H)=FFH, CY=1求两数之和,及PSW相关位内容,执行指令ADDC A, 20H。

57 (A)=(A)-(direct) -(CY)
(3)带减位加法指令组 指令格式 相应操作 操作结果 SUBB A, Rn A←(A)-(Rn)-(CY) (A)=(A)-(Rn) -(CY) SUBB A, direct A←(A)-(direct)-(CY) (A)=(A)-(direct) -(CY) SUBB A←(A)-((Ri))-(CY) (A)=(A)-((Ri))-(CY) SUBB A, #data A←(A)- data -(CY) (A)=(A)- data -(CY) a)把A中的内容和源操作数所指示的内容及进位标志CY相减,结果存入A中。运算前被减数必定在A中,运算后差存于A中。 b)此类指令运算结果同样对PSW中相关位有影响,影响规则与加法指令组相同。其中,OV位只对有符号数减法有意义。 c)减法运算只有带借位减法指令,而没有不带借位减法指令。如需进行不带借位的减法运算,只需在用SUBB指令前先用CLR C指令把CY清0即可。

58 例:假设(A)=C9H,(R2)=54H,(CY)=1,求两数之差,及PSW相关位内容,执行指令SUBB A, R2。
-) OV=D6cy⊕D7cy=1⊕0=1 若C9H,54H为无符号数,则由于CY=0,无溢出,结果正确。 若C9H,54H为有符号数,则由于OV=1,有溢出,结果出错。 练习题: 假设(A)=DBH,(R4)=73H,(CY)=1,求两数之差,及PSW相关位内容,执行指令SUBB A, R4。

59 a)将操作数所指定单元或寄存器中的内容加1,其结果送回原操作数单元。
(4)加1指令组 指令格式 相应操作 操作结果 INC A A←(A)+1 (A)=(A)+1 INC Rn Rn←(Rn)+1 (Rn)=(Rn)+1 INC direct direct←(direct)+1 (direct)=(direct)+1 INC @Ri (Ri)←((Ri))+1 ((Ri))=((Ri))+1 INC DPTR DPTR←(DPTR)+1 (DPTR)=(DPTR)+1 a)将操作数所指定单元或寄存器中的内容加1,其结果送回原操作数单元。 b)此组指令的操作不影响PSW的状态。 例:假设(A)=FFH,(DPTR)=10FFH,(CY)=0,执行指令: INC A; (A)=00H, (CY)=0 INC DPTR; (DPTR)=1100H; (CY)=0

60 a)将操作数所指定单元或寄存器中的内容减1,其结果送回原操作数单元。
(5)减1指令组 指令格式 相应操作 操作结果 DEC A A←(A)-1 (A)=(A)-1 DEC Rn Rn←(Rn)-1 (Rn)=(Rn)-1 DEC direct direct←(direct)-1 (direct)=(direct)-1 DEC @Ri (Ri)←((Ri))-1 ((Ri))=((Ri))-1 a)将操作数所指定单元或寄存器中的内容减1,其结果送回原操作数单元。 b)此组指令的操作不影响PSW的状态。 c)没有DPTR减1指令。 例:假设(40H)=00H,(R1)=50H, (50H)=60H,(CY)=1执行指令:DEC 40H; (40H)=0FFH, (CY)=1 DEC @R1; ((R1))=(50H)=5FH,(CY)=1

61 例:内部RAM40H和41H单元分别存放两个8位二进制无符号加数,求两数相加之和,和存放在内部RAM42H单元中。假设两数之和仍是8位二进制数。
解:

62 例:内部RAM40H和41H单元分别存放两个8位二进制无符号加数,求两数相加之和,和存放在内部RAM42H单元中。假设两数之和仍是8位二进制数。(注意比较两种编程方法的优劣性)
解(1)MOV A, 40H; (A)=(40H) ADD A, 41H; (A)=(40H)+(41H) MOV 42H, A; (42H)= (40H)+(41H) (2)MOV R0, #40H; 设置数据指针,(R0)=40H MOV A, @R0; 取第一个加数,(A)=(40H) INC R0; 修改数据指针,(R0)=41H ADD A, @R0;两数相加(A)=(40H)+(41H) INC R0; 修改数据指针,(R0)=42H MOV @R0, A;存两数和(42H)=(40H)+(41H)

63 解:数据类型(二、十进制数,有、无符号数);数据结构(升、降序排列)
例:两个三字节二进制无符号数相加,被加数放在内部RAM 20H~22H单元(低字节存放在低地址单元,高字节存放在高地址单元,即低位在前,高位在后),加数放在2AH~2CH单元,和放在20H~22H单元,最高位如有进位,则放在23H单元中。 解:数据类型(二、十进制数,有、无符号数);数据结构(升、降序排列) 被加数(N1) 高字节(8位) 中字节(8位) 低字节(8位) 加数(N2) 被加数(N1) 加数(N2) 和(N3) 20H单元 低字节(8位) 2AH单元 21H单元 中字节(8位) 2BH单元 22H单元 高字节(8位) 2CH单元 23H单元 进位位

64 被加数 N1 高字节(8位) 中字节(8位) 低字节(8位)
+)进位位(CY) 进位位(CY) 进位位(CY) 和 N3 进位 高字节(8位) 中字节(8位) 低字节(8位) MOV A, 20H;(A)=被加数N1低字节 ADD A, 2AH;(A)=被加数N1低字节+加数N2低字节 低字节和的进位在CY中 MOV 20H,A; (20H)=和N3低字节 MOV A, 21H;(A)=被加数N1中字节 ADDC A, 2BH;(A)=被加数N1中字节+加数N2中字节+ 低字节和的进位,中字节和的进位在CY中

65 MOV 21H,A; (21H)=和N3中字节 MOV A, 22H;(A)=被加数N1高字节 ADDC A, 2CH; MOV 22H,A; (22H)=和N3高字节 MOV A, #00H; ADDC A, #00H;高字节和的进位位处理 MOV 23H,A; 保存处理后的高字节和的进位 思考题: 1)如果N1、N2、N3的数据结构为高字节存放在低地址单元,低字节存放在高地址单元,应如何修改程序? 2)上述程序,如果利用数据指针,采用寄存器间接寻址的方式,应如何修改程序?

66 解:MOV A, 22H;(A)=被加数N1低字节 ADD A, 2CH;(A)=被加数N1低字节+加数N2低字节 低字节和的进位在CY中
思考题:1) 被加数(N1) 高字节(8位) 中字节(8位) 低字节(8位) 加数(N2) 被加数(N1) 加数(N2) 和(N3) 20H单元 高字节(8位) 2AH单元 21H单元 中字节(8位) 2BH单元 22H单元 低字节(8位) 2CH单元 1FH单元 进位位 解:MOV A, 22H;(A)=被加数N1低字节 ADD A, 2CH;(A)=被加数N1低字节+加数N2低字节 低字节和的进位在CY中 MOV 22H,A; (22H)=和N3低字节 MOV A, 21H;(A)=被加数N1中字节

67 ADDC A, 2BH;(A)=被加数N1中字节+加数N2中字节+
低字节和的进位,中字节和的进位在CY中 MOV 21H,A; (21H)=和N3中字节 MOV A, 20H;(A)=被加数N1高字节 ADDC A, 2AH;(A)=被加数N1高字节+加数N2高字节+ 中字节和的进位,高字节和的进位在CY中 MOV 20H,A; (20H)=和N3高字节 ADDC A, #00H;高字节和的进位位处理 MOV 1FH,A; 保存处理后的高字节和的进位

68 思考题:2) 解:MOV R0, #20H;设置被加数N1数据指针,(R0)=20H MOV R1, #2AH;设置加数N2数据指针,(R1)=2AH MOV A, @R0; 取被加数N1低字节,(A)=(20H) ADD A, @R1; N1低字节和N2低字节相加 MOV @R0, A; 和的低字节存于20H INC R0; 修改N1数据指针,(R0)=21H INC R1; 修改N2数据指针,(R1)=2BH MOV A, @R0; 取被加数N1中字节,(A)=(21H) ADDC A, @R1; N1、N2中字节、低字节进位相加 MOV @R0, A; 和的中字节存于21H INC R0; 修改N1数据指针,(R0)=22H

69 INC R1; 修改N2数据指针,(R1)=2CH MOV A, @R0; 取被加数N1高字节,(A)=(22H) ADDC A, @R1; N1、N2高字节、中字节进位相加 MOV @R0, A; 和的高字节存于22H ADDC A, #00H;高字节和的进位位处理 INC R0; MOV @R0, A; 保存处理后的高字节和的进位 思考题: 3)上述程序,如果改变N1、N2、N3的数据结构(高字节存放在低地址单元,低字节存放在高地址单元),应如何修改程序?

70 解:MOV R0, #22H;设置被加数N1数据指针,(R0)=22H MOV R1, #2CH;设置加数N2数据指针,(R1)=2CH
高字节(8位) 2AH单元 21H单元 中字节(8位) 2BH单元 22H单元 低字节(8位) 2CH单元 1FH单元 进位位 思考题:3) 解:MOV R0, #22H;设置被加数N1数据指针,(R0)=22H MOV R1, #2CH;设置加数N2数据指针,(R1)=2CH MOV A, @R0; 取被加数N1低字节,(A)=(22H) ADD A, @R1; N1低字节和N2低字节相加 MOV @R0, A; 和的低字节存于22H DEC R0; 修改N1数据指针,(R0)=21H DEC R1; 修改N2数据指针,(R1)=2BH

71 MOV A, @R0; 取被加数N1中字节,(A)=(21H)
ADDC A, @R1; N1、N2中字节、低字节进位相加 MOV @R0, A; 和的中字节存于21H DEC R0; 修改N1数据指针,(R0)=20H DEC R1; 修改N2数据指针,(R1)=2AH MOV A, @R0; 取被加数N1高字节,(A)=(20H) ADDC A, @R1; N1、N2高字节、中字节进位相加 MOV @R0, A; 和的高字节存于20H ADDC A, #00H;高字节和的进位位处理 DEC R0; MOV @R0, A; 保存处理后的高字节和的进位

72 (6)乘除指令组 a)乘法指令 MUL AB 1)实现两个8位无符号二进制数的乘法操作,被乘数在A中,乘数在B中,乘积为16位,高8位送B,低8位送A。 2)此指令影响PSW的状态,CY位总被清0,当乘积大于255,则OV=1,否则清0。 例:(A)=4EH, (B)=5DH, 执行指令 MUL AB ×) ∴(B)=1CH (A)=56H, OV=1, CY=0

73 b)乘法指令 DIV AB 1)实现两个8位无符号二进制数除法,被除数在A,除数在B,A←商,B←余数。 2)此指令影响PSW位状态, CY位总被清0。当除数为0(B=0)OV=1,表示除法没有意义。 例:(A)=11H,(B)=04H,执行指令 DIV AB 其结果(A)=01H, B=1, CY=OV=0

74 (7)十进制调整指令 DA A 指令功能:用于对BCD码十进制数加法运算的结果进行修正。 a)十进制调整问题 指令系统中,只有针对二进制数的加法指令(ADD、ADDC),而没有专门用于十进制数(BCD码)的加法指令,因此,十进制数(BCD码)的加法运算只能借助于二进制数的加法指令,但二进制数加法指令不能完全适用于十进制数(BCD码)加法运算。 6+3= = =17 +) +) +)1001 ← 0001 (9) (11)

75 12+34= = = =182 +) +) +) +) (46) b)出错原因 BCD码是4位二进制编码,4位二进制数共有16个编码,但BCD码只用了其中10个(0000~1001),剩下6个(1010~1111)没用,为无效码。 在BCD码加法运算中,凡结果进入或者跳过无效编码区时,其结果就是错误的。

76 c)调整方法: 1)1位BCD码加法运算出错调整 1位BCD码加法运算出错情况有两种: 相加结果大于9,进入无效编码区; 相加结果有进位(AC),跳过无效编码区。 以上两种情况均使相加结果比正确值小6,调整方法就是加6。 6+3= = =17 +) +) +)1001 ← 0001 +)0110(6) +)0110(6) 1←0101(15) 1←0111(17)

77 2)2位(字节)BCD码加法运算出错调整 2位(字节)BCD码加法运算出错情况有三种: 相加结果高4位或低4位大于9,进入无效编码区; 相加结果高4位或低4位产生进位,跳过无效编码区; 相加结果高4位为9,低4位大于9,这样低位加6修正时产生的进位会使高位大于9,进入无效编码区。 A的低4位大于9或(AC)=1,则进行低4位加6修正: A ←(A)+06H A的高4位大于9或(CY)=1,则进行高4位加6修正: A ←(A)+60H A的高4位等于9,低4位大于9,则进行高4位和低4位分别加6修正 A ←(A)+66H

78 12+34= = = =182 +) +) +) +) +) +) +) ← ← (不需修正) (加06H修正) (加60H修正) (加66H修正) (46) (44) (135) (182) 例 (A)=56H,(R5)=67H,均为BCD码,执行指令 ADD A, R5; DA A; (CY)=1,(A)=23H,

79 思考题: 两个三字节十进制无符号数相加,被加数放在内部RAM 20H~22H单元(低字节存放在低地址单元,高字节存放在高地址单元,即低位在前,高位在后),加数放在2AH~2CH单元,和放在20H~22H单元,最高位如有进位,则放在23H单元中 十万位 万位 千位 百位 十位 个位 被加数(N1) a5 a4 a3 a2 a1 a0 加数(N2) b5 b4 b3 b2 b1 b0 被加数(N1) 加数(N2) 和(N3) 20H单元 a1a0 2AH单元 b1b0 c1c0 21H单元 a3a2 2BH单元 b3b2 c3c2 22H单元 a5a4 2CH单元 b5b4 c5c4 23H单元 进位位

80 (direct)=(direct)∧(A) direct←(direct)∧ data (direct)=(direct)∧ data
逻辑运算及移位类指令 a)指令数目:24条; b)指令功能:数据逻辑运算,移位操作; c)助记符类型(9种): ANL,ORL,XRL,RL,RLC,RR,RRC,CLR,CPL。 (1)逻辑与运算指令组 指令格式 相应操作 操作结果 ANL A, Rn A←(A)∧(Rn) (A)=(A)∧(Rn) ANL A, direct A←(A)∧(direct) (A)=(A)∧(direct) ANL A←(A)∧((Ri)) (A)=(A)∧((Ri)) ANL A, #data A←(A)∧data (A)=(A)∧ data ANL direct, A direct←(direct)∧(A) (direct)=(direct)∧(A) ANL direct, #data direct←(direct)∧ data (direct)=(direct)∧ data

81 a)功能: 前4条指令将A的内容与操作数所指出的内容进行按位逻辑与,结果送A,影响P位。 后2条指令将直接地址单元中的内容和源操作数所指出的内容按位进行逻辑与,结果送直接地址单元。 b)注意: 若直接地址是P0~P3时,这是一条“读-修改-写”端口指令。 当直接地址的内容与立即数操作时,可以对内部RAM的任何一个单元或SFR以及端口的指定位进行清0操作。 ANL direct, #data ANL A, #data

82 例:(A)=1FH,(30H)=83H,执行ANL A,30H
∧) 指令执行结果:(A)=03H, (30H)=83H, (P)=0 例:将内部20H单元的低4位清0,高4位保持不变。假设(20H)=87H,执行ANL 20H,#0FOH。 ∧) 指令执行结果:(20H)=80H 思考题:将P0口奇数位口线的状态变为0。

83 (direct)=(direct)∨(A) direct←(direct)∨ data (direct)=(direct)∨data
(2)逻辑或运算指令组 指令格式 相应操作 操作结果 ORL A, Rn A←(A)∨(Rn) (A)=(A)∨(Rn) ORL A, direct A←(A)∨(direct) (A)=(A)∨(direct) ORL A←(A)∨((Ri)) (A)=(A)∨((Ri)) ORL A, #data A←(A)∨ data (A)=(A)∨data ORL direct, A direct←(direct)∨ (A) (direct)=(direct)∨(A) ORL direct, #data direct←(direct)∨ data (direct)=(direct)∨data a)功能: 前4条指令将A的内容与源操作数所指示的内容按位进行逻辑或运算,结果存A中,执行指令后影响P。 后2条指令将直接地址的内容与A的内容或立即数按位进行或运算,其结果送直接地址单元。

84 b)注意: 若直接地址是P0~P3时,这是一条“读-修改-写”端口指令。 当直接地址中的内容与立即数操作时,可以对内部RAM的任何一个单元或SFR以及端口的指定位进行置位操作。 ORL direct, #data ORL A, #data 例:(A)=D2H,(40H)=77H,执行ORL A,40H ∨) 指令执行结果:(A)=0F7H,(40H)=77H,P=1。

85 例:已知TM0D的各位均为0,欲将TMOD的D7,D5,D2,D0位置1。
执行指令 ORL TMOD, #0A5H ∨) 指令执行结果:(TM0D)=0A5H 。 例:将累加器A的低4位传送到P1口的低4位,但P1口的高4位保持不变。 ANL A, #OFH; 屏蔽A的高4位(低4位不变) ANL P1, #OFOH; 屏蔽P1的低4位(高4位不变) ORL P1, A; 实现低4位传送

86 (direct)=(direct)⊕(A) direct←(direct)⊕data (direct)=(direct)⊕data
(3)逻辑异或运算指令组 指令格式 相应操作 操作结果 XRL A, Rn A←(A)⊕(Rn) (A)=(A)⊕(Rn) XRL A, direct A←(A)⊕(direct) (A)=(A)⊕(direct) XRL A←(A)⊕((Ri)) (A)=(A)⊕((Ri)) XRL A, #data A←(A)⊕data (A)=(A)⊕ data XRL direct, A direct←(direct)⊕(A) (direct)=(direct)⊕(A) XRL direct, #data direct←(direct)⊕data (direct)=(direct)⊕data a)异或运算规则:0⊕0=0,1⊕1=0,0⊕1=1,1⊕0=1 b)功能: 前四条指令将A的内容与源操作数所指示的内容按位进行逻辑异或运算,结果存A中,执行指令后影响P。 后两条指令将直接地址的内容与A的内容或立即数按位进行异或运算,其结果送直接地址单元。

87 c)注意: 若直接地址是P0~P3,可对端口进行“读-修改-写”操作。 当直接地址的内容与立即数进行操作时,可以对片内RAM任一单元及SFR和端口进行位取反操作。 XRL direct, #data XRL A, #data 例:(A)=87H,(30H)=76H,执行 XRL A,30H ⊕) 指令执行结果:(A)=0F1H,(30H)=76H,P=1。 思考题:(P1)=45H,执行 XRL P1,#0FFH后,(P1)=?。

88 (An+1)←(An),(CY)←(A7),(A0)←(CY) (An)← (An+1), (A7)←(CY), (CY)←(A0)
(4)累加器清“0”和取反指令组 指令格式 相应操作 操作结果 CLR A A←00H (A)=00H CPL A A←/(A) (A)=/(A) (5)移位指令组 指令格式 操作结果 RL A (An+1)←(An),(A0)←(A7) RR A (An)←(An+1),(A7)←(A0) RLC A (An+1)←(An),(CY)←(A7),(A0)←(CY) RRC A (An)← (An+1), (A7)←(CY), (CY)←(A0) 注意:移位指令组只能对累加器A进行移位操作;前两条指令将A的内容循环左右移位,执行后不影响PSW的各位;后两条指令将A的内容带进位位CY的循环移位,执行后影响CY位。

89 ACALL,AJMP,LCALL,LJMP,SJMP,JMP, NOP,RET,RETI JZ,JNZ,CJNE,DJNZ。
控制转移类指令 a)指令数目:17条; b)指令功能:控制程序实现转移; c)助记符类型(13种): ACALL,AJMP,LCALL,LJMP,SJMP,JMP, NOP,RET,RETI JZ,JNZ,CJNE,DJNZ。 d)指令类型:无条件转移,有条件转移 长转移指令LJMP addr16 累加器判零转移指令 JZ rel 绝对转移指令AJMP addr11 累加器判零转移指令 JNZ rel 短转移指令SJMP rel 数值比较转移指令 CJNE A,#data, rel 数值比较转移指令 CJNE A,direct, rel 绝对调用指令ACALL addr11 数值比较转移指令 CJNE Rn,#data, rel 长调用指令LCALL addr16 数值比较转移指令 rel 子程序返回指令 RET 减1条件转移指令 DJNZ Rn,rel 中断服务程序返回指令 RETI 减1条件转移指令 DJNZ direct,rel 空操作指令 NOP

90 (1)无条件转移指令组 a)长转移指令: LJMP addr16; addr16:16位转移目的地址 程序转移范围:程序存储器64KB空间 指令执行结果不影响程序状态字寄存器PSW 指令执行后:PC ← addr16, 在实际应用中,LJMP后面的addr16都是用标号来代替的,不一定写出它们的具体地址。 指令代码格式: 程序存储器单元 操作码 高8位地址 低8位地址

91 b)散转指令 JMP @A+DPTR ;变址寻址方式 功能:实现程序的多分支转移。 指令执行过程:PC←(A)+(DPTR) 指令执行结果(目的地址): (PC)=(A)+(DPTR) 散转指令非常有用,将在第四章详细讲解。

92 (2)条件转移指令组 a)累加器判零转移指令 : JZ rel; 若(A)=0,则程序转移执行,目的地址(PC)=(PC)+2+rel 若(A)≠0,则程序顺序执行,目的地址(PC)=(PC)+2 JNZ rel; 若(A)≠0,则程序转移执行,目的地址(PC)=(PC)+2+rel 若(A)=0,则程序顺序执行,目的地址(PC)=(PC)+2 注意:1)以上指令执行结果不影响程序状态字PSW的CY标志。 2)转移范围与SJMP指令相同 3)在实际应用中,指令中的rel都是用标号来代替的, 不一定写出它们的具体地址。 4)相对寻址方式

93 b)数值比较转移指令 : CJNE A, #dada, rel CJNE A, direct, rel CJNE Rn, #data, rel CJNE @Ri, #data, rel ; 功能:1)控制程序转移: 若左操作数=右操作数,则程序顺序执行,目的地址 (PC)=(PC)+3,进位标志位清0,(CY)=0; 若左操作数>右操作数,则程序转移执行,目的地址 (PC)=(PC)+3 +rel,进位标志位清0,(CY)=0; 若左操作数<右操作数,则程序转移执行,目的地址 (PC)=(PC)+3 +rel,进位标志位置1,(CY)=1;

94 2)数值比较: MCS-51单片机没有专门的数值比较指令,可利用这4条指 令结合位控制转移指令JC、JNC在程序转移的基础上进行。 若程序顺序执行,则左操作数=右操作数; 若程序转移执行且(CY)=0,则左操作数>右操作数; 若程序转移执行且(CY)=1,则左操作数<右操作数; 注意:1)以上指令执行结果影响程序状态字PSW的CY标志; 2)转移范围与SJMP指令相同; 3)在实际应用中,指令中的rel都是用标号来代替的,不 一定写出它们的具体地址。 4)相对寻址方式; 5)常用于循环结构程序,以判断循环是否结束。

95 c)减1条件转移指令 : 1)寄存器减1条件转移指令: DJNZ Rn, rel 功能:Rn←(Rn)-1(n=0~1): 若(Rn)≠0,则程序转移执行,目的地址(PC)=(PC) +2+rel; 若(Rn)=0,则程序顺序执行,目的地址(PC)=(PC) +2; 2)寄存器减1条件转移指令: DJNZ direct, rel 功能:direct←(direct)-1: 若(direct)≠0,则程序转移执行,目的地址(PC)= (PC)+3+rel; 若(direct)=0,则程序顺序执行,目的地址(PC)= (PC)+3; 注意:以上两条指令常用于循环结构程序,以判断循环是否结束。

96 (3)子程序调用和返回指令组 子程序结构是一种非常重要的程序结构。在一个程序中经常遇到反复多次某程序段的情况,如果重复书写这个程序段,会使程序变得冗长而杂乱。对此,可采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用而使用它。这样不但减少了编程工作量,而且也缩短了程序的长度。 调用和返回构成了子程序调用的完整过程。为了实现这一过程,必须有子程序调用指令和返回指令。调用指令在主程序中使用,而返回指令则应该是子程序的最后一条指令。执行完这条指令后,程序返回主程序断点处继续执行。

97 a)长调用指令 LCALL addr16; 功能:按指令给定16位目的地址(即子程序首地址)进行子 程序调用; 操作内容:①形成断点地址,PC←(PC)+3 ; ②保护断点(断点地址自动进栈) SP←(SP)+1,(SP)←(PC)7~0 SP←(SP)+1,(SP)←(PC)15~8 ③目的地址,PC←adrr16 注意:1)转移范围:程序存储器64KB空间; 2)在实际应用中,指令中的addr16都是用子程序的 名称来代替的,不一定写出它们的具体地址。

98 b)返回指令 RET;子程序返回指令 功能:子程序返回; 操作内容:恢复断点(断点地址自动出栈) PC15~8←((SP)), SP←(SP)-1; PC7~0 ←((SP)), SP←(SP)-1; RETI:中断服务程序返回指令 功能:中断服务程序返回; c)空操作指令 NOP;PC←(PC)+1 功能:不执行任何操作,常用于产生一个机器周期的时间延迟。

99 例: MOV SP, #60H;堆栈栈底设置为60H (1000H)START:LCALL MIR;调用名称为MIR的子程序 (1003H) QQ:CLR A; (1004H) ………… (2000H) MIR: ………… RET

100 位处理就是以位(bit)为单位进行的运算和操作。 a)指令数目:17条; b)指令功能:实现位传送,位逻辑运算,位控制程序转移等;
位操作类指令 位处理就是以位(bit)为单位进行的运算和操作。 a)指令数目:17条; b)指令功能:实现位传送,位逻辑运算,位控制程序转移等; c)助记符类型(11种): MOV,CLR,CPL,SETB,ANL,ORL,JC,JNC,JB,JNB、JBC (1)位传送指令组 功能:实现可寻址位与累加位CY之间的相互传送。 注意:由于没有两个可寻址位之间的传送指令,因此,它们之间无法实现直接传送,如需传送,应使用CY作中介。 指令格式 相应操作 操作结果 MOV C, bit CY←(bit) (CY)=(bit) MOV bit, C bit←(CY) (bit)=(CY)

101 例:将位地址为3FH的位状态传送到7FH位中。
MOV C, 3FH; MOV 7FH, C; 例:把P1.0的状态传送到P1.6 MOV C, P1.0 MOV P1.6, C 例:把片内2FH单元的D0位传送至C中,假设(2FH)=89H。 MOV C, 78H; 78H为2FH单元D0的位地址。 执行结果(CY)=1

102 功能:对CY及可寻址位进行置位或复位操作。
(2)位置位复位指令组 功能:对CY及可寻址位进行置位或复位操作。 指令格式 相应操作 操作结果 SETB C CY←1 (CY)=1 SETB bit bit←1 (bit)=1 CLR C CY←0 (CY)=0 CLR bit bit←0 (bit)=0 例: SETB RS1; CLR RS0;将当前通用寄存器组设置为第2组

103 功能:实现位的逻辑运算(与、或、非)操作。
(3)位运算指令组 功能:实现位的逻辑运算(与、或、非)操作。 指令格式 相应操作 操作结果 ANL C, bit CY←(CY)∧(bit) (CY)=(CY)∧(bit) ANL C, /bit CY←(CY)∧/(bit) (CY)=(CY)∧/(bit) ORL C, bit CY←(CY)∨(bit) (CY)=(CY)∨(bit) ORL C, /bit CY←(CY)∨/(bit) (CY)=(CY)∨/(bit) CPL C CY←/(CY) (CY)= /(CY) CPL bit bit←/(bit) (bit)=/(bit) 例: CPL 08H ; (21H).0 ←/((21H).0) CPL F0;将PSW.5的位状态取反

104 例 (1) P1.0=ACC.2∧B.5∨PSW.3∧ P2.5; MOV C, ACC.2; ANL C, B.5; ORL C, PSW.3; ANL C, P2.5; MOV P1.0,C (2) P3.7= (ACC.5∧ P1.5 )∨(B.3 ∨ PSW.4) MOV C, ACC.5; ANL C, P1.5; MOV 7FH, C; MOV C, B.3; ORL C, PSW.4; ORL C, 7FH; MOV P3.7,C

105 功能:以位(CY或bit)的状态作为实现程序转移的判断条件。
(4)位控制转移指令组 功能:以位(CY或bit)的状态作为实现程序转移的判断条件。 指令格式 相应操作 JC rel 若(CY)=1,则程序转移执行,PC←(PC)+2+rel 若(CY)=0,则程序顺序执行, PC←(PC)+2 JNC rel 若(CY)=0 ,则程序转移执行,PC←(PC)+2+rel 若(CY)=1,则程序顺序执行, PC←(PC)+2 JB bit, rel 若(bit)=1,则程序转移执行,PC←(PC)+3+rel 若(bit)=0,则程序顺序执行,PC←(PC)+3 JNB bit, rel 若(bit)=0,则程序转移执行,PC←(PC)+3+rel 若(bit)=1,则程序顺序执行,PC←(PC)+3 JBC bit, rel 若(bit)=1,则程序转移,PC←(PC)+3+rel,bit←0

106 寄存器寻址示意图 返回

107 直接寻址示意图 返回

108 寄存器间接寻址示意图 返回

109 立即寻址示意图 返回

110 位寻址示意图 返回

111 2位(字节)BCD码加法运算出错情况一览表
类型 CY A7 A6 A5 A4 AC A3 A2 A1 A0 1


Download ppt "第3章 80C51单片机指令系统 教学基本要求: (1)、了解单片机的指令系统、编程语言等基本概念;"

Similar presentations


Ads by Google