1.03k likes | 1.2k Views
第三章 单片机指令系统. 3.1 指令系统简介. 3.2 寻址方式. 3.3 数据传送指令. 3.4 算术运算类指令. 3.5 逻辑运算 类指令. 3.6 控制转移 指令. 3.7 位操作指令. 3.1 指令系统的简介. MCS-51 共有 111 条指令,指令的长度和 执行时间因不同的指令而各不相同。 3.1.1 指令格式 3.1.2 指令的三种表示形式 3.1.3 指令的字节数 3.1.4 指令的分类. 继续. 3.1.1 指令格式. 指令格式:既指令的结构形式。.
E N D
第三章 单片机指令系统 3.1 指令系统简介 3.2 寻址方式 3.3 数据传送指令 3.4 算术运算类指令 3.5 逻辑运算类指令 3.6 控制转移指令 3.7 位操作指令
3.1 指令系统的简介 MCS-51共有111条指令,指令的长度和 执行时间因不同的指令而各不相同。 • 3.1.1 指令格式 • 3.1.2 指令的三种表示形式 • 3.1.3 指令的字节数 • 3.1.4 指令的分类 继续
3.1.1 指令格式 指令格式:既指令的结构形式。 操作数或操作数地址 操作码 举例:MOV A,#0FFH ADD A,R0
3.1.2 指令的三种表示形式 (1) 二进制的表示形式: (以“累加器的内容+08H”为例) 00100100B 操作码 OP (加法) 00001000B 操作数DATA(08H) (2) 十六进制表示方式: 它是对二进制形式的一种简化。 00100100B 24H 00001000B 08H
(3)指令的“助记符”方式(“汇编格式”): 00100100B 24H 00001000B 08H ADD A,#08H 1)是一种由英文单词或字母、数字来表征 指令功能形式。 2) “汇编”格式的指令必须把它“翻译”为二 进制形式“机器码”后才能为CPU所识别。 3)三种不同的表示方法适用于不同的场合。 二进制表示形式 十六进制表示 汇编格式
3.1.3 指令的字节数 分为单字节、双字节和三字节。 一、单字节指令(49条): 无操作数:如 INC DPTR ;10100011B INC A ;00000100B 【特点】:操作数隐含在操作码中。 含有操作数寄存器名称的单字节指令: 如:MOV A,R0 11101000B MOV A,R111101001B 【特点】:寄存器名以三位数代码的形式在指 令的后三位。
二、双字节指令(46条): 指令的操作码和操作数各占一个字节。 如: MOV A,#data ; 01110100B data MOV A, #data n+1 双字节指令在程序存储器的存放示意图
三、三字节指令(16条) (1)指令中的操作数为双字节。如: MOV DPTR,#data16 ; (2)指令中分别包含1个字节的操作数和1个字节的操 作数地址。如: MOV direct,#data举例:MOV 20H,#0FFH MOV DPTR,#data16 MOV direct,#data 三字节指令在存储器中存放的方式示意图
指令的字节数与指令的运行时间 • 指令的字节多是否意味着指令周期就长? 从表中可见,指令的字节数与指令周期不是对等的关系
3.1.4 指令的分类(41页) (1)数据传送类指令:完成数据在单片机内部之间的传送。分为8位数和16位两种。 • (2)算术运算指令:用于操作数之间的加、减、乘除运算。 【特点】:多数情况下:操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。 • (3)逻辑操作和循环移位指令:操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在A中,结果也存于A。
(4)控制转移类指令: 条件转移、无条件转移,调用和返回。 【 特点】:通过修改程序指针PC的内容,使CPU转到另一处执行,从而改变程序的流向。 (5)位操作指令: 位传送、位置位、位运算和位控制转移等操作。 【 特点】:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。
3.2 寻址方式 • 在指令的操作数位置上,用于表征、寻找操作数的方式定义为“寻址方式”。 • 在MCS-51单片机中,共使用了七种寻址方式。 分别是: (1)立即数寻址 (5)变址寻址; (2)直接寻址 (6)相对寻址; (3)寄存器寻址 (7)位寻址。 (4)寄存器间接寻址 继续
ROM ROM DPTR n 74H 90H 累加器A n+1 5FH 20H 00H 3.2.1 立即寻址 • 指令本身直接含有所需要的8位或16位的操作数。 将此数称为“立即数”(使用#标明)。如: MOV A,#5FH;将(8位)立即数送累加器A MOV DPTR,#2000H ;16位立即数送DPTR寄存器
累加器A 程序ROM 数据RAM OP 操作数x n 3AH 3AH n+1 3.2.2 直接寻址 • 指令直接给出了操作数的地址。如: MOV A,3AH ;将RAM3AH单元内容送累加器 直接寻址的指令长度是两个或三个字节。 直接寻址示意图
(1)指令助记符中direct是用16进制数表示的操作数地址。当地址在SFR区域时,指令用寄存器名表示。(1)指令助记符中direct是用16进制数表示的操作数地址。当地址在SFR区域时,指令用寄存器名表示。 如:MOV A,80H可以写成 MOV A,P0 MOV A,SBUF;串口数据缓冲器数据送A MOV IE,#00H;初始化中断允许寄存器 MOV TH1,#0FEH;为定时器1赋初值 使用直接寻址应注意的三个问题:
(2)当直接地址在工作寄存器区中时,可使用两种寻址方式来访问。 如: MOV A,00H; MOV A,R0; 类似的还有累加器A: INC A ;寄存器寻址方式(单字节); INC ACC ;直接寻址方式(双字节); INC 0E0H ;直接寻址方式(双字节)。
2FH 字节地址 24H 20H 片内 RAM(20H-2FH)中的位寻址区结构图 位地址
3.2.3 寄存器寻址 • 当所需要的操作数在内部某一个寄存器Rn中时,将此寄存器名Rn直接写在指令的操作数的位置上。如: MOV A,R0 MOV 20H,R0 INC R1 ADD A,R3 注意:寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有存放操作数的寄存器的3位代码。以MOV A,Rn为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH 1 1 1 0 1 r r r 返回
(3)在指令系统中:字节地址与位地址是完全(3)在指令系统中:字节地址与位地址是完全 不同的概念。 如: MOV A,20H ;将RAM的20H单元内容送A MOV C,20H ;将位寻址区中的位地址为 20H位内容送PSW 的Cy中。
RAM ROM x 11100000 3AH 3.2.4 寄存器间接寻址 • 指令中含有保存操作数地址的寄存器Ri。 MOV A,@Ri ( i=0、1) 如:MOV R0,#3AH ;立即数送R0寄存器 MOV A,@R0 ;从RAM的H单元取数送累加器A 累加器A 3AH 3 2 1 R0 00H
使用寄存器间址指令时应注意问题 (1)间址寄存器Ri只能使用R0、R1(i=0、1)。 (2)间址方式适用于片内和片外 RAM。 • 对于片内RAM使用Ri,寻址范围为00H~FFH。 • 对于片外RAM,可以使用Ri,也可以使用DPTR 做间址寄存器。两者区别在于后者寻址范围为 0000H~FFFFH,两者都可以RAM和ROM。 (3)间址方式的指令不能访问SFR中的单元。 MOV R1,#80H(错误) MOV A,@R1 (因为80H为SFR的物理地址)
MCS-51 片内 、片外 数据存储器示意图 注意: 1,访问片内RAM20H存储单元; MOV A,20H 2,访问片外RAM存储单元; MOV R0,#20H MOVX A,@R0 3,尽管片内与片外的RAM单元 的00H-FFH地址相重叠,但由 于指令的不同不会发生地址 混乱。 FFFFH 片外数据 存储器 64KB FFH 特殊功能 寄存器 SFR 80H 7FH 通用数据 存储器 00H 0000H 片内数据存储器 片外数据存储器 256B个字节 64KB个字节
3.2.5 变址寻址 • 指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,和作为操作数地址。 如: MOVX A,@A+PC ;PC内容与A的内容相加得操作数地址并将此操作数送A MOVX A,@A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A
变址指令适用于对ROM存储器得访问,查表。 【举例】:已知ROM中0302H 单元有一个数x,现要把它送到累加器A中,试编程。 MOV DPTR,#0300H;立即数送DPTR MOV A,#02H;立即数送累加器A MOVC A,@A+DPTR ;从ROM的0302单元取数送A
变址寻址示意图 累加器A DPTR 02H 0300H 0300H + 02H 0302H ALU 0302H MOVC A,@A+DPTR
3.2.6 相对寻址 • 相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标地址。 SJMP rel • 由指令中有一个8位偏移量 rel为带符号位的补码,所以控制程序转移的范围为+127~-128。
程序存储器ROM 操作码 80H 2000H 54H 偏移量 2002H (LOOP1) 2056H 例如:SJMP 54H ;(80H、54H) 累加器A PC 54H 2002H 2002H + 54H 2056H ALU
相对寻址使用中应注意的问题 • 1,CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明: 指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。 如果使用三字节的相对转移指令,则PC=PC+3。
2,偏移量的计算: rel=目标地址-源地址-2 (2字节指令) 结果用补码的形式书写。 为了减少计算偏移量的计算,汇编程序允许使用“符号地址”的方式代替偏移量。如: SJMP loop1 • 3, 如果转移地址的范围超过相对寻址的范围(如:-127~+128)时,就要采用别的方式法,否则在编译时,提示出错。
外设1 状态信号 MCS-51 单片机 控制、检测 系统 外设2 状态信号 电动机 驱动器 控制信号 3.2.7 位寻址 • 在位寻址指令(位操作指令)中使用的位地址。 单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以 bit --- “位”的形式进行各种运算、处理和存储的。
【举例】: SETB 20H ;将位地址为20H的位置1 SETB 90H ;将P1口的d0位置1 • 第二例中,完全可以使用下面的指令格式: SETB P1.0 ;将P1口的d0位置1 类似还有: MOV C, ACC.7 ;将累加器中的d7位送PSW的cy
3.3 数据传送指令 • 3.3.0 传送指令的特点 • 3.3.1 内部数据传送类指令 • 3.3.2 外部数据传送类指令 • 3.3.3 堆栈操作指令 • 3.3.4 数据交换指令
3.3.0 传送指令的特点 • 功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。 • 必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。 • 传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。 指令通式:MOV <dest>,<src> 【举例】:MOV A,R0 ;将R0寄存器中的数据送 累加器A中(注意寻址方式)
3.3.1 内部数据传送类指令 (1) 以累加器为目的操作数的指令 (2) 以寄存器Rn为目的操作数的指令 (3) 以直接地址为目的操作数的指令 (4) 以寄存器间接地址为目的字节传送指令 (5) 16位数据传送指令
(1) 以累加器为目的操作数的指令(4条) MOV A,Rn;Rn→A MOV A,direct;(direct)→A MOV A,@Ri;(Ri)→A MOV A,#data ;data→A (2) 以寄存器Rn为目的操作数的指令(3条) MOV Rn,A MOV Rn,direct MOV Rn,#data
(3)以寄存器间接地址为目的字节传送指令(3条)(3)以寄存器间接地址为目的字节传送指令(3条) MOV @Ri,A;A →(Ri) MOV @Ri,direct;(direct) →(Ri) MOV @Ri,#data; data →(Ri) 例: MOV @R0,A MOV @R1,20H MOV @R0,#34H
(4) 以直接地址为目的操作数的指令(5条) MOV direct,A MOV direct,Rn MOV direct1,direct2 MOV direct,@Ri MOV direct,#data 这组指令功能是把源操作数指定的内容送入由直 接地址指出的片内存储单元。 例: MOV 20H,A MOV 20H,R1 MOV 20H,30H MOV 20H,@R1 MOV A0H,#34H MOV P2,#34H
(5)16位数据传送指令(1条) • MCS-51指令系统唯一的16位数据传送指令。 MOV DPTR,#data16 DPTR是单片机内部SFR中的两个寄存器DPH、DPL组合而成。其中DPH为高八位,DPL为低八位。 DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K (0~65535)。
(6)内部数据传送类指令的使用 • ①在使用传送指令时,可以根据实际情况选用恰当寻址方式。但不能根据主观意愿去“创造”指令。 例如:要将R0中数据传送到R1中。如何使用指令去完成上面操作? MOV R1,R0是否可以? 只能使用: 1,MOV A,R0 或: 2, MOV 01H,00H MOV R1,A
MCS-51内部数据传送类指令方式图 累加器A direct 直接寻址 @Ri间址 Rn寄存器 Data立即数 返回上一次
②以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。②以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。 • ③要会正确地估计指令的字节。 【举例】: MOV A, @RI ( )个字节 MOV A, DIRECT ( )个字节 MOV DIRECT,DATA ( )个字节 MOV DIRECT2,DIRECT1 ( )个字节
④在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。④在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。 • ⑤注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子: MOV A,30H ;(30h) → A MOV A,R0 ; R0 → A MOV 40H,30H ;(30h) → 40h MOV A,@Ri ; ( Ri ) → A
RAM X 30H Y 40H (7)内部传送类指令举例 • 试编出把30h和40h单元内容进行交换。 MOV A,30H ;(30h) → A MOV 30H,40H ;(40h) → 30h MOV 40H,A ; A → 40h 1 累加器A 2 3
3.3.2 外部RAM数据传送类指令 • MOVX A,@Ri • MOVX @Ri,A • MOVX A,@DPTR MOVX @DPTR,A
外部RAM的字节传送指令举例 • 已知外部RAM的2040H单元有一个数x,试编程将x送外部RAM的2560H单元。 【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次MOVX 指令完成此操作。 ORG 2000H MOV DPTR ,#2040H ;为16位指针赋值 MOVX A, @DPTR ;取 x 到累加器A MOV DPTR,#2560H ;为16位指针赋值 MOVX @DPTR,A;x 送RAM2560h单元 SJMP $ ;停机 END
3.3.3 数据交换指令 • 格式:XCH A, Rn ;A ↔ Rn XCH A, direct ;A ↔ (direct) XCH A, @Ri ;A ↔ (Ri) XCHD A, @Ri ;A3~0↔((Ri))3~0 SWAP A
数据交换指令举例(一) • 举例:已知片外RAM20H单元、内部RAM20H单元分别 有数X和Y,试编程互将两数相交换。 MOV R1, #20H ;指针赋初值 MOVX A, @R1 ;X→A XCH A, 20H ;交换 A↔(20H),Y→A MOVX @R1, A ;Y→(20H)片外RAM 累加器A 1 (y)x 2 20h 20h 3
(A)=30H 00110000 00000101 50H 数据交换指令举例(二) • 已知:RAM的50H单元有一个0~9的数,试编程将它 变成相 应的ASCII码。 【解】:0~9的ASCII码是30H~39H,两者相差30H。 MOV R0, #50H ;指针赋值 MOV A, #30H ;30H→A XCHD A, @R0 ; A3~0↔(R0)3~0, MOV @R0, A ;A中的ASCII送回50H单元 思考: 另一种方法实现本题,试编程实现? 1 00110101 00110101 2
3.3.4 查表指令(2条) • MOVC A,@A+DPTR ;A ← (A+DPTR) MOVC A,@A+PC ;PC ←PC+1, A ← (A+PC) 该指令也称为“查表”指令。在ROM中建立 一 个数据表,可以使用DPTR、PC作为数据 表格的基地址。
举例 • 已知累加器A中存有0~9范围内的数,试用查表指令编写出查找出该数平方的程序。 (1)采用DPTR作基址寄存器: MOV A,40H MOV DPTR,#LAB MOVC A,@A+DPTR … … LAB:DB 0,1,8,27,64… … 若(40H)为2,查表得8并存于A中 (2)采用PC作基址寄存器: 2000H 2001H 2002h 2003h 2004h 2005h 2006h 2007h 2008h 2009h