单片机应用技术 (C语言版) 第3章 MCS-51指令系统及 汇编程序设计 2019/7/25
第3章 MCS-51指令系统 及汇编程序设计 目 录 3.1 基本概念 3.2 MCS-51单片机指令系统 3.3 汇编语言程序格式及伪指令 3.1 基本概念 3.2 MCS-51单片机指令系统 3.3 汇编语言程序格式及伪指令 3.4 汇编语言程序设计方法 2019/7/25
3.1 基本概念 主要内容 3.1.1 汇编语言格式 3.1.2 指令中常用符号 3.1.3 寻址方式 2019/7/25
3.1.1 汇编语言格式 一、指令和指令系统 指令:是计算机中CPU根据人的意图来执行某种操作的命令。 2019/7/25
程序:人们编写的、使计算机完成某项工作的指令序列,称为程序。 程序设计语言:编写程序的一整套规则、方法。 二、程序和程序设计语言 程序:人们编写的、使计算机完成某项工作的指令序列,称为程序。 程序设计语言:编写程序的一整套规则、方法。 程序设计语言分类:分为机器语言、汇编语言和高级语言等。 2019/7/25
机器语言:用二进制编码表示每条指令,是计算机能够直接识别和执行的语言。 目标程序:用机器语言编写的程序。 三、机器语言 机器语言:用二进制编码表示每条指令,是计算机能够直接识别和执行的语言。 目标程序:用机器语言编写的程序。 例如“13+25” ,在MCS-51中的机器码为 0 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 2019/7/25
四、汇编语言:用助记符、符号、数字等表示指令的程序语言。 例如,上面的“13+25”的例子可写成: 汇编语言程序 机器语言代码 汇编语言程序 机器语言代码 MOV A,#0DH 74H 0DH ADD A,#19H 24H 19H 相对于机器语言来说,汇编语言容易理解和记忆。 汇编语言和机器语言都属于低级语言。 2019/7/25
方括号中的内容可以没有,即可以没有标号、操作数和注释,至少要有操作码。 五、MCS-51汇编语言指令格式 其一般格式如下: [标号:] 操作码 [目的操作数] [,源操作数] [;注释] 方括号中的内容可以没有,即可以没有标号、操作数和注释,至少要有操作码。 2019/7/25
例如: START: MOV A,#23H ;23H → A “START”为标号 “MOV”为操作码 “ A,#23H”为操作数 2019/7/25
Rn: n=0~7。当前选中的工作寄存器R0~R7。 Ri: i=0、1。当前选中的工作寄存器组中可作为地址指针的R0和R1。 3.1.2 指令中常用符号 Rn: n=0~7。当前选中的工作寄存器R0~R7。 Ri: i=0、1。当前选中的工作寄存器组中可作为地址指针的R0和R1。 #data: 8位立即数。 #data16:16位立即数。 direct: 8位片内RAM单元地址,含SFR。 addr16: 程序存储空间的16位地址 2019/7/25
rel:补码形式的8位地址偏移量。地址偏移量,在-128~+127。 bit:片内RAM或SFR中的直接寻址位地址 @:间址寄存器的前缀符号,表示间接寻址。 2019/7/25
((×)): 表示由×中指向的地址单元中的内容 ←、→: 指令操作流程,将内容送到箭头指向的地方 $ —— 当前指令地址 (×): 表示×中的内容 ((×)): 表示由×中指向的地址单元中的内容 ←、→: 指令操作流程,将内容送到箭头指向的地方 $ —— 当前指令地址 MOV A,#23H ;23H → A 2019/7/25
3.1.3 寻址方式 主要内容 1 立即数寻址 2 直接寻址 3 寄存器寻址 4 寄存器间接寻址 5 变址寻址 6 相对寻址 7 位寻址 3.1.3 寻址方式 主要内容 1 立即数寻址 2 直接寻址 3 寄存器寻址 4 寄存器间接寻址 5 变址寻址 6 相对寻址 7 位寻址 2019/7/25
寻址方式:就是指CPU寻找参与运算的(源)操作数的方式。(寻找操作数所在单元地址的方式。) 7种寻址方式:立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。 2019/7/25
1 立即数寻址 立即数寻址也叫立即寻址、常数寻址。其操作数就在指令中,是指令的一部分,紧跟在操作码后面,用“#”符号作前缀,以区别地址。例如: MOV A,#2CH ;2CH → A 表示把2CH这个数送给累加器A 2019/7/25
立即数的低8位送给了DPL,高8位送给了DPH。 立即数也可以是16位的,如: MOV DPTR,#1234H 立即数的低8位送给了DPL,高8位送给了DPH。 2019/7/25
2 直接寻址 直接寻址:是指操作数存放在片内RAM中,指令中给出操作数的地址。例如: MOV A,30H ;(30H)→ A 2 直接寻址 直接寻址:是指操作数存放在片内RAM中,指令中给出操作数的地址。例如: MOV A,30H ;(30H)→ A 说明: (1)直接寻址方式可以访问片内RAM的低128字节和所有的特殊功能寄存器。 FFH 特殊功能 寄存器 80H 7FH 低128B RAM data区 2019/7/25 00H
对于特殊功能寄存器,既可以使用地址,也可以使用SFR名(P21)。例如: MOV A,P1 或 MOV A,90H 2019/7/25
(2)直接寻址不能够访问片内RAM的高128字节(增强型),高128字节只能够间接访问。 FFH FFH 高128B RAM idata区 特殊功能 寄存器 80H 80H 7FH 低128B RAM data区 00H 增强型单片机片内RAM 2019/7/25
3 寄存器寻址 寄存器寻址:就是由指令指出寄存器组R0~R7中某一个或寄存器A、B、DPTR的内容作为操作数。 2019/7/25
R0、R1…R7 7F 30 堆栈和 数据缓存 用户RAM区 2F 20 位地址为 00H~7FH (128位) 位 寻 址 区 1F 18 (第3组) 工 17 10 (第2组) 作 寄 0F 08 (第1组) 存 器 07 00 (第0组) 2019/7/25
对于工作寄存器组的操作,必须要考虑PSW中RS1、RS0的值(P22),确定当前使用的是哪一组寄存器以及它们的实际地址。 例如: MOV A,R7 ;(R7)→ A MOV 36H,A ;(A)→ 36H ADD A,R0 ;(A)+(R0)→ A 对于工作寄存器组的操作,必须要考虑PSW中RS1、RS0的值(P22),确定当前使用的是哪一组寄存器以及它们的实际地址。 2019/7/25
4 寄存器间接寻址 寄存器间接寻址:由指令指出某一寄存器的内容作为操作数地址的寻址方式。 4 寄存器间接寻址 寄存器间接寻址:由指令指出某一寄存器的内容作为操作数地址的寻址方式。 存放地址的寄存器称为间址寄存器,在指令中,在寄存器前面加前缀“@”表示。 MCS-51单片机规定,使用Ri(i=0、1,即指R0、R1)、SP和DPTR作间址寄存器。 寄存器间接寻址有以下几种情况。 2019/7/25
间接访问的范围:256字节(包括低128字节和高128字节),但不包括特殊功能寄存器。例如: 一、使用Ri间接访问片内RAM 间接访问的范围:256字节(包括低128字节和高128字节),但不包括特殊功能寄存器。例如: MOV A,@Ri ;((Ri))→ A MOV @Ri,A ;(A)→(Ri) ((Ri)):表示Ri中内容为地址的数据。 操作过程如图3-3所示。 2019/7/25
R0的内容为地址,将该地址中的内容传送给累加器A。 图3-3 间接寻址(MOV A,@R0)示意图 ② 62H A : → 98H — ① 98H R0 片内RAM R0的内容为地址,将该地址中的内容传送给累加器A。 2019/7/25
间接访问的范围:片外RAM的64KB全空间。其指令也是只有两条: MOVX A,@DPTR ;((DPTR))→ A 二、使用DPTR间接访问片外RAM 间接访问的范围:片外RAM的64KB全空间。其指令也是只有两条: MOVX A,@DPTR ;((DPTR))→ A MOVX @DPTR,A ;(A)→(DPTR) DPTR为16位地址。 2019/7/25
5 变址寻址(访问空间为ROM) 变址寻址:基址加变址的间接寻址。指令中给出存放基址和变址的寄存器。 基地址寄存器:DPTR或PC; 变址寄存器:累加器A。 也在地址寄存器前面加上前缀“@”。例如: MOVC A,@A+DPTR ;((A)+(DPTR))→ A 该指令的操作过程如图3-4所示。 DPTR内容与A中内容相加作为地址,将该地址中的内容传送给A。 2019/7/25
MOVC A,@A+DPTR ;((A)+(DPTR))→ A ROM : DPTR 03E2H + 0414H 38H A 32H 图3-4 变址寻址示意图 2019/7/25
若使用DPTR为基地址寄存器,寻址范围为64KB; 若使用PC为基地址寄存器,寻址空间在PC之后256字节范围内。 变址寻址的空间为程序存储器 寻址范围: 若使用DPTR为基地址寄存器,寻址范围为64KB; 若使用PC为基地址寄存器,寻址空间在PC之后256字节范围内。 2019/7/25
例:已知片外ROM中的0302H单元中有一个常数x,现欲把它取到累加器A中,请写出程序。 MOV DPTR , #0300H MOV A, #02H MOVC A, @A+DPTR 问:MOVC A, @0302H 是否对? 2019/7/25
相对寻址:是以当前程序计数器PC值为基地址,加上指令中给出的偏移量rel,得到目标位置的地址。即: 6 相对寻址(用于跳转指令) 相对寻址:是以当前程序计数器PC值为基地址,加上指令中给出的偏移量rel,得到目标位置的地址。即: 目标地址=PC+rel ∴ rel=目标地址-PC 偏移量rel为8位补码,其值为-128~+127。rel<0程序向回跳转;rel>0,程序向前跳转。 2019/7/25
(1)在实际编程中,不需要计算rel,rel由编译器自动计算; (2)当跳转范围超出了rel范围,编译器会提示,对程序做适当调整即可。 例如: SJMP 54H 说明: (1)在实际编程中,不需要计算rel,rel由编译器自动计算; (2)当跳转范围超出了rel范围,编译器会提示,对程序做适当调整即可。 2019/7/25
7 位寻址 位寻址:是指操作数是二进制位、位地址 位操作数地址范围:片内RAM中20H~2FH,SFR中可以按位寻址的位。 例如: 30 堆栈和 数据缓存 通 用 数 据 区 2F 20 位地址为 00H~7FH (128位) 位 寻 址 1F 18 R0、R1…R7 (第3组) 工 17 10 (第2组) 作 寄 0F 08 (第1组) 存 器 07 00 (第0组) 7 位寻址 位寻址:是指操作数是二进制位、位地址 位操作数地址范围:片内RAM中20H~2FH,SFR中可以按位寻址的位。 例如: SETB 3DH 2019/7/25
2)字节地址带位号。如20H.1,表示20H单元的第1位。 3)特殊功能寄存器名带位号。如P1.7,表示P1口的第7位。 位地址的3种表示方式: 1)直接位地址(00H~7FH)。如32H 2)字节地址带位号。如20H.1,表示20H单元的第1位。 3)特殊功能寄存器名带位号。如P1.7,表示P1口的第7位。 2019/7/25
寻址方式、寻址空间及范围 寻址方式 操作数及寻址空间范围 立即数寻址 随指令读入 直接寻址 片内RAM中,低128字节和SFR 寄存器寻址 使用的寄存器:R0~R7、A、B、DPTR 寄存器 间接寻址 片内RAM:用@Ri;范围256B,不含SFR 片外RAM:用@Ri、@DPTR;范围为64KB 变址寻址 用@A+PC、@A+DPTR;在ROM中; 范围分别为PC之后256B之内和64KB全空间 位寻址 在位寻址区域;RAM的20~2FH和SFR 相对寻址 操作数是相对地址;在ROM中;范围-128~127 2019/7/25
3.2 MCS-51单片机指令系统 主要内容 3.2.1 数据传送与交换指令 3.2.2 算术操作类指令 3.2.3 逻辑运算指令 3.2.1 数据传送与交换指令 3.2.2 算术操作类指令 3.2.3 逻辑运算指令 3.2.4 控制转移类指令 3.2.5 位操作指令 2019/7/25
指令概述(P266 附录C) MCS-51单片机指令系统有111条指令,分类如下。 1、按字节分类 单字节指令:49条; 双字节指令:45条 单字节指令:49条; 双字节指令:45条 三字节指令:17条 2、按执行时间分类 单周期指令:64条; 双周期指令:45条 四周期指令:2条(乘、除指令) 2019/7/25
MCS-51指令没有复杂的寻址方式,并且助记符只有42种。 3、按功能分类(分为5大类) 数据传送指令:29条 算术运算指令:24条 逻辑运算指令:24条 控制程序转移指令:17条 位操作指令:17条 MCS-51指令没有复杂的寻址方式,并且助记符只有42种。 2019/7/25
3.2.1 数据传送指令 数据传送是使用最频繁的一类指令。 所谓传送,就是把源地址单元的内容传送到目的地址单元中去,而源地址单元中的内容不变。 数据传送指令可以分为三组:普通传送指令、数据交换指令、堆栈操作指令。 2019/7/25
普通传送指令以助记符MOV为基础,分为: 片内数据存储器传送指令,用MOV 片外数据传送指令,用MOVX 程序存储器传送指令,用MOVC 一、普通传送指令 普通传送指令以助记符MOV为基础,分为: 片内数据存储器传送指令,用MOV 片外数据传送指令,用MOVX 程序存储器传送指令,用MOVC 2019/7/25
源操作数:可以是A、Rn、@Ri、 direct、#data 目的操作数:可以是A、Rn、@Ri、direct、DPTR 1、片内数据存储器传送指令MOV 格式: MOV 目的操作数,源操作数 源操作数:可以是A、Rn、@Ri、 direct、#data 目的操作数:可以是A、Rn、@Ri、direct、DPTR 以目的操作数的不同可以分为五个小组,共16条指令。 2019/7/25
MOV A,direct ;(direct)→A MOV A,@Ri ;((Ri))→A MOV A,#data ;data →A MOV A,Rn ;(Rn)→A MOV A,direct ;(direct)→A MOV A,@Ri ;((Ri))→A MOV A,#data ;data →A 工作寄存器Rn:R0~R7 Ri间接寻址寄存器:R0或R1 本组4条指令都影响PSW中的P标志位 指令字节数:1、2、1、2 2019/7/25
MOV Rn,direct ;(direct)→ Rn MOV Rn,#data ;data → Rn MOV Rn,A ;(A) → Rn MOV Rn,direct ;(direct)→ Rn MOV Rn,#data ;data → Rn 注意: MOV Rn, Rn(错误)( P32(2) ① ) 本组指令都不影响PSW中的标志位。 指令字节数:1、2、2 2019/7/25
MOV direct,A ;(A)→ direct MOV direct,Rn ;(Rn)→ direct MOV direct2,direct1 ;(direct1)→direct2 MOV direct,@Ri ;((Ri))→ direct MOV direct,#data ;data → direct 本组指令都不影响PSW中的标志位 指令字节数:2、2、3、2、3 2019/7/25
(4)以间接地址@Ri为目的操作数 MOV @Ri,A ;(A) → (Ri) MOV @Ri,direct ;(direct) →(Ri) MOV @Ri,#data ;data → (Ri) 本组指令都不影响PSW中的标志位。 2019/7/25
(5)以DPTR为目的操作数 MOV DPTR,#data16 ;dataH→DPH,dataL→DPL 2019/7/25
例 设片内RAM中(30H)=40H,(40H)=10H,分析以下程序执行后各单元及寄存器中的内容。 MOV R0,#30H ;30H → R0 MOV A,@R0 ;((R0)) → A MOV R1,A ;(A) → R1 MOV B,@R1 ;((R1)) → B MOV 10H,#20H ;20H → 10H 执行上述指令后的结果为: (R0)=30H, (R1)=(A)=40H, (B)=10H, (10H)=20H 2019/7/25
MOVX A,@DPTR ;((DPTR))→ A MOVX @DPTR,A ;A →(DPTR) 2、片外数据存储器传送指令MOVX(P31) MOVX A,@Ri ;((Ri))→ A MOVX @Ri,A ;A →(Ri) MOVX A,@DPTR ;((DPTR))→ A MOVX @DPTR,A ;A →(DPTR) 第1和第2条指令用于访问外部RAM的低地址区,地址范围:0000H-00FFH。 第3和第4条指令用于访问外部RAM的64K字节区,地址范围:0000H-FFFFH。 2019/7/25
(2)四条指令都是通过累加器A进行数据传输的 (P32 11 ②④⑧) 注:(1)四条指令都为寄存器间接寻址 (2)四条指令都是通过累加器A进行数据传输的 (P32 11 ②④⑧) 2019/7/25
例 设片外RAM空间(0203H)=6FH,分析执行下面指令后的结果。 MOV DPTR,#0203H MOVX A,@DPTR MOV 30H,A MOV A,#0FH MOVX @DPTR,A 执行结果为:(DPTR)=0203H, (30H)=6FH,(0203H)=(A)=0FH 2019/7/25
3、程序存储器传送指令MOVC(属于变址寻址)(P31) 该类指令又称为查表指令,经常用于查表。这类指令只有以下2条单字节指令。 MOVC A,@A+DPTR ;((A)+(DPTR))→ A MOVC A,@A+PC ;((A)+(PC))→ A 前者叫远程查表指令(64KB全空间),后者叫近程查表指令(PC处256B)。 (P32 11 ③) 2019/7/25
数据交换指令要求第一个操作数必须为累加器A。 共5条指令,分为字节交换和半字节交换两个类型。 二、数据交换指令 数据交换指令要求第一个操作数必须为累加器A。 共5条指令,分为字节交换和半字节交换两个类型。 2019/7/25
XCH A,direct ;(A)←→(direct) XCH A,@Ri ;(A)←→((Ri)) 1、字节交换指令(P31底) XCH A,Rn ;(A)←→(Rn) XCH A,direct ;(A)←→(direct) XCH A,@Ri ;(A)←→((Ri)) (P32 11 ⑥) XCH R1, R2 2、低半字节交换指令(低四位交换)(P32) XCHD A,@Ri ;(A0~3)←→((Ri)0~3) 3、A自身半字节交换指令(P36) SWAP A ;(A 0~3)←→(A4~7) 2019/7/25
例 设(R0)=30H,(30H)=4AH,(A)=28H,则分别执行“XCH A,R0”、 “XCH A,@R0” “XCHD A,@R0”、“SWAP A”后各单元的内容。 ;后(A)=30H,(R0)=28H 执行:XCH A,@R0 ;后(A)=4AH,(30H)=28H 执行:XCHD A,@R0 ;后(A)=2AH,(30H)=48H 执行:SWAP A ;后(A)=82H 2019/7/25
堆栈操作有进栈和出栈两条指令,常用于保存和恢复现场。 PUSH direct ;先(SP) +1 → SP, ;后(direct)→(SP) 设(30H)=x, 将x保存起来 MOV SP #70H PUSH 30H POP 30H 三、堆栈操作指令(P30 6,属于直接寻址) 堆栈操作有进栈和出栈两条指令,常用于保存和恢复现场。 PUSH direct ;先(SP) +1 → SP, ;后(direct)→(SP) POP direct ;先((SP))→ direct, ;后(SP) -1 → SP PUSH为进栈操作, POP为出栈操作。 2019/7/25
注意:(1)进栈与出栈必须成对使用;(2)先进栈的必须后出栈,后进栈的必须先出栈,否则会出现DPL与DPH内容互换。 PUSH DPH PUSH DPL POP DPL POP DPH 2019/7/25
习题( P32 11.(1) ) 下列指令是否错误 1.MOV A,#1000H ;A←1000H 2.MOVX A,1000H ;A←(1000H)片外RAM 3.MOVC A,1000H ;A←(1000H)片外ROM 4.MOVX 60H,A ;片外RAM(60H)←A 5.MOV R0,60H ;片内RAM:(61H)←(60H) MOV 61H,@R0 6. XCH R1,R2 ;R1←→R2 7. MOVX DPTR,#2000H ;DPTR←2000H 8. MOVX 60H,@DPTR ;片内RAM←片外RAM 2019/7/25
2019/7/25
3.2.2 算术运算指令 指令内容:包括加、减、乘、除、BCD码调整等指令,共有24条。 3.2.2 算术运算指令 指令内容:包括加、减、乘、除、BCD码调整等指令,共有24条。 对标志位的影响:结果会影响进位标志CY、半进位标志AC、溢出标志OV、奇偶标志位P,但加1和减1指令不影响这些标志位。 2019/7/25
PSW寄存器 Cy:进位标志位(位7有进位) AC:辅助进位标志位(位3有进位) F0: 供用户使用的标志位 OV:溢出标志位(位6有进位,位7没进位;或位7有进位,位6没进位) P:奇偶标志位 A中数据的奇偶性。当1的个数为奇数,P=1,否则P=0。 2019/7/25
ADD A,direct ;(A)+(direct)→A ADD A,@Ri ;(A)+((Ri))→A 一、加法指令 分为不带进位加法、带进位加法和加1指令 1、不带进位加法指令ADD ADD A,Rn ;(A)+(Rn)→A ADD A,direct ;(A)+(direct)→A ADD A,@Ri ;(A)+((Ri))→A ADD A,#data ;(A)+ data→A 这组指令影响标志位CY、AC、OV和P,溢出标志OV只对有符号运算有意义。 2019/7/25
例(A)=53H,(R0)=FCH,执行ADD A, R0 2019/7/25
溢出标志OV只影响有符号数的加法运算,若OV=0,则A中结果正确;若OV=1,则A中结果不正确,只能看成无符号数。 注意: 溢出标志OV只影响有符号数的加法运算,若OV=0,则A中结果正确;若OV=1,则A中结果不正确,只能看成无符号数。 2019/7/25
ADDC A,Rn ;(A)+(Rn)+ CY→A ADDC A,direct ;(A)+(direct)+CY→A ADDC A,@Ri ;(A)+((Ri))+CY→A ADDC A,#data ;(A)+data+CY→A 这组指令影响标志位CY、AC、OV和P,溢出标志OV只对有符号运算有意义。 注:Cy伪指令执行前的Cy值,不是指令执行过程中形成的Cy值。 2019/7/25
INC direct;(direct)+ 1 → direct INC @Ri ;((Ri))+ 1 →(Ri) INC A ;(A)+ 1 → A INC Rn ;(Rn)+ 1 → Rn INC direct;(direct)+ 1 → direct INC @Ri ;((Ri))+ 1 →(Ri) INC DPTR ;(DPTR)+ 1 → DPTR 这组指令除了第一条影响标志位P之外,其它指令不影响标志位。 (A)=FFH,(Cy)=0,执行INC A 后,Cy=? 2019/7/25
1、带借位减法指令SUBB(自带Cy减法指令) SUBB A,Rn ;(A)-(Rn)-CY→A 二、减法指令 减法指令分为带借位减法指令和减1指令。 1、带借位减法指令SUBB(自带Cy减法指令) SUBB A,Rn ;(A)-(Rn)-CY→A SUBB A,direct;(A)-(direct)- CY→A SUBB A,@Ri ;(A)-((Ri))-CY→A SUBB A,#data ;(A)-data-CY→A 2019/7/25
DEC direct;(direct) - 1 → direct DEC @Ri ;((Ri)) - 1 →(Ri) DEC A ;(A) - 1 → A DEC Rn ;(Rn) - 1 → Rn DEC direct;(direct) - 1 → direct DEC @Ri ;((Ri)) - 1 →(Ri) 这组指令除了第一条影响标志位P之外,其它指令不影响标志位。 2019/7/25
;(A)×(B)→ B(高8位)、A(低8位) (1)A,B均为无符号整数 三、乘法指令MUL 在MCS-51单片机中,乘法指令只有一条。 MUL AB ;(A)×(B)→ B(高8位)、A(低8位) (1)A,B均为无符号整数 (2)对标志位的影响:若乘积大于0FFH,OV置1,否则OV清0;影响P标志位;对CY总是清0。 2019/7/25
DIV AB ;(A)/(B),商→A、余→B (1)A,B均为无符号整数 (2)对标志位的影响:如果除数(B)=0,则标志位OV置1,否则清0;影响P标志位;CY总是被清0。 2019/7/25
3.2.3 逻辑操作指令 逻辑操作指令包括与、或、异或、清0、求反、移位等操作指令,共有24条。 指令中的操作数: 3.2.3 逻辑操作指令 逻辑操作指令包括与、或、异或、清0、求反、移位等操作指令,共有24条。 指令中的操作数: A、Rn、direct、@Ri、#data 为了便于讨论,将其分为5组进行讨论。 2019/7/25
前一条指令是对A清0,该指令影响奇偶标志位P。 后一条指令是对A求反,不影响任何标志位。 CLR A ;0 → A CPL A ;(A) → A 前一条指令是对A清0,该指令影响奇偶标志位P。 后一条指令是对A求反,不影响任何标志位。 2019/7/25
说明:(1)这4条指令,每执行一次只 移动1位;(2)左移一次相当于乘以2,右移一次相当于除以2。 2、循环移位指令 A循环左移: RL A ; A循环右移: RR A ; A带进位循环左移 :RLC A ; A带进位循环右移 :RRC A ; 说明:(1)这4条指令,每执行一次只 移动1位;(2)左移一次相当于乘以2,右移一次相当于除以2。 对标志位影响:仅后两条指令影响CY和P a7 ← a0 a7 → a0 a7 ← a0 CY a7 → a0 CY 2019/7/25
ANL A,direct ;(A)∧(direct)→ A ANL A,@Ri ;(A)∧((Ri))→ A ANL A,Rn ;(A)∧(Rn)→ A ANL A,direct ;(A)∧(direct)→ A ANL A,@Ri ;(A)∧((Ri))→ A ANL A,#data ;(A)∧ data → A ANL direct,A ;(direct)∧(A)→ direct ANL direct,#data ;(direct)∧data→direct 作用:用于使某些位清0。 2019/7/25
ORL A,direct ;(A)∨(direct)→ A ORL A,@Ri ;(A)∨((Ri))→ A 目标地址 4、逻辑或指令ORL ORL A,Rn ;(A) ∨(Rn)→ A ORL A,direct ;(A)∨(direct)→ A ORL A,@Ri ;(A)∨((Ri))→ A ORL A,#data ;(A)∨data → A ORL direct,A ;(direct)∨(A)→ direct ORL direct,#data ;(direct)∨data→direct 作用:用于使某些位置1。 2019/7/25
XRL A,direct ;(A) (direct)→ A XRL A,@Ri ;(A) ((Ri))→ A XRL A,Rn ;(A) (Rn)→ A XRL A,direct ;(A) (direct)→ A XRL A,@Ri ;(A) ((Ri))→ A XRL A,#data ;(A) data → A XRL direct,A ;(direct) (A)→ direct XRL direct,#data ;(direct) data→direct 作用:用于使某些位取反,其余位不变。 用1异或使对应位取反,用0异或使对应位保留(不变);自身异或,实现清零。 2019/7/25
4)使(A)=AAH的高四位不变,低四位取反。 对应指令如下: ANL A,#11010101B ORL A,#01010100B 例 写出完成以下各功能的指令: 1)只对累加器A中的1、3、5位清0; 2)只对A中的2、4、6位置1; 3)只对A中的0、1、6、7位取反。 4)使(A)=AAH的高四位不变,低四位取反。 对应指令如下: ANL A,#11010101B ORL A,#01010100B XRL A,#11000011B XRL A, #00001111B 2019/7/25
3.2.4 控制转移类指令 MCS-51单片机有17条转移类指令,包括无条件转移指令、条件转移指令、子程序调用及返回指令等。 3.2.4 控制转移类指令 MCS-51单片机有17条转移类指令,包括无条件转移指令、条件转移指令、子程序调用及返回指令等。 对标志位影响:只有比较转移指令影响进位标志CY,其它指令不影响标志位。 2019/7/25
无条件转移指令:当程序执行该指令后,程序无条件地转移到指定的地址去执行。 包括短转移、长转移和间接转移3条指令 一、无条件转移指令 无条件转移指令:当程序执行该指令后,程序无条件地转移到指定的地址去执行。 包括短转移、长转移和间接转移3条指令 1、短转移指令SJMP(相对转移指令,2字节) SJMP rel ;(PC)+ rel→PC rel=(Ad-As-Bn):相对转移偏移量,有符号数,﹣128~127,负数表示向回跳转,正数表示向前跳转。 指令实际写为:“SJMP 目标地址标号” P47 2019/7/25
SJMP $:停机指令。 (HERE:SJMP HERE) P39 2019/7/25
程序可以跳转到64KB程序存储器空间的任何地方。 指令的实际编写形式为:“LJMP 目标地址标号”。 LJMP addr16 ;addr16 → PC 程序可以跳转到64KB程序存储器空间的任何地方。 指令的实际编写形式为:“LJMP 目标地址标号”。 2019/7/25
JMP @A+DPTR ;(A)+(DPTR)→PC DPTR为基址,A为相对偏移,在64KB范围内无条件转移。 也叫散转指令、多分支转移指令。 JMP @A+DPTR ;(A)+(DPTR)→PC DPTR为基址,A为相对偏移,在64KB范围内无条件转移。 说明:(1)DPTR一般为确定的值,累加器A为变值,根据A的值转移到不同的地方,因此该指令也叫散转指令。 (2)在使用中,往往与一个转移指令表一起实现多分支转移。 2019/7/25
MOV DPTR,#TABLE ;表首地址送DPTR JMP @A+DPTR ;根据A值转移 TABLE: 例3-13 分析下面多分支转移程序段。 MOV B,#3 MUL AB ;开始时(A)=0、1、2 MOV DPTR,#TABLE ;表首地址送DPTR JMP @A+DPTR ;根据A值转移 TABLE: LJMP TAB0 ;(A)=0时转到TAB0执行 LJMP TAB1 ;(A)=3时转到TAB1执行 LJMP TAB2 ;(A)=6时转到TAB2执行 ...... 程序中,根据累加器A的开始值(0、1、2)转移到相应的TAB0~TAB2分支去执行。 2019/7/25
当指令中条件满足时,程序转到指定位置执行,条件不满足时,程序顺序执行。 二、条件转移指令 当指令中条件满足时,程序转到指定位置执行,条件不满足时,程序顺序执行。 条件转移指令有三种:判断累加器A转移指令、比较转移指令、循环转移指令,共8条。 2019/7/25
JZ rel ;(A)=0, (PC)+ rel→PC ;(A)≠0, 顺序执行 判断A非0转移: JNZ rel ;(A)≠0, (PC)+ rel→PC ;(A)=0, 顺序执行 指令的实际编写形式分别为:“JZ 目标地址标号”和“JNZ 目标地址标号”。 2019/7/25
例 试编写程序,把片外RAM地址从2000H开始的数据,传送到片内RAM地址从30H开始的单元,直到出现00H为止。 程序段如下: MOV DPTR,#2000H MOV R0,#30H LOOP: MOVX A,@DPTR MOV @R0,A INC R0 INC DPTR JNZ LOOP ;(A)≠0跳转 SJMP $ ;程序停留到此 2019/7/25
比较转移指令功能较强,共有4条指令 ,一般格式为: CJNE 操作数1,操作数2,rel (目标标号) 指令功能:两个操作数做比较,若不等则转移,否则顺序执行。 2019/7/25
具体形式如下, 第一条: CJNE A,direct,rel 第二条: CJNE A,#data,rel 第三条: CJNE Rn,#data,rel 第四条: CJNE @Ri,#data,rel 2019/7/25
(2)指令执行过程中的比较操作实际上为减法操作,不保留两数之差,但要形成Cy标志。 注: (1)编程时rel用目标地址标号表示, CJNE A, #21,LOOP1 (2)指令执行过程中的比较操作实际上为减法操作,不保留两数之差,但要形成Cy标志。 2019/7/25
DJNZ direct,rel ; 3字节指令。 指令的实际编写形式为: DJNZ Rn,目标地址标号 DJNZ direct,目标地址标号 循环转移指令共有两条指: DJNZ Rn,rel ; 2字节指令。 DJNZ direct,rel ; 3字节指令。 指令的实际编写形式为: DJNZ Rn,目标地址标号 DJNZ direct,目标地址标号 2019/7/25
例3-15 试编写程序,统计片内RAM中从40H单元开始的20个单元中00H的个数,结果存于R2中。 程序段一(用JNZ判断数据是否为0): MOV R0,#40H ;R0指向40H MOV R7,#20 ;R7控制循环 MOV R2,#0 ;R2存放结果 LOOP: MOV A,@R0 JNZ NEXT ;(A)≠0转 INC R2 NEXT: INC R0 DJNZ R7,LOOP SJMP $ 2019/7/25
程序段二 (用CJNE判断数据是否为0): MOV R0,#40H ;R0指向40H MOV R7,#20 ;R7控制循环 LOOP: CJNE @R0,#00H,NEXT INC R2 NEXT: INC R0 DJNZ R7,LOOP 2019/7/25
三、子程序调用和返回指令 这类指令有3条,一条调用,两条返回。 1、子程序调用指令 ACALL addr16 ( 2字节指令) LCALL addr16 (3字节指令) 2019/7/25
2、子程序返回指令(只能用在子程序末尾) RET ; 2019/7/25
3、中断服务程序返回指令 RETI ; “RETI”只能用在中断服务程序末尾。 四、空操作指令 NOP ;延时一个机器周期 常用于延时 2019/7/25
还有两条指令:这两条指令是“AJMP”和“ACALL”,称为绝对转移(短转移)指令和绝对子程序调用(短调用)指令。 初识这两条指令:这两条指令的转移范围是绝对划定的2KB,用不好会出现错误,并且其编码也不好理解(见附录B),所以没有必要使用这两条指令。 2019/7/25
3.2.5 位操作指令 说明:在进行位操作时,位累加器C即为进位标志CY。 位地址区域: 3.2.5 位操作指令 说明:在进行位操作时,位累加器C即为进位标志CY。 位地址区域: 1)片内RAM字节地址20H~2FH单元中连续的128个位(位地址为00H~7FH); 2)部分SFR中的位。 2019/7/25
2)字节地址带位号,如20H.0,表示20H单元的第0位。 3)特殊功能寄存器名带位号,如P2.3,表示P2口的第3位。 4)位符号地址。 位地址的表示方式: 1)直接位地址(00H~FFH),如18H。 2)字节地址带位号,如20H.0,表示20H单元的第0位。 3)特殊功能寄存器名带位号,如P2.3,表示P2口的第3位。 4)位符号地址。 例如,用上述4种方式都可以表示PSW(D0H)中的第2位,分别为:D2H、D0H.2、PSW.2、OV。 2019/7/25
位操作指令共有17条,可以将其分成:位数据传送指令、位逻辑操作指令、位控制转移指令三组进行讨论。 2019/7/25
例 编写程序,把片内RAM中07H位的数值,传送到ACC.0位。 程序段如下: MOV C,07H MOV ACC.0,C 一、位传送指令 MOV C,bit ;(bit)→ C MOV bit,C ;(C)→ bit 例 编写程序,把片内RAM中07H位的数值,传送到ACC.0位。 程序段如下: MOV C,07H MOV ACC.0,C 注意:位之间不能够直接传送,必须借助于C。 2019/7/25
位逻辑操作指令包括位清0、位置1、位取反、位与、位或,共10条指令。 1、位清0指令 CLR C ;0 → C 二、位逻辑操作指令 位逻辑操作指令包括位清0、位置1、位取反、位与、位或,共10条指令。 1、位清0指令 CLR C ;0 → C CLR bit ;0 → bit 2、位置1指令 SETB C ;1 → C SETB bit ;1 → bit 2019/7/25
ANL C,bit ; (C) ∧(bit)→ C ANL C,bit ; (C)∧(bit) → C 5、位或指令 3、位取反指令 CPL C ;(C) → C CPL bit ;(bit) → bit 4、位与指令 ANL C,bit ; (C) ∧(bit)→ C ANL C,bit ; (C)∧(bit) → C 5、位或指令 ORL C,bit ; (C)∨(bit) → C ORL C,bit ; (C)∨(bit) → C 注:在MCS-5指令系统中没有位异或指令,必须用位操作指令来实现。(P41 5) 2019/7/25
位转移指令是判断C或bit为条件的转移指令,共5条指令。 1、以C为条件的转移指令(2字节指令) 三、位条件转移指令(P41 4) 位转移指令是判断C或bit为条件的转移指令,共5条指令。 1、以C为条件的转移指令(2字节指令) JC rel ;若(C)=1, 则(PC)+rel→PC; ;否则顺序向下执行 JNC rel ;若(C)=0, 则(PC)+rel→PC; ;否则顺序向下执行 2019/7/25
JB bit,rel ;若(bit)=1,则(PC)+rel → PC;否则顺序向下执行 JNB bit,rel ;若(bit)=0,则(PC)+rel JBC bit,rel ;若(bit)=1,则(PC)+rel → PC,且0 → bit; 否则顺序向下执行 2019/7/25
例 编写程序,利用位操作指令,实现下图所示的硬件逻辑电路功能。 例 编写程序,利用位操作指令,实现下图所示的硬件逻辑电路功能。 程序段如下: MOV C,P1.1 ORL C,P1.2 CPL C ANL C,P1.0 + & P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 D E F G 2019/7/25
MOV F0H,C ;(C)→ F0H位 MOV C,P1.3 ;(P1.3)→ C ANL C,P1.4 ;(C)∧ P1.4 →C CPL C ; ORL C,F0H ;(C)∨(0F0H)→ C MOV P1.5,C ;(C)→ P1.5 + & P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 D E F G 2019/7/25
3.3 汇编语言程序格式及伪指令 2019/7/25
SJMP $ ;相当于 LOOP1: SJMP LOOP1 END ; 结束标记 标号 源程序 注释 ORG 0000H ; 整个程序起始地址 LJMP MAIN ; 跳向主程序 ORG 0030H ; 主程序起始地址 MAIN: CLR C ; MAIN为程序标号 LOOP: MOV A , @R0 ADDC A, @R1 INC R0 DJNZ R1, LOOP ;相对转移 SJMP NEXT MOV R1, #03H NEXT: DEC R0 SJMP $ ;相当于 LOOP1: SJMP LOOP1 END ; 结束标记 2019/7/25
伪指令的功能:在汇编程序中,用于指示汇编程序如何对源程序进行汇编。 对伪指令的处理:不同于指令,在汇编时并不翻译成机器代码,只是在汇编过程进行相应的控制和说明。 伪指令的具体作用:通常在汇编程序中用于定义数据、分配存储空间、控制程序的输入/输出等。 在MCS-51系统中,常用的伪指令有以下7条。 2019/7/25
ORG伪指令称为起始汇编伪指令,常用于汇编语言某程序段的开始或某个数据块的开始。一般格式为: 其标号为可选项。例如: ORG 0040H MAIN: MOV SP,#0DFH MOV 30H,#00H 2019/7/25
END伪指令称为结束汇编伪指令。一般格式为:END 注:一个源程序只能有一个END命令。 三、EQU伪指令 无冒号 2019/7/25
注:EQU伪指令中的标号必须先赋值后使用。此值可以使8进制数或地址也可以使16进制数或地址。 A EQU 20H A10 EQU 10H DELAY EQU 07E6H 2019/7/25
四、BIT伪指令 BIT伪指令称为位地址符号伪指令。其格式为: 标号 BIT 位地址 FLAGRUN BIT 00H FLAGMUS BIT 01H FLAGALAR BIT P1.7 2019/7/25
五、DB伪指令 BD伪指令称为定义字节伪指令。其格式为: [标号:] DB 项(字节数据、字节数表或字符、字符串) 它的功能是从指定单元开始定义(存储)若干个字节的数据或字符、字符串。字符用ASCII码表示。 注:用DB伪指令定义的数据只占一个字节 2019/7/25
例: ORG 0900H TAB: DB 45H, 73,’A’ 上述程序汇编后: (0090H)=45H (0091H)=49H 2019/7/25
六、DW伪指令 DW伪指令称为定义字伪指令。其格式为: [标号:] DW 字数据或字数据表 注意:高字节存放在前,低字节存放在后 2019/7/25
例如: ORG 1000H TABLE2:BW 1234H,24H 上述程序汇编后: (1000H)=12H (1001H)=34H 2019/7/25
本章小结 本章首先认识了汇编语言的概念及其构成。 然后介绍了MCS-51单片机的寻址方式、指令系统,以及常用的汇编伪指令。 本章是单片机汇编语言程序设计的基础,为了成为单片机程序设计的高手,必须要掌握好本章的内容。 2019/7/25
习题 1、指出下列每条指令的寻址方式和功能。 (1)MOV A , #40H (2)MOV A, 40H (3)MOV A, @R1 (5)MOVC A, @A+PC (6)SJMP LOOP 2019/7/25
2、指出下列程序执行后的操作结果。(1)MOV A,#60H MOV R0,#40H MOV @R0 ,A MOV 41H, R0 XCH A, R0 2019/7/25
(2) MOV DPTR,#2003H MOV A,#18H MOV 20H ,#38H MOV R0, #20H XCH A, @R0 2019/7/25
3、已知(20H)=X,(21H)=Y和(22H)=Z,请用图示说明下列程序执行后堆栈中内容是什么? (1)MOV SP,#70H PUSH 20H PUSH 21H PUSH 22H 2019/7/25
(2)MOV SP,#60H PUSH 22H PUSH 21H PUSH 20H 2019/7/25
4、已知(SP)=73H,(71H)=X,(72H)=Y和(73H)=Z,试问执行下列程序后,20H、21H、22H单元中内容是什么?并用图示说明堆栈指针SP的指向和堆栈中数据的变化。 POP 20H POP 21H POP 22H 2019/7/25