1 / 56

第三章 MCS-51 单片机指令系统 §3-1 MCS-51 指令系统概述 3-2 MCS-51 单片机的寻址方式 §3-3 数据传送类指令 §3-4 算术运算类指令

第三章 MCS-51 单片机指令系统 §3-1 MCS-51 指令系统概述 3-2 MCS-51 单片机的寻址方式 §3-3 数据传送类指令 §3-4 算术运算类指令 §3-5 逻辑运算类及移位指令 §3-6 控制转移类指令 §3-7 布尔变量操作类指令 . §3-1 MCS-51 指令系统概述 一、指令的概念 1 、指令的定义 指令是指挥计算工作的命令。一条指令就是计算机所能执行的一种基本操作描述。指令是计算机软件的基本单元。指令有两种基本表达形式:机器码指令和汇编语言指令。 2 、机器码指令与汇编语言指令

cortez
Download Presentation

第三章 MCS-51 单片机指令系统 §3-1 MCS-51 指令系统概述 3-2 MCS-51 单片机的寻址方式 §3-3 数据传送类指令 §3-4 算术运算类指令

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 MCS-51单片机指令系统 §3-1 MCS-51指令系统概述 3-2 MCS-51单片机的寻址方式 §3-3 数据传送类指令 §3-4 算术运算类指令 §3-5 逻辑运算类及移位指令 §3-6 控制转移类指令 §3-7 布尔变量操作类指令

  2. §3-1 MCS-51指令系统概述 • 一、指令的概念 • 1、指令的定义 • 指令是指挥计算工作的命令。一条指令就是计算机所能执行的一种基本操作描述。指令是计算机软件的基本单元。指令有两种基本表达形式:机器码指令和汇编语言指令。 • 2、机器码指令与汇编语言指令 • 机器指令:用2进制代码(或十六进制数)表示的指令。也常被称为目标代码。这种形式的指令(也只有这种形式的指令)能够被计算机硬件识别和执行。 • 汇编语言指令:为了便于记忆以及的程序的编写和阅读,用助记符表示的指令。汇编语言指令不能被计算机硬件直接识别和执行,必须通过某种手段(汇编)把它变成机器码指令才能被机器执行。汇编语言指令由此而得多。 • 二、MCS-51单片机指令格式: • 1、 汇编语言指令格式: • [标号:] 操作码 操作数(目的操作数,源操作数)[ ;注释]

  3. 其中: • 标 号:指令的符号地址,代表该指令第1字节所在的地址。一条语句前是否要冠以标号,要根据程序的需要而定。当某条语句可能被调用或作为转移的目的地址时,通常要给该语句赋予标号,一旦某条语句被赋予了标号,则标号就可作为其它语句的操作数使用。 • 操作码:表示指令进行何种操作。用助记符形式给出。助记符一般为英语单词的缩写。 • 操作数:指令操作的对象。分为目的操作数和源操作数。任何指令的操作都是“从源操作数到目的操作数”,因此,目的操作数和源操作数的顺序不能颠倒。操作数可以是文字也可是数字(地址、数据),也可以是寄存器名等。也有的指令中为无操作数。 • 注 释:对指令功能的说明,便于程序的阅读和维护。它不参与计算机的操作,可有可无,但必须以“;”开始,写于指令的末尾。 • 2、机器码指令的格式: • 操作码 操作数(目的操作数,源操作数) • 机器码指令按指令的字节长度划分,有单字节、双字节、多字节指令。 • 单字节指令:只有一个字节的操作码,实际小操作数隐含在其中。 • 如:INC A 对应的机器码指令为 04,指令功能是将累加器中的内容增加1。 • 双字节指令:一个字节的操作码,一个字节的操作数。 • 三字节指令:一个字节的操作码,两个字节的操作数。

  4. 三、指令系统: • 微处理器(包括单片机)所有指令的集合称为该机器的指令系统。指令系统与计算机硬件逻辑电路有密切关系。它是表征计算机的重要指标。不同的微处理器的指令系统是不同的。同一系列不同型号的微处理的指令系统基本相同。 • MCS-51系列单片机使用42种助记符,有51种基本操作。通过助记符及指令中的源操作数和目的操作数的不同组合构成了MCS-51的111条指令。。 • MCS-51的指令系统按字节数分为:单字节指令49条,双字节指令46条,三字节指令16条;按指令执行的周期划分:有57条一周期指令,52条两周期指令,2条四周期指令。当主频为12MHz时,单周期指令的执行时间为1μs。 • MCS-51指令系统中有一处理位变量的指令子集。这些指令在处理位变量时非常灵活、方便,使MCS-51更适合于工业控制,这是MCS-51指令系统的一大特点。 • 四、指令系统说明: • 1、常用符号: • Ri——选定当前寄存区的寄存器R0-R7。 • @Ri:——通过寄存器R0和R1的内容间接寻址片内RAM单元。i为0或1。 • (X):——表示X地址中的内容 • ((X)): ——由X的内容作为地址的单元中的内容 • ←:——数据传输的方向 • $: ——当前指令的地址 • / : ——位操作数前缀,表示取反。

  5. Direct: ——直接地址。一个内部RAM单元的地址或一个特殊功能寄存器。 • #data16:——8位16位常数,亦称立即数,#为立即数前缀。 • Addr16:——16位目的地址。供转移或调用指令使用。 • Addr11:——11位目的地址。供转移或调用指令使用。 • rel:——8位带符号偏移量(以二进制补码表示),常用于相对转移指令。 • bit:——位地址。用于位操作指令。 • : ——数据交换 • 2、汇编语言的数据形式 • 二进制( B):0,1 • 十进制( D):0,1~9 • 十六进制( H):0,1~9,A,B,C,D,E,F • §3-2 MCS-51的寻址方式 返回 • 寻址方式:寻找操作数所在地址的方式。 • MCS-51指令系统的寻址方式有七种:立即寻址、寄存器寻址、间接寻址、直接寻址、变址寻址、相对寻址和特定寄存器寻址。 • 1、立即寻址 • 操作数以常数的形式出现,直接跟在操作码后面,以指令字节的形式存放在ROM中。

  6. 例如: MOV A, #40H • MOV DPTR, #TABLE ;TABLE为标号地址 • MOV P1, #00000111B • MOV R3, #18 • 2、寄存器寻址 • 由指令指出以某寄存器的内容为操作数。寄存器寻址方式使 用范围: • (1)内部RAM中的32个工作寄存器R0~R7; • (2)A、B、C、DPTR; • 例如: INC R3 ;(R3)←(R3)+1 • ↑操作码 ↑操作数 • 指令中的R3即为寄存器寻址。 • 对于Rn:具体寄存器由指令的低3位指定。(对应的机器码) • 对于A、B、C、DPTR:则为隐含在指令代码中。

  7. 3、间接寻址 • 指令中指出某一个寄存器的内容为操作数的地址,以符号“@”表示。其寻址范围: • (1)以R0,R1为地址指针,寻址内部RAM 00~7FH 和外RAM的低256B; • (2)以堆栈SP为地址指针,寻址栈区单元; • (3)以DPTR,或R0、R1(须用P2指定高8位地址)为地址指针,寻址外部RAM的64KB空间和扩展I/O口。 • 例: MOV A,@R0 ;(A)←((R0)) • PUSH ACC ;((SP)) ←(A) • MOVX A,@DPTR ;(A)←((DPTR)) • 4、直接寻址 • 在指令中含有操作数的直接地址,该地址指出了参与运算的数所在的字节单元地址或位地址(位寻址)。直接寻址的寻址范围: • (1)内部数据存储器的低128字节,00H~7FH; • (2)特殊功能寄存器,注意除A、B、DPTR外,其他SFR只能采用直接寻址方式。 • (3)位寻址:所有可寻址位; • 例如:MOV A, 70H ;(A)←(70H)

  8. MOV C,70H ;(CY)←(70H) • 注意: • (1)注意直接寻址与寄存器寻址的区别。当累加器写作“A”时,指寄存器寻址;当它写作“ACC”时,则为直接娃寻址。 • (2)注意字节地址和位地址的区别。在指令“MOV A,20H”中,20H是字节地址,表示将20单元的内容传送至累加器,而在指令“MOV C,20H”中,20H是位地址,它是24单元中的D0位,表示将该位的状态送至进位位。可见二者的区别是在于指令的形式不同,在位指令中出现的位地址是直接地址。 • 5、变址寻址 • 以16位寄存器(PC、 DPTR)作为基址寄存器,加上地址偏移量(累加器A中的位无符号数)形成操作数的地址。 • 变址寄存方式有两种: • (1)以程序计数器当前值为基址(PC当前值:即本条指令的首地址,下同),例如指令: • MOVC A,@A+PC;(PC) ←(PC)+1,(A) ←((A)+(PC)) • 指令执行时,先使PC指向下一条指令地址,然后再与累加器内容相加形成16位地址,访问程序存储器(表格)。 • (2)第二类变址寻址以数据指针DPTR为基址,以数据指针内容和累加器内容相加形成变址地址。如: • MOV DPTR,#2345H;(DPTR)=2345H • MOV A,#10H ;(A)=10H • MOVC A,@A+DPTR; (A)=(2355H)

  9. 变址寻址方式专用于程序存储器的访问,不能访问数据据RAM,这类指令均为单字节指令。变址寻址方式专用于程序存储器的访问,不能访问数据据RAM,这类指令均为单字节指令。 • 6、相对寻址 • 指令中给定地址的相对偏移量rel,以PC当前值为基地址,加上rel所得结果为转移目标地址。 • 偏移量 rel:符号数,单字节补码,-128~+127。 • 计算方法:(目的地址-源地址-指令字节数)的补码。 • 例如:1000H:JC ,93H ;判C转移指令,2字节,机器码为:40 93。 • 分析:当CY=1时,转移,过程如下图所示:

  10. 7、特定寄存器寻址 • 累加器T和数据指针DPTR这两个使用最频繁的寄存器又称为特定寄存器。对特定寄存器的操作指令,不再需要指出其它的地址字节,指令码本身隐含了操作对象A或DPTR。例如: • CPL A ;累加器内容取反 • SWAP A ;累加器高低半字节内容交换 • INC A ;数据指针内容加1 • 综上所述,寻址方式与存储器结构有密切关系。一种寻址方式只适合于对一部分存储器进行操作,在使用时要加以注意。 • §3-3 数据传送类指令 返回 • 最基本、最主要的指令,共有29条,包括数据传送、数据交换、栈操作三类。目的单元为A时影响P标志。 • 一、内部RAM间的数据传送(16条) • 1、指令格式 • 指令格式: MOV [目的操作数],[源操作数] • 功 能:把源操作数传送到目的操作数中,源操作数内容不变。 • 2、操作数 • 操作数:A,Rn,direct,@Ri,DPTR,#data

  11. 3、指令描述举例: • 以A为目的操作数 • MOV A,Rn ;(A)←(Rn) • 其执行过程为(设(Rn)=30H) • 以Rn为目的操作数 • MOV Rn,direct ;(Rn)←(direct) • 其执行过程为:(设,direct=50H,(50H)=30H)

  12. 以direct为目的操作数 MOV direct1,direct2 ;(direct1)←(direct2) MOV direct, @Ri ;(direct)←((Ri)) 以@Ri为目的操作数 MOV @Ri, A ;((Ri))←(A) MOV @Ri, #data ;((Ri))← data 16位数据传送指令 MOV DPTR, #data16;高8位送DPH,低8位送DPL 传送过程与前面的指令相同。 例3-1:设(70H)= 60H,(60H)=20H,P1为输入口,状态为0B7H,执行如下程序: MOV R0, #70H ;(78H 70H) MOV A, @R0 ;(E6H) MOV R1, A ;(F9H) MOV B, @R1 ;(87H F0H) MOV @R0,P1 ;(A6 90H) 结果: (70H)= 0B7H (B) = 20H (R1) = 60H (R0) = 70H

  13. 例3-2:给出下列指令的执行结果,指出源操作数的寻址方式。例3-2:给出下列指令的执行结果,指出源操作数的寻址方式。 • MOV 20H, #25H • MOV 25H, #10H • MOV P1, #0CAH • MOV R0, #20H • MOV A, @R0 • MOV R1, A • MOV B, @R1 • MOV @R1,P1 • MOV P3, R1 • 结果: • (20H)=25H,(25H)=10H, (P1)=0CAH, • (R0)=20H, (A)=25H, (R1)=25H, • (B)=10H, (25H)=0CAH,(P3)=25H • 二、ACC与外部数据存储器(或扩展I/O口)传递数据MOVX • 1、指令格式: • MOVX A, @DPTR • MOVX A, @Ri • MOVX @DPTR,A • MOVX @Ri, A • 2、功能: • A与外部RAM或扩展I/O口数据的相互传送

  14. 说明: • (1)用Ri进行间接时只能寻址256个单元(0000H~00FF),当访问超过256个字节的外RAM空间时,需利用P2口确定高8位地址(也称页地址),而用DPTR进行间址可访问整个64KB空间。 • (2)在执行上述读、写外RAM指令时,P3.7(RD)、P3.6(WR)会相应自动有效。 • (3)可用作为扩展I/O口的输入/输出指令。 • 例3-3:将外RAM 2010H中内容送 • 外RAM 2020单元中。 • 分析:读2010H中内容→A→写数据→2020H • 程序如下: • MOV P2,#20H ;输出高8位地址 • MOV R0,#10H ;置读低8位间接地址 • MOVX A,@R0 ;读2010H中数据 • MOV R1,#20H ;置写低8位间接地址 • MOVX @R1,A ;将A中数据写入2020H中,其执行过程如图所示。

  15. 三、查表指令MOVC • 表格:程序存储器除存放程序外,还可存放一些常数,这种数据的结构称为表格。 • 访问:通过两条程序存储器取数指令,即查表指令来访问,完成从ROM中读数,并只能送累加器A。 • 1、指令格式: • MOVC A,@A+DPTR ;(A)←((A)+(DPTR)) • MOVC A,@A+PC ;(PC)←(PC)+1,(A)←((A)+(PC)) • 2、功能: • 以DPTR、PC为基地址,与A中的8位无符号数相加,得到一个新16位地址,将其内容送A。特点:单字节指令,源操作数为变址寻址,执行时, PSEN会自动有效。 • (1)用DPTR作为基寄存器 • 例3-4:设外部ROM的2000H单元开始的连续10个字节中已存放有0~9的平方数,要求根据A中的内容(0~9)来查找对应的平方值。 • START: MOV A, #3 • MOV DPTR,#TABLE MOVC A, @A+DPTR ;查表

  16. ORG 2000H TABLE:DB 0,1,4,9,25 2003单元内容 DB 36,49,64,81 结果 (A)=09H 特点:可访问整个ROM的64KB空间,表格可放在ROM的任何位置,与MOVC指令无必然的关系。 • (2)用PC作为基寄存器 • 例3-5: ORG 1000H • 1000H MOV A,#30H; • 1002H MOVC A,@A+PC; • 结果是:A ←(1033H),因为在执行该指令时,PC=1003H。 • 优点:不改变PC的状态,根据A的内容取表格常数。

  17. 缺点: • (1)表格只能存放在查表指令以下的256个单元内。 • (2)当表格首地址与本指令间有其他指令时,须用调整偏移量,调整量为下一条指令的起始地址到表格首址之间的字节数。 • 例3-6:阅读下列程序,给出运行结果 ,设(A)=3。 • 1000H ADD A,#02H ;加调整量 • 1002H MOVC A,@A+PC ;查表 • 1003H NOP • 1004H NOP • 1005H TAB: DB 66,77,88H,99H,‘W’,‘10’ • 结果:(A)=99H,显然,2条NOP指令没有时,不需调整。 • 四、堆栈操作 • 堆栈,由特殊功能寄存器SP(81H)管理,始终指向其栈顶位置,栈底视需要设在内部RAM低128B内。

  18. 1、指令格式 • (1)进栈操作: PUSH direct • (2)出栈操作: POP direct • 2、功能 • (1)先执行(SP) ←(SP)+ 1,再((SP))←(direct); • 其中:direct为源操作数;目的操作数为@SP,隐含。 • (2)先执行(direct)←((SP)),再SP ←(SP)-1 • 其中:direct为目的操作数,源操作数为@SP,隐含。 • 例3-7:已知:(A)=30H,(B)=70H 执行: • MOV SP, #60H ;设栈底 • PUSH ACC ; • PUSH B • 结果:(61H)=30H,(62H)=70H,(SP)=62H,执行过程如图所示:

  19. 例3-8:已知:(SP)=62H,(62H)=70H,(61H)=30H执行: POP DPH • POP DPL • 结果:(DPTR)=7030H,(SP)=60H • 其执行过程如图所示:

  20. 五、与A的数据交换指令 • 数据交换指令共5条,完成累加器和内部RAM单元之间的字节或半字节交换。 • (1)整字节交换: • XCH A,Rn ;(A)←→(Rn) • XCH A,direct ;(A)←→(direct) • XCH A,@Ri ;(A)←→((Ri)) • (2)半字节交换: • XCHD A,@Ri ;(A)0~3←→((Ri))0~3 • (3)累加器自身高低4位交换 • SWAP A ;(A)7~4←→(A)3~0 • 其工作过程如下:

  21. 例3-9 设(A)=57H,(20H)=68H,(R0)=30H,(30H)=39H, • 求下列指令的执行结果 • (1)XCH A,20H ; • 结果:(A)=68H,(20H)=57H • (2)XCH A,@R0 ; • 结果: (A)=39H,(30H)=57H • (3)XCH A,R0 • 结果: (A)=30H,(R0)=57H • (4)XCHD A,@R0 ; • 结果: (A)=59H,(30H)=37H) • (5)SWAP A ; • 结果: (A)=75H

  22. 例3-10:设内部RAM 40H、41H单元中连续存放有4个压缩的 BCD码数据,试编程序将这4 个BCD码倒序排列。 • 分析:过程如下图所示. • 程序如下: • MOV A, 41H • SWAP A • XCH A, 40H • SWAP A • MOV 41H,A

  23. §3-4 算术运算类指令返回 • MCS-51单片机算术运算类指令包括+、-、×、÷、加1、减1、十进制调整指令,共有24条,一般影响PSW中的CY、AC、OV、P标志位。 • 一、加减法指令 • 1、指令助记符: • ADD • ADDC • SUBB • 2、操作数: • 以A为目的操作数,如右图

  24. 3、指令描述举例: • 不带进位加法 ADD 4条 • ADD A, Rn ;(A) ←(A)+(Rn) • 带进位加法指令 ADDC 4条 • ADDC A,direct ;(A) ←(A)+(direct)+(CY) • 带进位减法指令 SUBB 4条 • SUBB A,@Ri ;(A)←(A)-((Ri))-(CY) • SUBB A,#data ;(A)←(A)- #data -(CY) • 例3-11:设(A)=D3H,(30H)=E8H • 执行: ADD A,30H • 1101 0011 (D3) • +) 1110 1000 (E8) • 1 1011 1011 • 结果:CY=1,AC=0,P=0,OV=0,(A)=BBH (补码真值-69,正确)。

  25. 例3-12:设(A)=88H,(30H)=99H,CY=1 • 执行: ADDC A, 30H • 1000 1000 (88H) • 1001 1001 (99H) • +) 1 • 10010 0010 • 结果:CY=1,AC=1,P=0,OV=1,(A)=22H • 例3-13:设(A)=49H,CY=1, • 执行: SUBB A, #54H • 0100 1001 (49H) • 0101 0100 (54H) • -) 1 • 1111 0100 (借位1) • 结果:CY=1,AC=0,P=0,OV=0,(A)=F4H

  26. 例3-14:试编制4位十六进制数加法程序,假定和数超过双字节例3-14:试编制4位十六进制数加法程序,假定和数超过双字节 • (21H20H)+(31H30H)→ 42H41H40H • 分析:先低字节作不带进位求和,再作带进位高字节求和。 • 流程图(略),程序如下: • MAIN: MOV A, 20H • ADD A, 30H • MOV 40H, A • MOV A, 21H • ADDC A, 31H ;带低字节进位加法 • MOV 41H, A • MOV A, #00H ;准备处理最高位 • MOV ACC.0,C • MOV 42H, A • SJMP $

  27. 二、加1减1指令 • 1、助记符: • INC • DEC • 2、操作数: • A,direct,@Ri,Rn,DPTR • 3、指令描述: • (不影响PSW,即使有进位或借位,CY也不变,除A影响P标志) • (1)INC:加15条 • INC A ;(A) ←(A)+1 • INC Rn ;(Rn) ←(Rn)+1 • INC @Ri ;((Ri)) ←((Ri))+1 • INC direct ;(direct) ←(direct)+1 • INC DPTR ;(DPTR) ←(DPTR)+1 • (2)DEC:减14条 • DEC A ;(A) ←(A)—1 • DEC Rn ;(Rn) ←(Rn)—1 • DEC @Ri ;((Ri)) ←((Ri))—1 • DEC direct ;(direct) ←(direct)

  28. 例3-15:编制下列减法程序,要求: • (31H30H)—(41H40H)→ 31H30H • 分析:流程图(略),程序如下: • MAIN:CLR C ` ;CY清零 • MOV R0, #30H • MOV R1, #40H • MOV A, @R0 • SUBB A, @R1 • MOV @R0,A ;存低字节 • INC R0 ;指向31H • INC R1 ;指向41H • MOV A, @R0 • SUBB A, @R1 • MOV @R0, A ;存高字节 • ` HERE:SJMP HERE ;结束

  29. 三、十进制调整指令 • 1、格式: • DA A • 2、功能: • 指令用于两个BCD码加法运算的加6修正,只影响CY位。 • 3、指令的使用条件: • (1)只能紧跟在加法指令(ADD/ADDC)后进行 • (2)两个加数必须已经是BCD码 • (3)只能对累加器A中结果进行调整 • 加6修正的依据:由CPU判CY、AC是否=1?A中的高、低4位是否大于9? • 例如:(A)=56H,(R5)=67H,(BCD码)执行: • ADD A,R5 • DA A • 结果:(A)=23H,(CY)=1 • 例3-16:试编制十进制数加法程序(单字节BCD加法),假定和数为单字节,要求: • (20H)+(21H)→ 22H • 程序如下: • MOV R0, #20H • MOV A, @R0 • INC R0

  30. ADD A, @R0 • DA A • INC R0 • MOV @R0,A • 分析:流程如图

  31. 例3-17:十进制减法程序(单字节BCD数减 • 法)要求:(20H)—(21H) → 22H • 分析:主要要考虑到,DA A只能对加法调整, • 故必须先化BCD减法为加法做,关键为求两 • 位十进制减数的补码 (9AH-减数)流程如右 • 图,程序如下: • CLR C • MOV R0, #20H • MOV R1, #21H • MOV A, #9AH • SUBB A, @R1 ;求补 • ADD A, @R0 ;求差 • DA A • INC R1 • MOV @R1, A ;存结果

  32. 四、乘除法指令 • 唯一两条单字节4机器周期的指令。 • 1、8位无符号数乘法指令 • MULAB ;(B 15~8 )( A7~0)←(A)(B) • PSW: 1)若乘积大于256,OV=1;否则OV=0; • 2)CY总是清“0”。 • 例如:(A)=50H,(B)=A0H,执行MUL AB后 • 结果:(B)=32H,(A)=00H,(OV)=1 • 2、8位无符号除法指令 • DIV AB ; (A)←(A/B)的(商) • (B)←(A/B)的(余数) • PSW: 1)CY、OV,清“0” • 2)若(B)=0,OV=1。 • 例如:(A)=2AH,(B)=05H,执行DIV AB后 • 结果:(A)=08H,(B)=02H,(OV)=0 • 例3-18:双字节乘法程序,要求: • (R0R1)×(R2)→R3R4R5 • 分析:设(R0)=J,(R1)=K,(R2)=L,则

  33. MOV A, R1 MOV B, R2 • MUL AB • MOV R5, A MOV R4, B MOV A, R0 • MOV B, R2 • MUL AB • ADD A, R4 • MOV R4, A • MOV A, B • ADDC A, #00H • MOV R3, A • 例3-19:编制将A中的数转换成三位BCD码程序,百位放在20H,十位、个位放在21H中。 • 分析:(A)/100→商(百位) →(20H); • 余数/10 →商(十位)→(21H)7~4; • 余数 (个位)→(21H)3~0;

  34. 流程如右图,程序如下: • MOV B, #100 • DIV AB • MOV 20H, A • MOV A, B • MOV B, #10 • DIV AB • SWAP A • ADD A, B • MOV 21H, A • SJMP $

  35. §3-5 逻辑运算及移位指令逻辑运算类指令共24条,涉及A时,影响P标志。 • 一、基本与、或、异或运算指令 • (1)指令助记符:ANL、ORL、XRL • (2)操作数:如下图

  36. 3、指令描述举例: • 逻辑“与”指令 6条 • ANL A, Rn ;(A)←(A)∧(Rn) • ANL A, direct ;(A)←(A)∧(direct) • 逻辑“或”指令 6条 • ORL A, @Ri ;(A)←(A)∨((Ri)) • ORL A, #data ;(A)←(A)∨ data • 逻辑“异或”指令 6条 • XRL direct,A ;(direct)←(direct)⊕(A) • XRL direct,#data ;(direct)←(direct)⊕ data • 当用于修改输出口(P0~P3)时,direct指口锁存器的内容而不是端口引脚电平。 • 二、 对A简单逻辑指令 • 1、清零与取反 • CLR A ;清0 • CPL A ;求反 • 2、循环移位指令 • RL A ; • RLC A ; • RR A ;

  37. RRC A ; • 例3-20:按要求编程,完成下列各题: • 1)选通工作寄存器组中0区为工作区。 • 2)利用移位指令实现累加器A的内容乘6。 • 3)将ACC的低4位送P1口的低4位,P1口的高4位不变。 • 解: • 1) ANL PSW,#11100111B ;PSW的D4、D3位为00 • 2) CLR C • RLC A ;左移一位,相当于乘2 • MOV R0, A • CLR C • RLC A ;再乘2,即乘4 • ADD A,R0 ;乘2 + 乘4 = 乘6 • 3) ANL A,#0FH;高4位屏蔽(清0) • ANL P1,#F0H;P1低4位清0 • ORL P1,A ;(P1.3~1.0)←(A3~0)

  38. 例3-21:设在外RAM 2000H中放有两个BCD数,编程,使这 • 两个BCD码分别存到2000H和2001H的低4位中。 • 分析:流程如图 • 程序如下: • MOV DPTR,#2000H • MOVX A, @DPTR • MOV R0, A • ANL A, #0FH • MOVX @DPTR,A • MOV A, R0 • ANL A, #0F0H • SWAP A • INC DPTR • MOVX @DPTR,A

  39. §3-6 控制转移指令 • 转移类指令都是用来改变程序计数器PC的值,使PC有条件、或者无条件、或者通过其它方式,从当前位置转移到一个指定的地址单元去,从而改变程序的执行方向。 • 转移指令分为四大类:无条件转移、条件转移、调用指令及返回指令。 • 一、无条件转移指令

  40. 指令执行时,注意其工作过程。 • 例如:有一指令本身位于1000H开始的单元中,要求跳转到2345H取指令执行程序 • LJMP 2345H 机器指令为:12 34 56 • 其执行过程为:

  41. 无条件转移应用举例: • 1)1030H:AJMP 100H ;机器码为2100H • 目的地址:PC=1032H的高5位+100H的低11位 • =00010+00100000000 = 1100H • 2)0000H:AJMP 40H ;程序转移到0040H • 3)1100H:SJMP 21H ;目标地址为1123H • 4)1000H:SJMP NEXT ;目的地址NEXT=1020H • 则:相对地址rel =1EH(补码数) • 5)0060H:SJMP FEH ;原地踏步指令 • 目的地址:PC =(PC)+ 2 + FEH • =0060H +2 +FFFEH = 0060H • 6)0000H:LJMP 0030H ; • 例3-22:执行下面的散转程序,程序将根据A中的内容(命令编号0~9)转相应的命令处理程序。 • ORG 1000H • START: MOV R1, A • RL A ;乘2 • ADD A, R1 ;完成偏移量A =(A)×3 • MOV DPTR,#TABLE ;设定表格首地址

  42. JMP @A+DPRT • TABLE: LJMP COMD0 • ┇ • LJMP COMD9 • COMD0: • ┇ • COMD9: • END • 由于LJMP占3个字节,因此,变址寄存器必须乘3 。 • 二、条件转移指令 • 根据某种条件判断转移的指令,执行时: • 条件满足时,转移执行; • 条件不满足时,顺序执行; • 目的地址:(PC)=(PC)+ 指令字节数(2或3)+ rel • 包括判A、判Bit、判C三种,共有7条: • 1、判A转移,2字节 • JZ rel ;条件:(A)= 0 • JNZ rel ;条件:(A)≠0

  43. 2、判Bit转移,3字节 • JB bit, rel ;条件:(bit)= 1 • JNB bit, rel ;条件:(bit)= 0 • JBC bit, rel ;条件:(bit)= 1转移,并清 bit位 • 例如:设P1为输出口,执行下列程序,指出功能: • (1) MOV C, 00H • ORL C, 01H • MOV P1.7, C • (2) MOV P1, #00H • LOOP: SETB P1.0 • LCALL DELAY • CLR P1.0 • LCALL DELAY • AJMP LOOP • (3)LOOP:SETB C • RLC A • MOV P1, A • LCALL DELAY • JNB ACC.7, LOOP

  44. 3、判C转移,2字节 • JC rel ;条件:(C)= 1 • JNC rel ;条件:(C)= 0 • 例3-23利用P1.0、P1.1作为外接发光二极管的启停按钮,P1.2作为外接发光二极管端,试编制控制程序。

  45. 程序如下: • START:MOV P1, #03H ;作P1口输入时先置1 • WT1: JB P1.0,WT1 • SETB P1.2 • WT2: JB P1.1,WT2 • CLR P1.2 • SJMP WT1 • 三、比较不相等转移指令 • CJNE A, direct, rel; • CJNE A, #data, rel; • CJNE Rn, #data, rel; • CJNE @Ri, #data, rel; • 执行时: • 1)两操作数相等,顺序执行,且CY=0。 • 2)两操作数不相等,转移执行,且对于无符号数若: • 第一操作数<第二操作数,CY=1,否则CY清“0”。 • 目的地址:(PC)=(PC)+ 指令字节数3 + rel • 例如:下图所示的比较判断,可利用CJNE和JC指令来完成。

  46. 例3-24:内部RAM 30H开头的20个 • 连续单元中,存放有20个数,统计 • 等于8的单元个数,结果放在R2中。 • 分析:取一个数与8比较,相等R2 • 加1,不相等跳过。并作20次重复 • 即可。 • 流程如右图,程序如下: • ORG 1000H • START: MOV R0, #30H • MOV R7, #20 • MOV R2, #0 • LOOP:CJNE @R0,#08H,NEXT • INC R2 • NEXT:INC R0 • DJNZ R7,LOOP • SJMP $

  47. 四、减“1”不为0转移指令 • 又称循环转移指令,主要用来构成循环结构,有2条: • DJNZ Rn, rel ;2字节指令,2周期指令 • DJNZ direct,rel ;3字节指令,2周期指令 • 目的地址:(PC)=(PC)+ 指令字节数2或3 + rel • 例3-25:利用DJNZ指令设计循环延时程序,已知fosc=12MHz • 1)  单循环延时 • DELAY: MOV R7, #10 • DJNZ R7, $ • △t=2us×10+1=21us •   2)  双重循环延时 • DELAY: MOV R7, #0AH • DL: MOV R6, #64H • DJNZ R6, $ • DJNZ R7, DL • △t=(2us×100+2+1)×10+1=2031us • 3)  三重循环延时 • DELAY: MOV R7, #10 • DL2: MOV R6, #200 • DL1: MOV R5, #250

  48. DJNZ R5, $ • DJNZ R6, DL1 • DJNZ R7, DL2 • △t=((2us×250+2+1)×200)+2+1)×10+1 • = 1006031us ≈ 1 秒 • 程序流程图如右图所示。 • 例3-26 P1口控制发光二极管,延时节日灯组合。 • LOOP:MOV P1,#0AAH ;灯光1 • ACALL DELAY • MOV P1,#055H ;灯光2 • ACALL DELAY • SJMP LOOP • DELAY:MOV R7, #0FFH • DL1:MOV R6, #0FFH • DL2:NOP ;空操作 • DJNZ R6, DL2 • DJNZ R7, DL1 • RET

  49. 五、调用指令与返回指令 1 、主程序和子程序结构 • 2、 调用和返回 • 子程序是独立于主程序的具有特定功能的程序段,单独编写,能被主程序调用,又能返回主程序。按两者的关系有两种调用情况,多次调用和子程序嵌套,如图所示。 • 3、堆栈和PC值的保留 • 调用子程序时,CPU自动将当前PC值保留在堆栈中,其中高位放在PCH,子程序返回时,自动弹出,送入PC。 • 4、现场保护和恢复现场 • 现场保护: 是指将需要保护的单元内容,在子程序的开始使用压栈指令存放在堆栈中的过程。 • 恢复现场: 是指在子程序返回前,通过出栈指令,将被保护内容送回原来的寄存器。 • 5、调用与返回指令 • (1)短调用指令: ACALL addr11 • 执行时 :1)(PC)+ 2 → PC,并压入堆栈,先PCL,后PCH;

  50. 2)PC15~11 a10~0 → PC,获得子程序入口地址; • 3)转移范围同AJMP。 • (2)长调用指令 • LCALL addr16 • 执行时: • 1)(PC)+ 3 → PC,并压入堆栈,先PCL,后PCH; • 2)addr16 → PC,获得子程序起始地址; • 3)可调用64K地址范围内的任意子程序。 • 例如:已知(SP)=60H,执行下列指令后的结果: • ①1000H:ACALL 100H • ②1000H:LCALL 0800H • 结果: • ①: (SP)=62H,(61H)=02H,(62H)=10H, • (PC)=1100H • ② : (SP)=62H,(61H)=03H,(62H)=10H, • (PC)=0800H • (3)子程序返回指令RET 、中断返回指令RETI • RET:从堆栈中退出PC的高位和低位字节,栈指针减2,即: • 1)(PCH)←((SP)), (SP)←(SP)- 1; • 2)(PCL) ←((SP)), (SP)←(SP)- 1; • RETI:从堆栈中退出PC的高位和低位字节,栈指针减2,同 • 时清除中断优先,开放低级中断。

More Related