560 likes | 755 Views
第三章 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 、机器码指令与汇编语言指令
E N D
第三章 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、机器码指令与汇编语言指令 • 机器指令:用2进制代码(或十六进制数)表示的指令。也常被称为目标代码。这种形式的指令(也只有这种形式的指令)能够被计算机硬件识别和执行。 • 汇编语言指令:为了便于记忆以及的程序的编写和阅读,用助记符表示的指令。汇编语言指令不能被计算机硬件直接识别和执行,必须通过某种手段(汇编)把它变成机器码指令才能被机器执行。汇编语言指令由此而得多。 • 二、MCS-51单片机指令格式: • 1、 汇编语言指令格式: • [标号:] 操作码 操作数(目的操作数,源操作数)[ ;注释]
其中: • 标 号:指令的符号地址,代表该指令第1字节所在的地址。一条语句前是否要冠以标号,要根据程序的需要而定。当某条语句可能被调用或作为转移的目的地址时,通常要给该语句赋予标号,一旦某条语句被赋予了标号,则标号就可作为其它语句的操作数使用。 • 操作码:表示指令进行何种操作。用助记符形式给出。助记符一般为英语单词的缩写。 • 操作数:指令操作的对象。分为目的操作数和源操作数。任何指令的操作都是“从源操作数到目的操作数”,因此,目的操作数和源操作数的顺序不能颠倒。操作数可以是文字也可是数字(地址、数据),也可以是寄存器名等。也有的指令中为无操作数。 • 注 释:对指令功能的说明,便于程序的阅读和维护。它不参与计算机的操作,可有可无,但必须以“;”开始,写于指令的末尾。 • 2、机器码指令的格式: • 操作码 操作数(目的操作数,源操作数) • 机器码指令按指令的字节长度划分,有单字节、双字节、多字节指令。 • 单字节指令:只有一个字节的操作码,实际小操作数隐含在其中。 • 如:INC A 对应的机器码指令为 04,指令功能是将累加器中的内容增加1。 • 双字节指令:一个字节的操作码,一个字节的操作数。 • 三字节指令:一个字节的操作码,两个字节的操作数。
三、指令系统: • 微处理器(包括单片机)所有指令的集合称为该机器的指令系统。指令系统与计算机硬件逻辑电路有密切关系。它是表征计算机的重要指标。不同的微处理器的指令系统是不同的。同一系列不同型号的微处理的指令系统基本相同。 • 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的内容作为地址的单元中的内容 • ←:——数据传输的方向 • $: ——当前指令的地址 • / : ——位操作数前缀,表示取反。
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中。
例如: 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:则为隐含在指令代码中。
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)
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)
变址寻址方式专用于程序存储器的访问,不能访问数据据RAM,这类指令均为单字节指令。变址寻址方式专用于程序存储器的访问,不能访问数据据RAM,这类指令均为单字节指令。 • 6、相对寻址 • 指令中给定地址的相对偏移量rel,以PC当前值为基地址,加上rel所得结果为转移目标地址。 • 偏移量 rel:符号数,单字节补码,-128~+127。 • 计算方法:(目的地址-源地址-指令字节数)的补码。 • 例如:1000H:JC ,93H ;判C转移指令,2字节,机器码为:40 93。 • 分析:当CY=1时,转移,过程如下图所示:
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
3、指令描述举例: • 以A为目的操作数 • MOV A,Rn ;(A)←(Rn) • 其执行过程为(设(Rn)=30H) • 以Rn为目的操作数 • MOV Rn,direct ;(Rn)←(direct) • 其执行过程为:(设,direct=50H,(50H)=30H)
以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
例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口数据的相互传送
说明: • (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中,其执行过程如图所示。
三、查表指令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 ;查表
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的内容取表格常数。
缺点: • (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内。
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,执行过程如图所示:
例3-8:已知:(SP)=62H,(62H)=70H,(61H)=30H执行: POP DPH • POP DPL • 结果:(DPTR)=7030H,(SP)=60H • 其执行过程如图所示:
五、与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 • 其工作过程如下:
例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
例3-10:设内部RAM 40H、41H单元中连续存放有4个压缩的 BCD码数据,试编程序将这4 个BCD码倒序排列。 • 分析:过程如下图所示. • 程序如下: • MOV A, 41H • SWAP A • XCH A, 40H • SWAP A • MOV 41H,A
§3-4 算术运算类指令返回 • MCS-51单片机算术运算类指令包括+、-、×、÷、加1、减1、十进制调整指令,共有24条,一般影响PSW中的CY、AC、OV、P标志位。 • 一、加减法指令 • 1、指令助记符: • ADD • ADDC • SUBB • 2、操作数: • 以A为目的操作数,如右图
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,正确)。
例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
例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 $
二、加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)
例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 ;结束
三、十进制调整指令 • 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
ADD A, @R0 • DA A • INC R0 • MOV @R0,A • 分析:流程如图
例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 ;存结果
四、乘除法指令 • 唯一两条单字节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,则
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;
流程如右图,程序如下: • 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 $
§3-5 逻辑运算及移位指令逻辑运算类指令共24条,涉及A时,影响P标志。 • 一、基本与、或、异或运算指令 • (1)指令助记符:ANL、ORL、XRL • (2)操作数:如下图
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 ;
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)
例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
§3-6 控制转移指令 • 转移类指令都是用来改变程序计数器PC的值,使PC有条件、或者无条件、或者通过其它方式,从当前位置转移到一个指定的地址单元去,从而改变程序的执行方向。 • 转移指令分为四大类:无条件转移、条件转移、调用指令及返回指令。 • 一、无条件转移指令
指令执行时,注意其工作过程。 • 例如:有一指令本身位于1000H开始的单元中,要求跳转到2345H取指令执行程序 • LJMP 2345H 机器指令为:12 34 56 • 其执行过程为:
无条件转移应用举例: • 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 ;设定表格首地址
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
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
3、判C转移,2字节 • JC rel ;条件:(C)= 1 • JNC rel ;条件:(C)= 0 • 例3-23利用P1.0、P1.1作为外接发光二极管的启停按钮,P1.2作为外接发光二极管端,试编制控制程序。
程序如下: • 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指令来完成。
例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 $
四、减“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
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
五、调用指令与返回指令 1 、主程序和子程序结构 • 2、 调用和返回 • 子程序是独立于主程序的具有特定功能的程序段,单独编写,能被主程序调用,又能返回主程序。按两者的关系有两种调用情况,多次调用和子程序嵌套,如图所示。 • 3、堆栈和PC值的保留 • 调用子程序时,CPU自动将当前PC值保留在堆栈中,其中高位放在PCH,子程序返回时,自动弹出,送入PC。 • 4、现场保护和恢复现场 • 现场保护: 是指将需要保护的单元内容,在子程序的开始使用压栈指令存放在堆栈中的过程。 • 恢复现场: 是指在子程序返回前,通过出栈指令,将被保护内容送回原来的寄存器。 • 5、调用与返回指令 • (1)短调用指令: ACALL addr11 • 执行时 :1)(PC)+ 2 → PC,并压入堆栈,先PCL,后PCH;
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,同 • 时清除中断优先,开放低级中断。