第 3 章 mcs-51 指令系统

57
第 3 第 MCS-51 第第第第第第第介介 MCS—51 介介介介介介介介介介 介介 MCS—51 介介介介介介介介介第第第第介介 MCS—51 介介介介介 6 介介介介介介介介介介介介介 介介 MCS—51 介介介介介介介介介介介 介介介 介介介介 、、

Upload: kiri

Post on 15-Jan-2016

110 views

Category:

Documents


0 download

DESCRIPTION

第 3 章 MCS-51 指令系统. ● 教学目标: 介绍 MCS — 51 系列单片机的寻址方式 介绍 MCS — 51 系列单片机的指令系统 ● 学习要求: 掌握 MCS — 51 系列单片机 6 种寻址方式的定义与表达方式 掌握 MCS — 51 系列单片机各指令的格式、功能、简单应用. 3.1 概述. 计算机工作的基本原理 是存储程序并执行程序,而程序则由能实现某种功能的指令序列构成。编写程序时使用的程序设计语言有三种: 机器语言、汇编语言和高级语言。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 3 章  MCS-51 指令系统

第 3 章 MCS-51 指令系统

● 教学目标: 介绍 MCS—51 系列单片机的寻址方式

介绍 MCS—51 系列单片机的指令系统

● 学习要求: 掌握 MCS—51 系列单片机 6 种寻址方式的定义与表达方式

掌握 MCS—51 系列单片机各指令的格式、功能、简单应用

Page 2: 第 3 章  MCS-51 指令系统

3.1 概述• 计算机工作的基本原理是存储程序并执行程序,

而程序则由能实现某种功能的指令序列构成。编写程序时使用的程序设计语言有三种:机器语言、汇编语言和高级语言。

o 机器语言是 CPU 唯一能直接识别的语言,是机器指令的集合 , 二进制代码书写 。用汇编语言和高级语言编制的程序称之为源程序,都要转换成机器语言程序后才能为计算机直接执行,这种用机器语言描述的程序我们通常称之为目标程序。

Page 3: 第 3 章  MCS-51 指令系统

o 高级语言的特点是通用性强,可以在不同的机器上运行。用高级语言编写的程序要用编译程序或解释程序翻译成机器语言程序方能执行。 o 汇编语言是用助记符来表示机器指令的一种程序设计语言。其每条语句对应相应的机器指令。汇编语言与机器的指令系统密切相关,不同的机型其指令系统不同,汇编语言程序不具备高级语言的通用性,用汇编语言编写的程序要经过汇编程序(也可以手译)翻译成机器语言程序后才能为计算机所识别。 其特点是占用的内存小、执行速度快。

Page 4: 第 3 章  MCS-51 指令系统

• 指令系统:一台计算机具有的所有指令的集合称为该计算机的指令系 统。• MCS—51系列单片机的指令系统共有 111条指令,在储存空间与执行时 间上都有较高的效率,还含有丰富的位操作指令,成为该指令系统的 一大特色。 按其功能可分为数据传送、算术运算、逻辑运算、程序转移、位操作 等 5个大类。 按指令长度:单字节指令 49条、双字节指令 46条、三字节指令只有16 条。按指令执行时间:单机器周期指令 64条,双机器周期指令 45条,乘除 2 条指令的执行时间为 4个机器周期。

Page 5: 第 3 章  MCS-51 指令系统

3.2 寻址方式 计算机的指令通常由操作码和操作数两部分构成。操作码部分指出了指令的功能,通常用代表该功能的英文缩写来表示;而操作数部分则可能是操作数本身或操作数所在的地址。表示指令中操作数所在位置的方法称为寻址方式。对 MCS—51 系列单片机,操作数可以为 0 ~ 2 个。不同的指令系统,具有的寻址方式也不同,相同功能的指令采用不同的寻址方式,有时可以节约空间,有时可以提高速度,寻址方式的多样化增加了指令的灵活性。 MCS—51 系列单片机的指令系统有 6 种基本的寻址方式。

o 立即寻址 操作数就在指令中,跟在操作码的后面,该操作数被称为立即数。

“在指令中,立即数前面加 #”符号作为标志。

Page 6: 第 3 章  MCS-51 指令系统

o 寄存器寻址 操作数在寄存器中,指令中给出寄存器名,此种方式称为寄存器寻址方式。 o 寄存器间接寻址 在指令中用工作寄存器( R0 、 R1 、 DPTR )给出存储单元的地址,而操作数在 RAM 中(片内 RAM 或片外 RAM ),此种方式称 为寄存器间接寻址方式,指令中寄存器名前要加 @ 。 寄存器间接寻址方式可用于访问片内 RAM 及片外 RAM ,由于片内 RAM与片外 RAM 地址有重叠现象,故规定用 MOV 指令访问片 内 RAM ,用 MOVX 指令访问片外 RAM 注意:访问片内 RAM 用工作寄存器 R0 、 R1 ,访问片外 RAM 时,若片外 RAM 的地址为 8 位,用 R0 、 R1 间址寄存器,若片外 RAM 的地址多于 8 位用 DPTR 作间址寄存器。 例: MOV A , @R0 40H 若 R0=40H ,则指令执行后, A=50H

50H 60H

A

Page 7: 第 3 章  MCS-51 指令系统

o 直接寻址

在指令中直接给出操作数所在的存储单元的地址,这种方式称为直接寻址方式。直接寻址方式可用于访问程序存储器和数据存储器。在汇编语言中,直接地址也可用标号表示。

注意: 1 、直接寻址方式是访问专用寄存器的唯一方法 2 、规定直接寻址方式只能访问片内 RAM 的低 128 个单元 3 、在进行位寻址时也采用直接寻址的方式 例如: MOV A , 30H 30H 指令执行后, A=56H

直接寻址方式还用于在转移及子程序调用指令中给出程序寄存器的 16 位或 11 位地址,执行这些指令后,用指令中给出的直接地址代替 PC 的整 16位或低 11 位地址,然后从 PC 值处开始执行指令。 例: LJMP addr16 ;   PC←addr16 ACALL addr11 ; PC←addr11

56H

0AH

A

Page 8: 第 3 章  MCS-51 指令系统

•基址寄存器加变址寄存器间接寻址 这种寻址方式用于访问程序存储器,它以 DPTR 或 PC 计数器作为基址寄存器,以累加器 A 作为变址寄存器,两者之和为操作数在程序存储器中的地址。此种方式常用于查表操作。•相对寻址 相对寻址也用于访问程序存储器,常用于转移指令中 , 执行指令时将程序计数器 PC 的当前值与指令中给出的相对偏移量( rel)之和作为转移的目的地址,从此地址处开始执行指令。 PC 的当前值称为基地址,偏移量为 1 个字节的带符号数,用补码表示,转移范围为- 128~+ 127。必须注意,基地址为 PC 的当前值,在转移指令进行地址计算时, PC 的当前值已指向下一条指令的第一个字节。 例如 :若在程序存储器 2000H 单元有一条双字节的无条件相对短转移指令: 2000H SJMP  05H则在执行该指令时( PC )当前 =2000H+02H=2002H ,故转移目的地址为 PC=2002H+05H=2007H

Page 9: 第 3 章  MCS-51 指令系统

表 3-1 操作数寻址方式及有关空间 寻址方式 寻址空间

立即寻址 程序存储器 ROM

直接寻址 片内 RAM低 128字节、专用寄存器和位 寻址空间

寄存器寻址 工作寄存器 R0~R7,A、B、C、DPTR

寄存器间接 寻址

片内 RAM(用 R0、R1、SP(仅对 PUSH、 POP指令));片外 RAM(用 R0、R1、DPTR))

基址加变寻址 程序存储器(@A+PC、@A+DPTR)

相对寻址 程序存储器 256字节范围(PC+偏移量)

Page 10: 第 3 章  MCS-51 指令系统

3.3  MCS—51 单片机的指令系统

MCS—51 单片机的指令系统可分为 5 个大类 : 数据传送类 算术运算类 逻辑运算类 程序转移类 位操作类

学习 MCS—51 单片机的指令系统应从指令的格式、功能、适用的寻址方式、运用等几方面着手。

Page 11: 第 3 章  MCS-51 指令系统

数据传送指令 数据传送类指令共有 29 条 , 可分为片内数据传送指令、片外数据传送指令、用于程序存储器传送的指令、交换指令、堆栈操作指令等 几类。 数据传送类指令 的功能: 数据传送类指令为双操作数指令,功能是将源操作数传送到目的操作数。除交换类指令外,指令执行后源操作数不变。 传送类指令一般不影响状态标志位

Page 12: 第 3 章  MCS-51 指令系统

一、片内数据传送指令( MOV ) 用立即数置数的指令 MOV A, #data ; 立即数 data送累加器 A, A←data

MOV Ri, #data ; i=0 、 1 、 2 、……、 7, Ri←DATA MOV @Rj, #data ;  j=0 、 1 ,  (Rj) ←data

MOV direct, #data ; ( direct)← data , direct为 存储器单元的地址

MOV DPTR , #data16注意:对于 MCS—51 系列单片机 , 工作寄存器分四组,每组

的工作寄存器名均为 R0 、 R1 、……、 R7,执行指令时由程序状态字寄存器 PSW中第四、三位( RS1 、 RS0 )的值指定使用那一组工作寄存器,凡用到工作寄存器的指令均如此,今后不在一一说明。

Page 13: 第 3 章  MCS-51 指令系统

以累加器 A 为一方的传送指令 MOV A , Ri; i=0 、 1 、 2 、……、 7, A←Ri

MOV Ri, A ; i=0 、 1 、 2 、……、 7, Ri←A MOV A , @Rj;  j=0 、 1 , A←(Rj) MOV @Rj, A ; j=0 、 1 , ( Rj)← A 。 MOV A , direct;   A←( direct) MOV direct, A ; ( direct)← A

Page 14: 第 3 章  MCS-51 指令系统

• 不以累加器 A 为一方的传送指令 MOV direct, Ri; (direct)←Ri MOV Ri, direct; Ri←(direct) MOV direct, @Rj ; j=0 、 1 ,( direct)←( Rj) MOV @Rj, direct, j=0 、 1 ,( Rj)←( direct) MOV direct , direct ; ( direct ←) ( direct)

注意:在使用片内传送指令时,一定要注意各种寻址方式适用的存储空间,即表 3-1 ,还应注意不同的寻址方式下传送的数据:

例:若 R0=30H ,片内 RAM ( 30H ) =57H ,片内 RAM ( 40H ) =7FH , 比较: MOV A , R0 和 MOV A , @R0 MOV A, #40H 和 MOV A , 40H A=30H A=57H A=40H A=7FH

Page 15: 第 3 章  MCS-51 指令系统

二、访问片外 RAM 的传送指令( MOVX )

MOVX类指令共有 4 条 , 均以累加器为一方。 1 、片外 RAM 单元( 8位地址)与累加器 A 之间的传送指令 MOVX A, @Rj; j=0 、 1 , A←片外( Rj) , 读 片外 RAM MOVX @Rj, A ; j=0 、 1 ,片外( Rj)←A, 写 片外 RAM

2 、片外 RAM ( 16 位地址)与累加器 A 之间的传送指令 MOVX A , @DPTR ; 读片外 RAM MOVX @DPTR , A ; 写片外 RAM

Page 16: 第 3 章  MCS-51 指令系统

注意: 1 、指令中寄存器 Rj、 DPTR的内容为片外 RAM 单元的地址,传送的是该片外 RAM 单元的内容。 2 、 MCS—51 系列单片机其 I/O端口是与片外 RAM 统一编址的,没有专门的输入输出指令,用 MOV X 指令可实现对 I/O端口的访问,变成输入 /输出指令

Page 17: 第 3 章  MCS-51 指令系统

三、访问程序存储器的传送指令 对程序存储器的访问是只读的,均以累加器 A 为目的操作数,另一方采用基址寄存器加变址寄存器寻址方式,本指令常用于查表程序

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

注意: 1 、以上两条指令中, DPTR+A 和 PC+A均为程序存储器某单元的地址,传送的是该单元的内容

2 、在用 PC+A 计算程序存储器地址时, PC取当前值,

MOVC A, @PC+A 为单字节指令,在执行指令时( PC )当前 =PC+1 。

Page 18: 第 3 章  MCS-51 指令系统

四、交换指令

交换指令实现两操作数之间数据的双向传送,两操作数互为源地址与目的地址,指令执行后,两操作数的内容互换,交换指令共有 5 条,均以累加器为一方。

1 、某工作寄存器内容与累加器 A交换指令 XCH A , Ri; i=0 、 1 、……、 7 2 、某 RAM 单元内容与累加器交换指令 XCH A , @Rj; j=0 、 1 3 、某片内 RAM (低 128 字节)或专用寄存器内容与累加器交换指令

XCH A , direct 4 、某片内 RAM 单元内容的低半字节与累加器的低半字节交换

指令。 XCHD A , @Rj;  j=0 、 1 5 、累加器的高低半字节互换指令 SWAP A

Page 19: 第 3 章  MCS-51 指令系统

五、堆栈操作指令

片内 RAM 的某一区域可作为堆栈使用,以保存与恢复现场。用栈顶指针寄存器 SP 指出堆栈的目前操作位置,堆栈操作指令有 2 条,进栈指令与出栈指令,堆栈遵守先进后出的原则。

o 进栈指令 PUSH direct; 将direct指定的片内 RAM (低 128字节)单元或专 用寄存器内容压栈 指令执行的过程为: SP←SP+1 ( SP )←( direct)o  出栈指令 POP direct ;将栈顶处内容弹到direct指定的RAM(低 128字 节)某单元或某专用寄存器 指令执行的操作为:( direct)←( SP ) SP←SP-1

Page 20: 第 3 章  MCS-51 指令系统

算术运算类指令

算术运算类指令共有 24 条,包括 4 种基本的算术运算加、减、乘、除指令及 1 条 BCD 数运算调整指令,算术运算类指令会影响 PSW的标志位,使用时要注意。

Page 21: 第 3 章  MCS-51 指令系统

一、加法指令

加法指令共有 8条,均以累加器 A 为一方,运算结果都送回累加器 A ,加法指令又分为不带进位加法指令与带进位位加法指令两类。

ADD A , Ri; A←A+Ri, i=0 、 1 、 2 、……、 7 ADD A , @Rj; A←A+(Rj), j=0 、 1  ADD A , direct; A←A+( direct) ADD A , #data ;; A←A+data

ADDC A , Ri; A←A+Ri+C , i=0 、 1 、 2 、……、 7 ADDC A , @Rj; A←A+(Rj)+C, j=0 、 1 ADDC A , direct; A←A+( direct) +C ADDC A , #data ; A←A+data+C

Page 22: 第 3 章  MCS-51 指令系统

注意: 1 、加法类指令执行后会影响程序状态字中的标志位 C 、AC 、 OV 及 P 。其中常用的是进位标志 C ,当 C=1 时,表示相加时产生了进位, C 也是无符号相加的溢出标志。带符号数溢出的标志是 OV ,当最高位与次高位不同时进位时, OV=1 ,表示带符号数的相加发生了溢出。辅助进位标志 AC在进行 BCD码相加调整时有用。 例如:设 A=78H 、 R1=64H ,分析执行指令 ADD A , R1后对 PSW中标志位的影响。 78H   01111000 +64H   01100100 ——————————

  11011100 执行后, C=0 、 AC=0 ,次高位有进位但最高位无进位,故OV=0⊕1=1

Page 23: 第 3 章  MCS-51 指令系统

2 、带进位位加法指令主要用于多字节数相加时,加法指令只能直接进行 8位数的运算,在进行多字节数相加时,从低字节开始,依次相加,最低字节的相加用 ADD 指令,而其它高位字节的相加要用 ADDC 指令

从 C 与 OV 来看,由于 C=0 ,因此当把 78H 与 64H 为无符号数时,此两数相加没有发生溢出;但若 78H 与 64H 为带符号数,此时 OV=1 ,说明发生了溢出,结果是错误的(两正数相加,和是负数)。从上述例子可以看出,判断无符号数相加溢出与判断带符号数相加溢出要用不同的标志位。

Page 24: 第 3 章  MCS-51 指令系统

例:设 2 个 16 位无符号数分别存在从 30H 及 40H 开始的RAM 单元中,低字节在低地址,高字节在高地址,编程将其相加,结果存入从 40H 开始的单元中。 CLR C ;    清进位位 MOV A , 30H ; A←( 30H ) MOV R0 , #40H ADD A , @R0 ;   计算低字节之和 , A←A+(40H) MOV @R0, A ;   存低字节之和 MOV A , 31H ;    A←(31H) INC R0 ADDC A, @R0 ; 计算高字节之和, A←A+(41 H) MOV @R0 , A ; 存高字节之和

Page 25: 第 3 章  MCS-51 指令系统

二、减法指令

与加法指令相同,减法指令亦以累加器 A 为一方(被减数),相减的结果均送回累加器 A ,但减法指令只有 4 条,均为带进(借)位相减指令,因此,在进行减法运算时应先将进位位清零。减法指令也会影响标志位 : 两操作数够减时, C=0 ,不够减时产生借位, C=1 ;低半字节够减时 AC=0 ,不够减时 AC=1 ;当最高位与次高位不同时有借位时, OV=1 ,表示带符号数相减发生了溢出带进位位减法指令主要用于多字节数相减

SUBB A , @Rj; A←A–( Rj)– C , j=0 、 1   SUBB A , direct; A←A–( direct)– C ,   SUBB A , #data ; A←A–data–C

Page 26: 第 3 章  MCS-51 指令系统

三、加 1 指令

MCS—51 系列单片机共有 5 条加 1 指令,加 1 指令执行后不影响标志位。在第 4 条指令中 , 若直接地址为 I/0端口地址 :80H 、 90H 、AOH 、 BOH ,则对该端口进行读—修改—写操作,后面的DEC (减 1 ) ANL (与)、 OR (或)、 XRL (异或)、DJNZ(减 1 不加转移指令)及位操作指令均具有对 I/O端口进行读—修改—写的功能,今后不再一一作特别说明。

INC A ; A←A+1 INC Ri; Ri← Ri+1 , i=0 、 1 、 2 、……、 7 INC @Ri;  ( Ri)←( Ri) +1 , j=0 、 1 INC direct;  (direct)←(direct)+1 INC DPTR ; DPTR←DPRT+1

Page 27: 第 3 章  MCS-51 指令系统

四、减 1 指令

减 1 指令有 4 条,与加 1 指令中的前 4 条相对应,减1 指令执行后也不影响标志位。

DEC A ; A←A-1 DEC Ri; Ri←Ri-1,i=0,1,2,…,7 DEC @Rj; (Rj)←(Rj)-1,j=0,1 DEC direct; (direct)←(direct)-1

Page 28: 第 3 章  MCS-51 指令系统

五、乘法指令与除法指令

乘法指令 MUL AB 该指令实现放在累加器 A 与寄存器 B中的两个无符号数相乘,乘积为 16 位,高 8位积在 A 中,低 8位积在 B中。若积大于 255 ,则 OV=1 ,否则 OV=0 ,而 C 始终为 0 。

除法指令 DIV AB 除法指令实现两个 8位的无符号数相除,其中被除数在累加器 A

中,除数在寄存器 B中,结果商在 A 中,余数在 B中。指令执行后,进位标志 C 、溢出标志 OV均为 0 ,但除数为 0 时, OV=1 。

Page 29: 第 3 章  MCS-51 指令系统

六、十进制调整指令 DA ADA A 的功能:对 BCD 码加法运算结果进行调整 计算机中十进制数字一般可用 BCD 码表示,而计算机在进行运算时,总是按二进制规则进行 ,因此,在运算结束后,应对运算的结果进行调整才能得到正确的结果。调整的方法:当累加器 A 的低半字节的值 >9 或 AC=1 ,时低半字节加 6 ;当高半字节 >9 或 C=1 时,高半字节加 6 ,进行加 6 调整后可得到BCD 数的加法运算的正确结果。 例:若 A=(25)BCD 而 Ri=(39)BCD

则: ADD A , Ri; A=5EH    DA A ;    A=(64)BCD

执行的过程为 : 2 5 H + 3 9 H 5 E H ……加法运算的结果 + 0 6 H ……调整 6 4 H ……调整后的结果

Page 30: 第 3 章  MCS-51 指令系统

逻辑运算类指令

逻辑运算类指令共有 24 条,包括与、或、异或、清零、求反及移位指令。当目的操作数为累加器 A 时会影响奇偶标志位 P ,带进位的移位指令会影响 C ,除此之外,逻辑运算类指令不影响程序状态 PSW。

Page 31: 第 3 章  MCS-51 指令系统

一、与( ANL )、或( ORL )、异或( XRL )指令

与指令、或指令、异或指令各有相对应的 6 条。1 、  与指令 与指令常用于使操作数的某些位 (与 0 相与 ) 清零而使另外的一些位(与 1 相与)保持不变。

ANL A , Ri; A←A∧Ri, i=0,1,……,7 ANL A , @Rj; A←A∧(Rj), j=0,1 。 ANL A , direct; A←A∧(direct) ANL direct, A ; (direct)←(direct)∧A ANL A , #data ; A←A∧tata ANL direct, #data ; (direct)←(direct)∧A

Page 32: 第 3 章  MCS-51 指令系统

2 、或指令 或指令用于使操作数的某些位置 1 (与 1 相或)而另一些

位保持不变(与 0 相或)。

ORL A , Ri; A←AVRi, i=0,1,2, ……,7 ORL A , @Rj; A←AV(Rj), j=0,1 ORL A , direct; A←AV(direct) ORL direct,A ; (direct)←(direct)VA ORL A , #data ; A←AV data

ORL direct, #data ; (direct) ← (direct)∨data

Page 33: 第 3 章  MCS-51 指令系统

3 、异或指令 异或指令可使操作数的某些位按位取反(与 1异或)而使其它位保持不变(与 0异或)。

XRL A , Ri; A ←A⊕Ri,i=0,1,2, ……,7 XRL A,@Rj; A←A⊕(Rj),j=0,1 XRL A,direct; A← A⊕(direct) XRL direct,A ; (direct) ←(direct) ⊕A XRL A,#data ; A←A⊕data XRL direct,#data ; (direct) ←(direct) ⊕data

Page 34: 第 3 章  MCS-51 指令系统

二、累加器 A 清零与取反指令

MCS-51 系列单片机的指令系统中专门对累加器 A 设置了清零和取反指令:

CPL A ; 累加器内容取反后→ A

CLR A ; 将累加器清零。

Page 35: 第 3 章  MCS-51 指令系统

三、移位指令移位指令共有 4 条,均以累加器 A 的内容为操作数,可实现累加器 A 的内容向左或向右环移 1 位,带进位位向左或向右环移 1 位。

1 、累加器内容向左环移 1 位 RL A

2 、累加器 A 内容向右环移 1 位 RR A 3 、累加器 A 内容带进位位向左环移 1 位 RLC A 4 、累加器 A 内容带进位向右环移 1 位 RRC A

c

c

Page 36: 第 3 章  MCS-51 指令系统

程序转移类指令

控制程序转移指令又有绝对转移与相对转移指令之分,所谓绝对转移,是指指令中给出的是直接地址( addre16 或 addr11 ) ,转移指令执行后,程序转移到指令中给出的直接地址处开始执行;而相对转移指的是指令中给出的相对地址是 1 个带符号的用补码表示的 8位的偏移量( rel),其转移的范围为当前地址 -128 ~ +127,转移指令执行时,首先要根据当前的 PC 值和位移量计算转移的目的地址,然后从目的地址处开始执行,位移量为负时向小地址端转移,位移量为正时向大地址端转移。条件转移类指令均属于相对转移指令。

Page 37: 第 3 章  MCS-51 指令系统

一、无条件转移指令

长转移指令 LJMP addr16 指令执行的操作为 PC←PC+3

PC←addr16 指令执行后将从 addr16 处开始执行指令 转移的范围为 216 ,即 64KB地址空间 绝对转移指令 AJMP addr11

指令执行的操作为 PC←PC+2 PC10 ~0← addr11 指令执行后用指令中的 11位地址取代 PC计数器的低 11位, PC的高 5位不变,从新的 PC 处开始执行指令

转移的范围为 211 ,即 2KB地址空间

Page 38: 第 3 章  MCS-51 指令系统

• 相对转移指令 SJMP rel 指令执行的操作为 : PC←PC+2+rel PC+2为执行此指令时 PC的当前值, rel是用 8位的补码表示的位 移量 转移的范围为当前地址 -128 ~ +127

• 相对长转移指令 JMP A+@DPTR 指令执行的操作为 : PC← A+@DPTR 相对长转移指令又称散转指令 , 用相对长转移指令实现散转的方法见下例:

Page 39: 第 3 章  MCS-51 指令系统

例:设计一散转程序,可实现当 DATA=0 、 2 、 4 时分别转移到 100H , 200H 、 300H 处。

指令序列如下: MOV A , #data    MOV DPTR , #TABLE    JMP @A+DPTR       TABLE: AJMP 100H          AJMP 200H      AJMP 300H 当 DATA=0 时, A+DPTR=TABLE,故执行指令 AJMP 100H ,转

移到 100H 处开始执行指令; 当 DATA=2时, A+DPTR=TABLE + 2 ,故执行指令 AJMP 200

H ,转移到 200H 处开始执行指令; 同理可实现其他的转移。注意:相对长转移指令为双字节指令,故 A必须为偶数。

Page 40: 第 3 章  MCS-51 指令系统

二、条件转移指令

条件转移指令均属于相对转移指令,在机器码中给出的是转移的 8位位移量。在转移指令中均包含有转移条件,当条件满足时,则程序发生转移,当条件不满足时,继续顺序执行程序。条件转移指令共有 8条。

1 、累加器内容到零转移指令 JZ rel; A=0 转移 JNZ rel; A≠0 转移 转移目的地址 PC=PC+2+rel

Page 41: 第 3 章  MCS-51 指令系统

2 、 比较转移指令 CJNE A , #data , rel

CJNE Ri, #data , rel

   CJNE @Rj, #data , rel

CJNE A , direct, rel

以上 4 条指令均为比较转移指令,指令执行时首先将两操作数比较:

若目的操作数 = 源操作数,不转移,向下顺序执行;

若目的操作数 >源操作数,则 C=0 ,转移;

若目的操作数 <源操作数,则 C=1 ,转移。

转移的目的地址 PC=PC+3+rel 例如:编写指令序列:当 P1口内容为 80H 时程序才向下执行,否则处于等待状态。程序如下:

MOV A , #80H

LOOP : CJNE A , P1 , LOOP

Page 42: 第 3 章  MCS-51 指令系统

3 、减 1 条件转移指令 DJNZ Ri, rel; Ri ←Ri-1 , Ri≠0 时转移 目的地址 PC= PC+2+rel DJNZ direct, rel; ( direct)←( direct) -1, ( direct)≠ 0 时转

移 目的地址 PC==PC+3+rel 以上两条指令可用于控制循环操作;例:从 P1.7 引脚输出 5 个周期的方波的指令序列如下: MOV R2 , #10 ; 设定输出方波数 LOOP ; CPL P1.7; P1.7 引脚信号取反 DJNZ R2 , LOOP ; 若 R2-1≠0 则继续输出CONT : ┆P1.7 引脚上的输出波形如下图:

问:该方波的周期为多少?如何修改?

Page 43: 第 3 章  MCS-51 指令系统

三、子程序调用指令 在进行程序设计时,比较好的方法是采用模块化的设计,将某些功能程序编成子程序

的形式供主程序调用,这样可使复杂的程序结构清晰,修改方便,子程序的调用与返回指令共有 4 条:

1 、长调用指令 LCALL addr16

该条指令实际执行的操作为: PC←PC+3 SP←SP+1 (SP) ←PC7~ 0 SP←SP+1 (SP) ←PC15 ~ 8 PC←addr16 指令中的 addr16 为子程序的入口地址,执行指令后, PC=addr16 ,开始执行子程序,

为了在子程序执行完毕后能正确返回主程序,用堆栈保护返回主程序 返回地址。

Page 44: 第 3 章  MCS-51 指令系统

2 、绝对调用指令 ACALL addr11指令执行的操作类似于绝对转移指令,即: PC←PC+2  SP←SP+1 (SP) ←PC7~ 0 SP←SP+1 ( SP ) ← PC15 ~ 8 PC10 ~ 0←addr11这是一条双字节的指令,当前 PC 的高 5 位加上 addr1

1 (低 11 位)为子程序的入口地址,其寻址范围为 2KB的地址空间,

Page 45: 第 3 章  MCS-51 指令系统

3 、返回指令 RET RET 为每个子程序的最后一条指令 RET ,在执行返回指令时,将原先压栈的断点出栈,从而实现返回主程序,并从原断点处重新执行主程序。 指令执行的操作为: PC15 ~ 8←( SP ) SP←SP-1 PC7~ 0←( SP ) SP←SP-1

Page 46: 第 3 章  MCS-51 指令系统

4 、中断返回指令 RETI CPU响应中断后执行的中断服务程序也存在返回主程序的问题,在中断服务程序中用 RETI 返回主程序。 RETI也具有恢复断点的功能,与 RET类似,除此之外,它还会清除“优先级激活”触发器,以重新开放同级或低级的中断申请。

注意:在调用子程序和执行中断服务程序时都需要用到堆栈,单片机上电复位后, SP=07H ,堆栈区域与工作寄存器区重叠,应注意修改堆栈指针。

Page 47: 第 3 章  MCS-51 指令系统

四、空操作指令 NOP

该指令不执行任何操作,主要用于设计延时程序,为便于程序的修改,我们也会在程序的某些位置插入一些 NOP指令,以便于将来添加指令

Page 48: 第 3 章  MCS-51 指令系统

布尔操作类指令 MCS---51 系列单片机的硬件结构中有 1 个位处理机(又称布尔处理机),并设有一个执行位操作的指令集,包括位传送、位逻辑运算、位转移等几类指令,使单片机很适宜于位处理任务重、逻辑运算多的场合。位操作指令是以位地址与进位位 C 为操作数。 MCS—51 系列单片机中可进行寻址的有片内 RAM20H ~ 2FH 中连续的 128位及专用寄存器中的可寻址位。汇编语言中位地址的表示方法有多种形式,

 ( 1 )、直接位地址方式:如 20H 单元的 D7位可表示 07H ( 2 )、点操作符号方式: 如P1口的第 0 位可表示为 P1.0 ( 3 )、位名称方式: 如直接使用 RS1 、 RS0 作位地址 ( 4 )、用户自定义名方式:如用伪指令进行定义 VS bit F0 ;可用 VS 代替 F0 寻址。

Page 49: 第 3 章  MCS-51 指令系统

一、位传送与位逻辑运算指令

MOV C ,bit; C←bit MOV bit, C ;  bit←C CLR C ; C←0 CLR bit; bit←0 CPL C ; 取反 CC CPL bit; 取反 bit←bit SETB C ; C←1 SETB bit ; bit←1 ANL C , bit ; C←C∧bit  ANL C , /bit; C←C∧bit ORL C ,bit; C←C∨bit ORL C , /bit; C←C∨bit

指令中斜线表示在运算时对bit取反,但不修改 bit的值。

Page 50: 第 3 章  MCS-51 指令系统

二、位转移指令

JC rel; C=1 转移,否则继续执行 JNC rel; C=0 转移,否则继续执行 JB bit, rel;  bit=1 转移,否则继续执行 JNB bit, rel; bit=0 转移,否则继续   JBC bit, rel ; bit=1 转移,且bit←0,否则继续向 下执

例:若 P1.7的信号为 0 转移到 key-scan子程序,若 P1.7为 1 ,则继续等待的指令程序如下:

wait: JNB P1.7, key-scan SJMP wait

Page 51: 第 3 章  MCS-51 指令系统

编程统计片内 RAM30H 开始的 20 个带符号数中负数的个数,结果存入 50H 单元。

程序如下: MOV R2 , #20 ; 置循环次数放 R2 MOV R3 , #0 MOV R0 , #30H ; 首单元地址放 R0   LOOP : MOV A , @R0 ; 取数至 A RLC A ; 带进位向左环移 1 位 JNC L1 ; C=0 时(非负数)转 L1 ,修改 R0 取下一个数 INC R3 ; C=1 ,负数,统计 ,R3←R3+1 L1 : INC R0 DJNZ R2 , LOOP ; R2←R2-1 若 R2≠0继续循环 MOV 50H , R3 RET

Page 52: 第 3 章  MCS-51 指令系统

小 结

本章介绍 MCS—51 系列单片机的指令系统,是汇编语言程序设计的基础,对每一条指令应掌握其功能、格式及适用的寻址方式。

MCS—51 系列单片机的指令系统的指令按长度可分为单字节指令、双字节指令、三字节指令;按指令周期可分为单机器周期指令、双机器周期指令、4 个周期指令,含有立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、基址加变址寻址、相对寻址六种基本的寻址方式,具有丰富的位操作指令,对位的寻址均采用直接寻址方式。

学习指令系统时,对于传送类指令,要注意访问程序存储器、片内数据存储器( RAM区和专用寄存器区)、片外数据存储器时指令与寻址方式的区别。对运算类指令注意指令执行后对程序状态字的影响。对控制转移类指令,要注意转移的条件、转移的目的地址、转移的范围。

Page 53: 第 3 章  MCS-51 指令系统

思考题与习题三

1 MCS—51 系列单片机有几种寻址方式?各举一例。2 对 51 子系列与 52 子系列,分别说明片内 RAM 与专用寄存器的寻址方式。3 分析下列各组指令的不同功能: ⑴MOV A, #30H 与 MOV A, 30H ⑵MOV A, R0 与 MOV A, @R0 ⑶MOV A, DIRECT 与 MOV A, @R0 ⑷MOV A, @R0 与 MOVX A, @R0 ⑸MOVX A, @DPTR 与 MOVC A, @A+DPTR4 试编写指令序列将片内数据存储器 30H 单元中的内容送片外 RAM3000H 单元。5 编程将片内数据存储器 30H单元中的内容与片外 RAM30H单元的内容交换。

Page 54: 第 3 章  MCS-51 指令系统

6 设 A=76H , R0=30H ,片内 (30H)=48H, ( P1 ) =C7H , SP=50H ,分析独立执行下列指令后的结果:

⑴MOV A, R0⑵MOV A,@R0⑶MOV A, #30H⑷MOV A, 30H⑸MOVX @R0, A⑹MOV 80H, #22H⑺PUSH A⑻XCH A, R0⑼SWAP A⑽XCHD A, @R07 已知: A=38H , R1=37H , B=04H , C=1 ,片内 RAM ( 37H ) =C5H

,( P1 ) =49H ,分别写出下列指令执行后的结果(包括状态位):⑴ADD A, @R1⑵ADDC A, 37H

Page 55: 第 3 章  MCS-51 指令系统

⑶SUBB A, #20H ⑷INC R1 ⑸DEC 37H ⑹MUL AB ⑺DIV AB ⑻ADD A, #30H DA A ⑼ANL A, #0FH ⑽ORL A, #0FH ⑾XRL A, #OFH8 编程将片外 RAM30H 、 31H 和 32H 、 33H 中的 2 个 16 位的无符号数相

减(高字节在高地址单元),结果存入片外 RAM30H 、 31H 单元。9 请用 3 种方法将累加器 A 中的无符号数乘 2 。10 用逻辑运算指令实现如下操作,但不得改变其他位:⑴将累加器 A 的最高位置 1 ⑵将累加器 A 的高 4 位清 0⑶清除累加器 A 的 A.6 、 A.5 、 A.4 、 A.3 ⑷将累加器 A 的 A.5 、 A.4取

Page 56: 第 3 章  MCS-51 指令系统

11 简述 LJMP AA 与 AJMP AA 的区别。12 条件转移指令的转移范围是多少?举例说明怎样计算转移的目的地址13 比较 RET 与 RETI 的异同。14 NOP 指令有何用途?15 MCS—51 系列单片机的直接寻址位有几种表示方法?各举一例。16 用位操作指令实现如下逻辑表达式: ⑴P1.0=P2.0•(P2.1+P2.2)+P2.3 ⑵P1.7=P2.0•P2.1+A.6⊕(P3.1+P3.2)17 编程将片内 RAM30H 单元开始的 20 个数传送到片外 RAM3000H 开

始的单元中。18 在片内 RAM20H 开始的单元中存有 20 个无符号数,编程求出其中的

最大值,存入片外 RAM50H 单元。19 编程计算存放在片外 RAM30H 单元开始的 64 个无符号数的平均值,

结果存入片内 RAM30H 单元。

Page 57: 第 3 章  MCS-51 指令系统

20 设计一查表程序,将从 P0口接收的 1 位 16 进制数转化为 LED 的段选码后从 P1口输出。

21 设在片外 RAM0000H 开始的单元中存有 100 个有符号数,编程统计其中的正数、负数和零的个数,结果存入片内 RAM30H 、 31H 、 32H。

22 从片内 RAM30H 单元开始的存有 5 个组合 BCD 数,编程将其转化为ASCII后存入片内 RAM40H 开始的单元中。