《内核单片机汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《内核单片机汇编语言程序设计.ppt(141页珍藏版)》请在三一办公上搜索。
1、1,2,第4章 51内核单片机汇编语言程序设计,4.1、汇编指令格式4.2、寻址方式4.3、指令系统4.4、汇编程序常用伪指令4.5、汇编语言程序设计,3,一、基本概念,指令使单片机完成基本操作的命令。程序完成某项特定任务的指令的集合。,高级语言:,汇编语言:,机器语言:,程序设计语言:,用二进制代码表示指令和数据。,用助记符表示指令操作功能,用标号表示操作对象。,独立于机器,面向过程,接近自然语言和数学表达式。,第四章 51内核单片机汇编语言程序设计,4,汇编程序功能,源程序(汇编指令程序),目标程序(机器语言程序),汇编指令与机器码指令有一一对应的关系。汇编程序是一种翻译程序,将源程序翻译
2、成目标程序。,(翻译),手工汇编 机器汇编(常用),汇编的两种方式,5,关于机器汇编的说明,两次扫描过程。第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。第二次扫描:在第一次扫描基础上,将符号地址转换成地 址(代真);利用操作码表将助记符转换成相应的目标码。,6,源程序,目标程序,地址,ORG 1000HSTART:MOV R0,2FH MOV R2,#00H MOV A,R0 MOV R3,A INC R3 SJMP NEXT LOOP:INC R0 CJNE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP
3、MOV 2AH,R2 SJMP$END,第一次汇编,第二次汇编,1000 A82F1002 7A001004 E61005 FB1006 0B1007 80NEXT1009 08100A B644NEXT100D 0A100E DBLOOP1010 8A2A1012 80FE,A82F7A00E6FB0B800508B644010ADBF98A2A80FE,7,时间属性:指一条指令执行完毕所需要的时间空间属性:指一条指令存储于程序存储器中所占的字节数功能属性:指一条指令所对应的一个特定的操作功能,指令的三种属性,STC系列单片机采用了80C51内核,其指令集与MCS51系列单片机完全相同,本章
4、介绍的指令系统可适用于所有51内核的单片机。,8,指令的构成 指令=操作码+操作数 操作码表示该指令所能执行的操作功能。操作数表示参加操作的数的本身或操作数所在的地址。汇编语言指令基本格式,标号:,操作码助记符,目的操作数,,源操作数,;注释,4.1 汇编指令格式,9,描述符号:Rn 工作寄存器R0 R7 Ri 间接寻址寄存器R0、R1 Direct 直接地址,包括内部128B RAM单元地址、所有SFR地址。#data 8位立即数#data 16 16位立即数 addr 16 16位目的地址 addr 11 11位目的地址 rel 用补码表示的 8位相对偏移量 bit 可直接位寻址的位,10
5、,/bit 指定位求反,再参与逻辑操作,但取反后不影 响该位的原值(x)x中的内容(x)x中的地址中的内容 表示操作流程,将箭尾一方内容送入箭头所指 一方的单元中去 当前指令地址,11,4.2 寻址方式,寻址方式寻找操作数或寻找操作数所在存储 单元地址的方式共七种寻址方式:,寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,必须掌握,12,操作数以常数的形式直接出现在指令中,用“#”作前缀;该常数与操作码一起存放在ROM中,可以立即得到并执行。例如:MOV A,#52H,74H,A,立即数,操作码,程序存储器,PC+1,PC,52H,4.2.1 立即(数)寻址,52
6、H,13,例如:MOV DPTR,#5678H DPTR由两个特殊功能寄存器DPH和DPL组成,90H,PC,PC+1,PC+2,操作码,低位立即数,高位立即数,程序存储器,SFR,DPL,DPH,注意:1.只有源操作数能使用立即寻址方式。2.立即数长度必须小于或等于目的操作数的长度。,14,操作数存放在R0 R7、A或DPTR中;B寄存器在乘、除法指令中是寄存器寻址,在数据传送指令 中是直接寻址。其他SFR的寻址方式不属于寄存器寻址。例如:MOV A,R5,4.2.2 寄存器寻址,101,PC,操作码,程序存储器,内部RAM,R5,A,XX,XX,R6,R7,11101,15,指令中直接给出
7、操作数的地址,数据存放在该地址对应的存 储单元中。直接寻址方式可以访问的范围:,4.2.3 直接寻址,片内RAM低128B单元(00H7FH)SFR(既可用单元地址形式给出,也可用寄存器符号的形式给出),注意:直接寻址方式是访问特殊功能寄存器的唯一方法。,16,MOV P0,A(P0代表符号地址,是直接寻址方式),例如:MOV A,63H,4.2.3 直接寻址,74H,63H,PC,PC+1,操作码,直接地址,程序存储器,内部RAM,63H,A,XX,MOV 80H,A,XX,17,可用作地址指针的工作寄存器是R0、R1,以及DPTR例如:MOV A,R1;A(R1),PC,操作码,程序存储器
8、,内部RAM,A,1110011,4.2.4 寄存器间接寻址,指令中寄存器的内容作为操作数存放的地址 间接寻址寄存器前用“”表示前缀,1,R1,30H,30H,58H,58H,18,使用该方式访问数据存储器时注意:访问片内RAM只能用R0和R1作指针;若片内扩展RAM或片外RAM仅有256B单元时,既可以用R0或R1作指针间接访问,也可用DPTR作指针间接访问;大于256B时只能以DPTR作指针间接访问。,19,操作数地址=变地址+基地址 基地址寄存器:DPTR 或 PC;变址寄存器:A 该寻址方式常用于访问程序存储器,查表。例如:MOVC A,A+DPTR,PC,操作码,程序存储器,SFR,
9、32H,A5H,4.2.5 变址寻址,10010011,32A5H,32A5H,A,23H,+23H=32C8H,32C8H,2FH,2FH,设DPTR=32A5H,A=23H,20,用于相对转移指令中 以当前PC值作为基地址,与指令中给定的相对偏移量rel相加,以所得之和作为目的位置的地址 当前PC值 源地址转移指令所占的字节数(实际上是转移指令的下一条指令的地址)rel:以补码表示的有符号单字节数(-128127),负数表示从当前地址向下转移,正数表示从当前地址向上转移。,4.2.6 相对寻址,21,PC,操作码,程序存储器,PC,2050H,PC+1,2051H,PC+2,偏移量,rel
10、=08H,例如:JZ 08H;rel为正数,从当前地址向上转移 当A=0时,PCPC+2+rel/转移 当A0时,PCPC+2/程序顺序执行,2052H,205AH,2052H,08H,+08H=,205AH,XX,2052H,60H,22,PC,操作码,程序存储器,PC,2050H,PC+1,2051H,PC+2,偏移量,rel=F4H,例如:JZ F4H;rel为负数,从当前地址向下转移 当A=0时,PCPC+2+rel/转移 当A0时,PCPC+2/程序顺序执行,2052H,2046H,2052H,F4H,+FFF4H=,2046H,XX,2052H,60H,23,操作数是二进制位 在指
11、令中直接给出位地址,利用位处理器对某一位进行数据 传送、逻辑运算等操作 例如:MOV C,07H;C(07H),PC,操作码,程序存储器,C,20H,00,PC+1,PSW,SFR,X,4.2.7 位寻址,07H,07,X,A2H,24,两种位寻址区:(1)内部RAM中的位寻址区:字节地址为20H2FH;(2)SFR的可寻址位。位地址的几种表示方法:1)直接使用位地址;如:PSW的位6可表示为0D6H 2)字节地址带位号;或0D0H.6 3)SFR名带位号;或PSW.6 4)位符号地址表示;或AC,25,数据传送指令共29条,包括:普通传送指令、数据交换指令和堆栈操作指令,程序存储器ROM,特
12、殊功能寄存器 SFR,片内RAM128字节,扩展数据存储器RAM,MOVC,MOVX,MOV PUSHPOPXCHXCHD,4.3 指令系统,4.3.1 数据传送指令,注意:该类指令只有以A为目的操作数的指令影响PSW中的P标志位,其它数据传送指令对各标志位无影响。,26,回忆操作数描述符:direct,Rn,Ri,#data,DPTR等。1)以A为目的操作数的传送指令MOV A,#dataMOV A,directMOV A,RnMOV A,Ri,MOV Rn,#dataMOV Rn,directMOV Rn,A,1、普通传送指令片内RAM传送指令MOV,;A(Rn),;Adata,;A(di
13、rect),;A(Ri),2)以Rn为目的操作数的传送指令,;Rn A,;Rndata,;Rn(direct),27,MOV direct,RnMOV direct,Ri4)以Ri为目的操作数的传送指令MOV Ri,#data;(Ri)dataMOV Ri,direct;(Ri)(direct)MOV Ri,A;(Ri)()MOV DPTR,#data16;唯一的16位数据传送指令。,(direct)(A),MOV direct,A;,3)以direct为目的操作数的传送指令,MOV direct,#data,(direct)data,MOV direct,direct,(direct)(di
14、rect),(direct)(Rn),(direct)(Ri),5)以DPTR为目的操作数的传送指令,28,MOV Rn,Rn MOV Ri,Ri MOV Rn,Ri MOV#data,A,注意:1)在数据传送指令中目的操作数和源操作数中不能 同时出现工作寄存器。2)SFR只能用直接寻址方式访问。3)片内RAM高128B(80H-FFH)只能用寄存器间 接寻址方式访问。,【例4-1】写出将R0的内容送到R5中的程序段。MOV A,R0MOV R5,A,29,扩展数据存储器传送指令 对片内扩展RAM或片外扩展RAM及外部接口电路进行数 据传送的相关指令:MOVX A,Ri MOVX A,DPTR
15、 MOVX Ri,A MOVX DPTR,A 执行过程中会使/WR、/RD有效。,;A(Ri),;A(DPTR),;(Ri)A,;(DPTR)A,(读)(读)(写)(写),注意:1)通过DPTR间接寻址,可以对整个64KB片外RAM访问。2)通过Ri间接寻址,只能对扩展RAM的低256字节访问,如果地址范围大于256B时,应谨防地址冲突。,30,【例4-2】试编写一程序段,实现将片外RAM 地址为01E0H开始的16个单元中的内容传送到片内扩展RAM 地址为04FFH开始的单元中。,参考程序为:MOVR2,#10HMOV P2,#01HMOV R0,#0E0HMOV DPTR,#04FFH L
16、OOP:ORL AUXR,#00000010BMOVX A,R0ANL AUXR,#11111101BMOVX DPTR,A INCR0INCDPTRDJNZ R2,LOOP,EXTRAM=1时,访问片外扩展RAM,31,程序存储器传送指令MOVC(查表指令)MOVC A,A+DPTR MOVC A,A+PC MOVC 含义是传送常数。,(A)+(DPTR)或PC当前值=一个16位的地址,将该ROM地址中的内容传送给 A。,以DPTR为基地址的指令,可在ROM的64KB范围内查 表;(常用)以PC为基地址的指令只能在(PC)+1为基点的256B范 围内查表;(不推荐)使用第一条指令前,需事先将
17、表首地址存入DPTR中,相对于表首偏移量存入A寄存器中。,32,例如:(A)=30H,当前地址1000H,MOVC A,A+PC;A(?H),例如:ORG8000H,MOV A,#30H,MOVC A,A+PC;A(?H),ORG8030H,DB 41H,42H,43H,44H,45H,例如:(DPTR)=8100H,(A)=40H,MOVCA,A+DPTR;A(?H),8033,1031,阅读以下三个程序段,并回答?的内容。,8140,33,【例4-3】将ROM 02FFH单元的内容送片内RAM的50H单元中。参考程序如下:MOV A,#0MOV DPTR,#02FFHMOVC A,A+DP
18、TRMOV 50H,A,34,【例4-4】设data是一个BCD码常数,试用查表法获得其相应的ASCII码。将09的ASCII码组成一个表依次存放于程序存储器中以TAB为首地址的各单元中。参考程序如下:MOV A,#data MOV DPTR,#TAB MOVC A,A+DPTR TAB:DB 30H,31H,32H DB 33H,34H,35H,36H,37H,38H,39H,35,2、数据交换指令,普通传送指令数据传送是单向的,传送后只有目的操作数变化。数据交换指令是双向传送,交换后两个操作数都变。,整字节交换指令 XCH A,Rn(A)(Rn)XCH A,direct(A)(direct
19、)XCH A,Ri(A)(Ri),半字节交换指令 XCHD A,Ri(A3-0)(Ri)3-0),A寄存器高低半字节交换指令 SWAP A(A3-0)(A7-4),36,【例4-5】已知(R0)30H,(A)65H,(30H)8FH,分析执行如下指令后A与30H单元中数据的变化。,XCH A,R0XCHDA,R0SWAPA,;交换后,(A)=8FH,(30H)=65H,;交换后,(A)=85H,(30H)=6FH,;交换后(A)=58H,37,【例4-6】将片内RAM 30H和31H单元中的ASCII码转换成压缩式BCD码存入20H单元。其中30H单元中的数值为低位,31H单元中的数值为高位。
20、分析:09的ASCII码的低4位即是所对应的BCD码。参考程序如下:MOV R0,#30H MOV R1,#31H XCHD A,R1 SWAP A XCHD A,R0 XCH A,20H,38,(2)(SP)(direct),3、堆栈操作指令 PUSH direct POP direct PUSH direct 指令执行中,机器自动进行两步操作:(1)SP(SP)+1,POP direct 指令执行中,机器也自动进行两步操作:(1)direct(SP)(2)SP(SP)1,不影响任何标志位,堆栈:按后进先出原则读写的特殊RAM区。在用户初始化程序中要先给堆栈指针赋初值,确定栈底位置。使用指令
21、:MOV SP,#DATA,39,4FH,50H,51H,52H,80H,PSW=80H,例:“PUSH PSW”指令的执行过程,执行前:SP=4FH执行后:SP=50H,40,4FH,50H,51H,52H,SP,80H,PSW=H,例:“POP PSW”指令的执行过程,80H,执行前:SP=50H执行后:SP=4FH,41,【例4-7】在程序存储器中从标号为TAB1的单元开始依次存放09的平方值,R7中存有09中的某个数,用查表指令取出R7中数据所对应的平方值并存入R7中,要求执行后DPTR中的内容不改变。参考程序如下:PUSH DPHPUSH DPL MOV A,R7 MOV DPTR,
22、#TAB1 MOVC A,A+DPTR MOVR7,A POP DPL POP DPH TAB1:DB 00H,01H,04H,09H,,42,包括:加、减、乘、除;增量、减量;十进制的BCD码调整。1、加法指令不带进位位加法指令 ADD A,#data;A(A)+data ADD A,direct;A(A)+(direct)ADD A,Rn;A(A)+(Rn)ADD A,Ri;A(A)+(Ri)无符号数相加时:若C=1,(其值 255)。有符号数相加时:若OV=1,说明有溢出。,3.3.2 算术运算类指令,43,带进位位加法指令 ADDC A,#data;A(A)+data+(CY)ADDC
23、 A,direct;A(A)+(direct)+(CY)ADDC A,Rn;A(A)+(Rn)+(CY)ADDC A,Ri;A(A)+(Ri)+(CY),ADD和ADDC指令的目的操作数均是A寄存器。ADD和ADDC指令在执行时要影响CY、AC、OV和P标志位。OV仅用来判断有符号数运算是否正确。常用ADD和ADDC指令配合实现多字节加法运算。,对于加法指令的说明,44,【例4-8】设(A)=28H,(R1)=7CH,分析执行指令ADD A,R1后的结果。,0010 1000,0111 1100 1010 0100,结果为:A=0A4H,CY=0,AC=1,P=1,OV=1,45,【例4-9】
24、设双字节数 X 存在片内RAM 40H、41H单元,Y存在42H、43H单元,编程求 Z=X+Y,并存入片内RAM 44H、45H、46H单元。(所有数据按高字节存于低地址单元的规则存放)参考程序如下:MOV A,41HADD A,43HMOV 46H,AMOV A,40H ADDCA,42H MOV 45H,A MOV A,#00H ADDC A,#00H MOV 44H,A,46,2、减法指令,SUBB A,#data;A(A)-data-(CY)SUBB A,direct;A(A)-(direct)-(CY)SUBB A,Rn;A(A)-(Rn)-(CY)SUBB A,Ri;A(A)-(
25、Ri)-(CY),51指令系统只有带借位的减法指令,当需要执行不带借位的减法运算时,可先通过“CLR C”指令,将进位标志CY清零。SUBB指令在执行时要影响CY、AC、OV和P标志位。OV仅用来判断有符号数运算是否正确。,对于减法指令的说明,47,【例4-10】设(A)=52H,(R0)=0B4H,分析执行指令CLR C SUBB A,R0 后的结果。,0101 0010,1011 0100 1001 1110,结果为:A=9EH,CY=1,AC=1,P=1,OV=1,48,【例4-11】两个双字节无符号数分别存放于寄存器R0 R1及R2 R3中,试编程计算它们的差,结果存于寄存器R4 R5
26、中。其中R0和R1中分别存放被减数的高8位和低8位。R2和R3中分别存放减数的高8位和低8位。差的高、低8位分别存于寄存器R4和R5中。参考程序如下:MOVA,R1 CLRC SUBBA,R3 MOVR5,A MOVA,R0 SUBBA,R2 MOVR4,A,49,3、加1指令,INC A;(A)(A)+1,以下类同。INC RnINC directINC RiINC DPTR,INC指令除了INC A要影响P标志位外,对其它标志位都没有影响。,【例4-12】设(R0)=7EH,片内RAM(7EH)=0FFH,(7FH)=40H(DPTR)=21FEH,分析逐条执行下列指令后各单元的内容。IN
27、CR0INCR0INCR0 INCDPTRINCDPTR,;使7EH单元的内容由0FFH变为00H,;使R0的内容由7EH变为7FH,;使7FH单元的内容由40H变为41H,;使DPL为FFH,DPH不变,;使DPL为00H,DPH变为22H,50,4、减1指令,DEC A;(A)(A)-1,以下类同。DEC RnDEC direct DEC Ri,DEC指令除了DEC A要影响P标志位外,对其它标志位都没有影响。在51内核单片指令系统中,没有“DEC DPTR”指令。,对于减1指令的说明,51,5、乘、除法指令,乘法指令 MUL AB;(A)(B),积的低8位在A中,积的高8位在;B中,CY
28、总为0。当积大于255时(即B中不为0);则置位OV标志。,51内核单片机乘、除法指令只针对无符号数运算。这两条指令影响CY、OV和P,其它标志位不受影响。,除法指令 DIV AB;(A)(B),商在A中,余数在B中。;(CY)总是0。;若除数(B)=0,则(OV)=1,否则(OV)=0。,52,【例4-13】试将A寄存器中的二进制数转换为BCD码,结果的百位数存放于31H单元,十位数和个位数压缩后存于30H单元。参考程序如下:MOVB,#100 DIVAB MOV31H,A MOVA,#10 XCHA,B DIVAB SWAPA ADDA,B MOV30H,A,53,DA A;二 十进制调整
29、指令。,选择修正值的规则:,6、十进制调整指令,执行过程中,CPU能根据加法运算后,A中的值和PSW中的AC及CY标志位的状况自动选择一个修正值(00H、06H、60H、66H)与原运算结果相加,进行二十进制调整。,DA A指令只能跟在加法指令后面使用。参加运算的两数是BCD码才有必要调整。,54,【例4-14】设A寄存器内存有BCD码56H,寄存器R3内存有BCD码67H,执行ADD A,R3指令后,结果应该是123,但实际结果为:0101 0110 56+0110 0111 67 1011 1101 BDH 需再执行指令 DA A,对上面的结果进行调整,因高4位及低4位数都大于9,故需加6
30、6H。1011 1101+0110 0110 加66H调整 1 0010 0011 123,55,BCD码减法,方法:减法可以转换为加法运算,将减数转换为十进制补码,然后相加,再用DA A指令进行调整。例如:80-30=80+-30补=80+(100-30)=150结果中百位数字1在CY中,A寄存器中的50H即80-30的BCD码。,在实际运算时,不能用一个字节表示十进制数100,可用99+1表示,即10011001B+1=10011010B=9AH,因为9AH经过十进制调整后就是100。,56,十进制无符号数的减法运算可按以下步骤进行:第一步:求减数的十进制补码(9AH-减数);第二步:被减
31、数与减数的十进制补码相加;第三步:经DA A指令调整后就得到所求的十进制减法运算结果。,【例415】设M1、M2、M3 分别为十进制的被减数、减数和差的符号地址,编写减法运算程序。CLRC;CY清0MOVA,9AH;A 9AH SUBBA,M2;求M2的十进制补码ADDA,M1;M1与M2的十进制补码相加DAA;十进制调整MOVM3,A;差存入M3,57,4.3.3 逻辑运算指令,该类指令除了带进位循环及A为第一操作数的指令影响CY和P外,其它指令不影响PSW中的标志位。1.逻辑与指令ANL A,#data;A(A)data,以下类同ANL A,Rn ANL A,direct ANL A,Ri
32、ANL direct,#dataANL direct,A,【例4-16】设当前P1口输出35H,使其高4位输出0,低4位不变。解;ANL P1,#0FH 此做法称为“屏蔽”位。,注意:跟“0”相与可将该位清0 跟“1”相与该位保持不变,58,2.逻辑或指令ORL A,#data;A(A)data,以下类同ORL A,Rn ORL A,direct ORL A,RiORL direct,#dataORL direct,A,注意:跟“1”相或可将该位置1 跟“0”相或该位保持不变,【例4-17】将A中的低3位送入片内RAM 30H单元低3位,并且保持30H单元的高5位不变。解;ANLA,#07HA
33、NL30H,#0F8HORL30H,A 这称为“数位组合”。,59,3.逻辑异或指令XRL A,#data;A(A)data,以下类同XRL A,Rn XRL A,direct XRL A,RiXRL direct,#dataXRL direct,A,注意:跟“1”异或可取反 跟“0”异或保持不变,【例4-18】设(A)=0B5H=10110101B,执行下列操作:XRLA,#0FH;则A的低4位取反,高4位保持不变,(A)=10111010B 这称为“指定位求反”。,60,4.A寄存器的清零和求反指令 清零指令:CLR A;A0 求反指令:CPL A;,【例4-18】双字节数求补码。一个 1
34、6 位正数X存于 R3(高 8 位)R2(低 8 位)中,求X的补码,并将结果仍存于R3、R2。参考程序如下:MOVA,R2 CPLA ADDA,01H MOVR2,A MOVA,R3 CPLA ADDCA,00H MOVR3,A,61,5.移位指令 循环左移:RL A 循环右移:RR A 带进位位的循环左移:RLC A 带进位位的循环右移:RRC A,A.0,A.7,A.0,A.7,A.0,A.7,CY,A.0,A.7,CY,循环移位只能对 A寄存器进行,每次只能移动一位 对于某些数左移一位相当于乘以2,右移一位相当于 除以2。,62,4.3.4 控制转移类指令,作用:改变程序计数器PC的值
35、,从而改变程序执行方向。分为四大类:无条件转移指令;条件转移指令;子程序调用指令;返回指令。,1、无条件转移指令 LJMP addr16 AJMP addr11 SJMP rel JMP A+DPTR,63,长转移指令,LJMP addr16;转移目的地址 PC addr16,0000H FFFFH,64KB,长转移指令:LJMP AAAAH;AAAAHPC,PC=0000H,PC=AAAAH,假设执行该指令前,PC的值为0000H。,注意:该指令可以转移到64 KB程序存储器中的任意位置。,64,绝对转移指令,PC高5位(保持不变),PC低11位,操作码(第一字节),操作数(第二字节),程序
36、计数器PC,AJMP addr11;PC+2PC,addr11 PC.10PC.0,转移目的地址与(PC)+2在同一个2KB范围内。,65,【例4-20】分析AJMP指令地址为2300H,或AJMP指令地址为2FFFH两种情况下,执行指令:AJMP 0FFH 后,程序转移的目标位置?,(1)若AJMP指令的地址为2300H:当执行该指令时,PC=2302H,完成该指令后,PC1511=00100B保持不变,PC100 00011111111B即转移目的地址为 PC=20FFH。,(2)若AJMP指令的地址PC=2FFFH:执行该指令时PC=3001H,指令执行后 PC1511=00110B保持
37、不变,PC100 00011111111B,转移目的地址 PC=30FFH。,可见,虽然addr11相同,指令机器码相同,但转移的目的地址却可能不同。,66,相对短转移指令,SJMP rel;PC(PC)+2+rel,实际使用中常写成 SJMP addr16,汇编时会自动转换成rel。该指令的转移范围是:相对PC当前值向上127字节,向下128字节。,注意:在单片机程序设计中,通常用到一条SJMP指令:SJMP$;功能:原地踏步,动态停机。调试程序时通常用它,使程序不再向后执行。,67,【例4-21】计算转移指令的目标地址。1)835AH:SJMP 35H 2)835AH:SJMP 0E7H,
38、解:1)rel=35H=0011 0101B 为正数,因此程序向上转移。目标地址=当前PC+rel=(835AH+02H)+35H=8391H,2)rel=0E7H=1110 0111B 为负数,因此程序向下转移。目标地址=835AH+02H+0FFE7H=8343H,相对长转移指令,JMP A+DPTR;间接转移,散转移指令。转移目的地址=(A)+(DPTR)本指令不影响标志位,不改变 A寄存器 及DPTR中的内容。常用于多分支程序结构中,可在程序运行过程中动态地决定程序分支走向。在64 KB范围内无条件转移,68,【例4-22】R1中存有从00H0FH中的某一个数,编写程序,根据R1中的数
39、值,转移至不同处理程序入口。,参考程序如下:MOVA,R1RLA ADDA,R1 MOVDPTR,#TABLE JMPA+DPTR,TABLE:LJMPTAB0 LJMPTAB1LJMPTAB2 TAB0:TAB1:TAB2:,LJMP是三字节指令,跳转前A寄存器中内容需是3的倍数。,69,比较LJMP、AJMP、SJMP、JMP转移的起点和范围:,2K,64K,70,实现按照一定条件决定转移的方向,分三类:A寄存器判零条件转移 比较条件转移 减1不为零转移,JZ rel:若(A)=0,则转移,否则顺序执行。JNZ rel:若(A)0,则转移,否则顺序执行。转移目的地址=(PC)+2+rel
40、不影响任何标志位。,A寄存器判零条件转移指令,2、条件转移指令,指令的实际编写形式:“JZ/JNZ 目标地址标号”。,71,【例4-23】编写程序,将从片外RAM地址2000H单元开始的数据连续传送到片内地址从30H单元开始的RAM中,直到出现0为止。,参考程序如下:ORL AUXR,#00000010B MOVDPTR,#2000H MOVR0,#30HLOOP:MOVXA,DPTR MOVR0,A INCR0 INCDPTR JNZLOOP,EXTRAM=1时,访问片外扩展RAM,72,比较转移指令 功能:比较两个字节中的值,若不等,则转移。CJNE A,#data,relCJNE Rn,
41、#data,relCJNE Ri,#data,relCJNE A,direct,rel,用第一操作数内容减去第二操作数内容,但差值不回存。转移目的地址=(PC)+3+rel若前者小于后者,则(CY)=1,否则(CY)=0。,73,【例4-24】设P1口的P1.1 和 P1.2两引脚作为单片机与外部设备通信联络信号输入端,当P1.1为高且P1.2为低时,单片机执行与外设的通信任务,否则等待。,参考程序如下:WAIT:MOVA,P1 ANLA,#06H CJNEA,#02H,WAIT,74,该类指令可产生三分支程序:即,相等分支;大于分支;小于分支。,75,减1不为零转移指令 功能:本指令为双功能
42、指令,即减1操作和判断转移操作。第一操作数内容减1后,若差值不为零,则转移;否 则顺序执行。DJNZ direct,rel;direct(direct)1,若(direct)0,则PC(PC)+3+rel,否则顺序执行 DJNZ Rn,rel;Rn(Rn)1,若(Rn)0,则PC(PC)+2+rel,否则顺序执行,指令的实际编写形式:“DJNZ Rn/direct,目标地址标号”。,76,【例4-25】统计片内扩展RAM中从地址为0700H单元开始的20个字节数据中0的个数,并存于R7中。,参考程序如下:ANLAUXR,#0FDHMOVDPTR,#0700HMOVR2,#20MOVR7,#0L
43、OOP:MOVXA,DPTRCJNEA,#0,NEXTINCR7NEXT:INCDPTRDJNZR2,LOOP,77,子程序调用指令和普通转移指令相似,但二者有本质区别:执行普通转移指令跳转后不再返回,而执行子程序调用指令跳转执行子程序后,再返回主程序继续执行。,3、子程序调用及返回指令,执行该类指令不影响任何标志位。,为了实现返回:执行子程序调用指令时,硬件电路自动将PC中的断点地址压入堆栈保存,然后再转向子程序入口地址,执行子程序。在子程序的最后安排一条返回指令(RET),将断点地址从堆栈中弹出到PC,即返回主程序继续执行。,78,LCALL addr16;3字节 指令,长调用指令,;转移
44、范围64KB,执行中自动完成如下过程:(PC)(PC)+3 SP(SP)+1(SP)(PC7 0),保护断点地址低字节;SP(SP)+1(SP)(PC15 8),保存断点地址高字节;PC addr16,目的地址送PC,转子程序。,79,转移范围与(PC)+2在同一个2KB内。执行中机器自动完成下列过程:(PC)(PC)+2 SP(SP)+1(SP)(PC7 0)SP(SP)+1(SP)(PC15 8)PC10 0 addr10 0,绝对调用指令,ACALL addr11;2字节 指令,在大程序中推荐使用LCALL指令。,80,RET,执行过程:PC15 8(SP)SP(SP)1 PC7 0(S
45、P)SP(SP)1,子程序返回指令,【例4-26】利用DJNZ指令设计STC12C5A60S2系列单片机的循环延时子程序,已知时钟频率fosc=12MHz。分析:因为fosc=12MHz,故该单片机的机器周期T为1/12 s。,81,1)采用单循环方式延时10s,调用该子程序的指令ACALL DELAY_10s或LCALL DELAY_10s需要6T时间。,t=6+(2+427+4)/12=10s,参考子程序如下:DELAY_10s:MOVR7,#27;2TDJNZR7,;4TRET;4T,82,2)采用双重循环方式延时1ms,分析:12(2504)/12=1000s=1ms,程序流程图:,8
46、3,参考子程序如下:DELAY_1ms:MOVR7,#12;2TDL:MOVR6,#250;2TDJNZR6,;4TDJNZR7,DL;4TRET;4T,t=6+2+(2+4250+4)12+4/12=1007s1ms,84,3)采用三重循环方式延时1s,分析:100 120(2504)/12=1000000s=1s,程序流程图:,85,参考子程序如下:DELAY_1s:MOV R7,#100;2TDL2:MOV R6,#120;2T DL1:MOV R5,#250;2TDJNZ R5,;4TDJNZ R6,DL1;4TDJNZ R7,DL2;4TRET;4T,t=6+2+2+(2+4250+
47、4)120+4 100+4/12=1006051s1s,86,【例4-27】设计一款节日灯,通过单片机的P1.0P1.7控制8路由发光二极管组成的灯,输出高电平点亮。先亮1灯(P1.0控制),每隔2秒闪烁1次,共闪烁10次,然后2灯闪10次,如此循环。,程序流程图:,分析:P1.0引脚输出高电平时1灯亮,输出低电平时1灯灭,一亮一灭即为闪烁一次。亮的时间和灭的时间各持续1秒,共闪烁10次。其它灯同样控制。,87,参考子程序如下:ORG0MOV SP,#4FHMOVA,#01HLOOP1:MOVR2,#10LOOP2:MOVP1,ALCALLDELAY_1sMOVP1,#00HLCALLDELA
48、Y_1sDJNZR2,LOOP2RL ALJMPLOOP1DELAY_1s:;1秒延时子程序(略)RETEND,88,RETI,执行过程:PC15 8(SP)SP(SP)1 PC7 0(SP)SP(SP)1,中断返回指令,;中断服务子程序的最后一条指令。,功能:返回主程序中断的断点位置,继续执行断点位置后面的指令。,RETI指令的执行过程与RET基本相同,只是RETI在执行时,不仅要恢复断点地址,还要清除中断响应时所置位的优先级触发器,使得已申请的同级或低级中断申请可以响应。而RET指令只能恢复返回地址。,89,;这是一条单字节单时钟周期指令。;执行时,不作任何操作,仅将PC的内容加1,使CP
49、U指向 下一条指令继续执行程序。;使用这条指令的目的仅仅是消耗这条指令执行所需要的一 个机器周期的时间。一般用于设计延时程序、拼凑精确延 时时间及程序等待等场合。,4空操作指令,NOP;PC(PC)+1,90,4.3.5 位操作指令,包括:位传送指令、位控制转移指令、位运算指令。位操作由单片机内布尔处理器来完成。除了使用进位位CY的位指令外,均不影响其他标志位。复习:位地址的四种表示:1)使用直接位地址表示;如20H、30H、33H等;2)使用位寄存器名来表示;如C、OV、F0等;3)用字节寄存器名后加位数来表示;如PSW.4、P0.5、ACC.3等;4)字节地址加位数来表示;如20H.0、2
50、4H.4、2AH.7等。,91,1.位传送指令,MOV C,bit;CY(bit);MOV bit,C;bit(CY),注意:该类指令在使用时必须有进位位CY参与,不能直接实现两个一般位之间的传送。,【例4-28】将片内RAM中20H 单元的第2位(位地址为02H)的状态,通过P1口的P1.3引脚输出。,程序如下:MOVC,02H;CY(02H)MOVP1.3,C;P1.3(CY),92,2.位逻辑操作指令,位清0CLRC;CY 0CLRbit;bit 0,位置1SETBC;CY 1SETBbit;bit 1,位取反CPLC;CY(/CY)CPLbit;bit(/bit),位与ANLC,bit