单片机原理及应用 第三章 80C51指令系统课件.ppt
1,单片机原理及应用,第三章 80C51指令系统,本章重点寻址方式指令格式操作结果及对标志位影响,3.1 概述,分类,数据传送类指令 29,数学运算类指令 24,逻辑运算类指令 24,控制转移类指令 17,位操作指令 17,111条指令,按指令长度分类,单字节指令,双字节指令,三字节指令,指令执行时间,12个振荡周期 64,24个振荡周期 45,48个振荡周期 2,指令格式,标号:操作码 (目的操作数),(源操作数);注释,指令的符号地址,由字母打头的字母数字串组成,长度一般不超过6个符号,指令操作的性质,用规定的汇编语言助记符表示,指令操作的对象,3.2 寻址方式和寻址空间,概念:说明操作数所在的位置(地址),把操作数提取出来的方法,基本寻址方式:,1、寄存器寻址2、直接寻址3、寄存器间接寻址4、立即寻址5、相对寻址 6、变址寻址7、位寻址,一、寄存器寻址,操作数 通用寄存器的内容表示符号 寄存器名称,寻址范围,工作寄存器Rn(R0R7)寄存器ACC(累加器A)寄存器B,DPTR,位寄存器Cy,8,(SFR),RAM64KB,FFFFH,0000H,片内数据存储器,片外数据存储器,ACC,DPTR,B,二、直接寻址,操作数 指令中直接地址的内容,寻址范围:,1、内部数据RAM的低128个字节单元2、特殊功能寄存器3、位地址空间,通用符号:direct,10,80C52,片内数据RAM,位寻址区,R7R0 3组,R7R0 2组,R7R0 1组,R7R0 0组,20H18H10H08H00H,寄存器,30H,7FH,80H,FFH,特殊功能寄存器,(SFR),RAM64KB,FFFFH,0000H,片内数据存储器,片外数据存储器,三、寄存器间接寻址方式,指令指定的寄存器内容为操作数地址,间址寄存器 ,R0,R1,DPTR,SP,寻址范围,1、内部RAM的低128字节(00H7FH) R0, R1 (Ri ,i=0,1),2、外部RAM的64KB(0000HFFFFH) DPTR, R0, R1,符号 寄存器名,3、堆栈区 SP为间址寄存器,12,(SFR),RAM64KB,FFFFH,0000H,片内数据存储器,片外数据存储器,四、立即寻址方式,指令直接给出操作数,操作数为8位或16位二进制数,称立即数,寻址范围,程序存储器中的立即数,通用符号:#data (8位),#data16(16位),五、相对寻址方式,以PC当前值为基址,加上指令中给出的偏移量(rel)形成有效的程序转移地址。,控制转移类指令,转移范围:以PC当前值为起始地址,相对偏移在+127 -128个字节单元之间。,偏移量rel 八位二进制补码,1005H:JC 80H,执行过程:,读指令,完成后 (PC)=(PC)+2,如 C=1,则 (PC)=(PC)+rel 转移至 1007H-80H=0F87H 单元,如C=0 则执行1007H单元中的指令,后向128个单元前向127个单元,六、变址间接寻址,基址寄存器内容加上间址寄存器内容(地址偏移量)为有效地址,基址寄存器:PC,DPTR变址寄存器:A,寻址范围:程序存储器,例: MOVC A,A+DPTR 设 A=11H DPTR=02F1H,操作数地址为 02F1H+11H=0302H,操作:,(0302H),A,七、位寻址,MCS-51设有独立的位处理器,位地址一般用直接位地址方式给出,可归入直接寻址方式,寻址范围:,位寻址内部RAM 128位 可位寻址的SFR 82位,位地址的表示方式:,1、直接地址(位地址)2、位名称3、第几单元第几位,寄存器名+位4、用伪指令指定的符号地址,通用符号 bit,例:,PSW中F0(用户标志)可表示如下:,D5HF0PSW.5AF(AF EQU F0),19,3.3 指令系统,3.3.1 数据传送类指令,按操作方式,分为三种:,数据传送,数据交换,栈操作,一、普通传送类指令,格式:,MOV (目的操作数),(源操作数),操作码助记符,操作:,将源操作数单元内容,传送到目的操作数单元中,源操作数内容不变。不影响标志位Cy,AC和OV。,操作数的组合关系,1、立即数的传送,MOV A, #data,(A),#data,MOV Rn, #data,(Rn),#data,MOV Ri, #data,(Ri),#data,MOV direct, #data,(direct),#data,MOV DPTR, #data16,(DPTR),#data,说明:,a、MOV A,#data,将8位立即数送入累加器A中,例:MOV A,#80H,操作结果: (A)= 80H,b、MOV Rn,#data n=07,将8位立即数送入工作寄存器Rn中,例:MOV R4,#80H,操作结果: (R4)= 80H,c、MOV Ri, #data,将8位立即数送入由Ri指定的地址单元中,i=0,1。,Ri中的地址为00H7FH(8051),00HFFH(8052),注:仅寻址内部RAM,不能寻址SFR,例:MOV R0,#32H 设 (R0)=70H , (70H)=11H,执行结果:(70H)=32H,d:MOV direct,#data,将8位立即数送入由direct直接寻址的地址单元中。,direct:00HFFH,8位二进制地址码 寻址内部RAM(00H7FH)及SFR,例:MOV 70H,#70H,MOV P0,#70H MOV 80H,#70H,e:MOV DPTR,#data,唯一的16位数据传送指令,把16位立即数送入DPTR中,例:MOV DPTR,#2034H,执行结果:(DPH)=20H (DPL)=34H,2、内部数据存储器与累加器A传送数据,MOV A, direct,(A),(direct),MOV direct, A,(A),(direct),MOV A, Rn,(A),(Rn),MOV Rn, A,(A),(Rn),MOV A, Ri,(A),(Ri),MOV Ri, A,(Ri),(A),寻址方式的组合,例:MOV R1,#82H MOV A,R1,80C51指令错误因为82H是DPL的地址值,对于SFR,不能使用间接寻址方式,正确指令:MOV A,DPL 或 MOV A,82H,80C52 正确,寻址内部RAM,3、内部数据存储器中Rn、SFR和片内数据RAM之间的数据传送,MOV direct,direct,(direct目的),(direct源),MOV direct, Rn,(direct),(Rn),MOV Rn, direct,(direct),(Rn),MOV direct, Ri,(direct),(Ri),MOV Ri, direct,(Ri),(direct),例1:设PSW中标志位RS1,RS0为“11”,则选中第三组工作寄存器,MOV 40H,R0,MOV 40H,18H,结果相同,用立即寻址指令为片内RAM中20H,25H和P1口上置数,例2:,MOV 20H, #25HMOV 25H, #10HMOV P1, #0CAH,执行结果 (20H)=25H,(25H)=10H (P1)=CAH,将以上状态作为初值,执行以下程序,结果如何,MOV R0, #20HMOV A, R0MOV R1, AMOV B, R1MOV R1, P1MOV P3, P1,(R0)=20H,(A)=(R0)=(20H)=25H,(R1)=(A)=25H,(B)=(R1)=(25H)=10H,(R1)=P1 (25H)=CAH,P3=P1=CAH,(A)=?(R1)=?(B)=?(25H)=?(P3)=?(P1)=?(20H)=?,25H25H10HCAHCAHCAH25H,二、外部数据存储器的数据传送指令,只能间接寻址,且只能与累加器A进行数据传送,格式:MOVX (目的操作数),(源操作数),例:,若片外数据存储单元中,(3007H)=60H,MOV DPTR, #3007HMOVX A, DPTR,结果:,(A)=60H,使用Ri作间址寄存器,此时需用P2口输出高八位地址,应事先预置P2,Ri的值,以下程序功能与上例相同:MOV P2 , #30HMOV R0 , #07HMOVX A, R0,三、程序存储器向累加器A传送指令MOVC,MOVC A , A+PC,(PC),(PC)+1,(A),(A)+(PC),MOVC A, A+DPTR,(A),(A)+(DPTR)),功能:把A中内容与基址寄存器(PC,DPTR)内容相加,求得程序存储器某单元地址,再将该地址单元内容送累加器A,8位无符号整数,说明:,1、以PC作为基址寄存器,因为PC值不能任意更改,所以查表范围为PC当前值开始后的256字节。,偏移量计算式:DIS=表首地址(该指令所在地址+1),2、以DPTR作为基址寄存器,因为DPTR的内容可以通过赋值改变,使表格可以设置在64KB程序存储器的任意地址空间。,例1:编制根据累加器A中的数(09)查其平方表的子程序。,COUNT:PUSH DPH; 保护DPTR内容 PUSH DPL; MOV DPTR,#TABLE ;赋表首地址给DPTR MOVC A, A+DPTR ; 根据A中内容查表 POP DPL; 恢复DPTR内容 POP DPH RET; 返回主程序,ORG 1000HTABLE:DB 00 DB 01 DB 04 DB 09 DB 16 DB 25 DB 36 DB 49 DB 64 DB 81,DB:伪指令,作用是把其后的值存入由标号开始的连续单元中,例2:编子程序根据A中二进制数查其ASCII码,BITOASC:,ADD A,#02HMOVC A, A+PCSJMP BARETDB 30H, 31H, 32H, 33HDB 34H, 35H, 36H, 37HDB 38H, 39H, 41H, 42HDB 43H, 44H, 45H, 46HRET,TABLE:,BARET:,;加偏移量调整;查表;返回主程序,四、数据交换指令,1、字节交换指令,XCH A, RnXCH A, directXCH A, Ri,(A) (Rn) (A) (direct) (A) (Ri),例:设(R0)=20H,(A)=3FH,(20H)=75H,执行指令:XCH A,R0,执行结果:(A)=75H,(20H)=3FH,2、半字节交换指令,XCHD A, Ri (A30) (Ri)30)常用于BCD码处理,例:设(R1)=30H,(A)=67H,(30H)=84H,执行指令:XCHD A, R1,执行结果:(A)=64H (30H)=87H,3、累加器A高4位与低4位内容互换指令,SWAP A ;( A 47) (A 03),例:设(A)=0CAH,执行指令:SWAP A执行结果:(A)=0ACH,5、堆栈操作类指令,要点:入栈操作,先执行SP+1,再入栈 出栈操作,先出栈,再执行SP-1,例:在中断响应时,(SP)=09H,数据指针DPTR的内容为0123H,执行以下指令:,PUSH DPLPUSH DPH,(SP)+1,使(SP)=0AH(DPL)压入0AH单元,(SP)+1,(SP)=0BH(DPH)压入0BH单元,执行结果:,(0AH)=23H(0BH)=01H(SP)=0BH,堆栈操作需遵循先入后出,后入先出原则,才能保持原单元内容不变,例:设(DPTR)=0123H,PUSH DPHPUSH DPL.POP DPLPOP DPH,执行结果:(DPTR)=0123H,如执行:,PUSH DPHPUSH DPLPOP DPHPOP DPL,执行结果:(DPTR)=2301H,3.3.2 算术运算类指令,类型:加,减,乘,除,增量、减量以及二十进制调整指令,ADD、ADDC、SUBB指令的执行将影响标志位(PSW中的OV,Cy,AC及P),一、加法指令ADD,目的操作数 累加器A 源操作数 4种寻址方式,ADD A,Rn (A) (A)+(Rn) ADD A,direct (A) (A)+(direct)ADD A,Ri (A) (A)+(Ri)ADD A,#data (A) (A)+#data,运算均针对无符号二进制数进行,但结合OV标志可实现有符号数运算。结果将影响OV,Cy,AC,P标志,A,源+A,当最高位有进位,Cy=1位3向位4有进位,AC=1OV取决于6、7两位的进位情况,同时有进位或无进位,则OV=0;只有一位有进位,OV=1A中有偶数个1,P=0;否则,P=1,例:设(A)=0C3H,(R0)=0AAH 执行指令:ADD A,R0 写出执行结果及对标志位影响,(A) 1 1 0 0 0 0 1 1 + (R0) 1 0 1 0 1 0 1 0,0 1 1 0 1 1 0 1,C=1,AC=0,OV=1,P=1,(A)=6DH,只对有符号数运算有意义。两负数相加,结果为正数,溢出,例:设(A)=0C3H,(R0)=0AAH 执行指令:ADD A,R0 写出执行结果及对标志位影响,(A) 1 1 0 0 0 0 1 1 + (R0) 1 0 1 0 1 0 1 0,0 1 1 0 1 1 0 1,C=1,AC=0,OV=1,P=1,(A)=6DH,无符号数 195 + 170 = 365有符号数 -61 + (-86) = -147,109,溢出,二、带进位加法指令ADDC,ADDC A, Rn ; (A) (A)+(C)+(Rn)ADDC A,direct ; (A) (A)+(C)+(direct)ADDC A,Ri ; (A) (A)+(C)+(Ri)ADDC A, #data ; (A) (A)+(C)+(#data),常用于多字节加法,例:设(A)=0C3H,(R0)=0AAH,C=1 执行指令:ADDC A,R0,(A) 1 1 0 0 0 0 1 1+ (C) 0 0 0 0 0 0 0 1,1 1 0 0 0 1 0 0,+(R0) 1 0 1 0 1 0 1 0,0 1 1 0 1 1 1 0,C=1,AC=0,OV=1,P=1,(A)=6EH,三、带借位减法指令SUBB,SUBB A,Rn ; (A) (A)-(C)-(Rn)SUBB A,direct ; (A) (A)-(C)-(direct)SUBB A,Ri ; (A) (A)-(C)-(Ri)SUBB A,#data ; (A) (A)-(C)-#data,影响标志位:,最高位有借位,Cy=1位3向位4有借位,AC=1最高两位同时有借位或无借位,OV=0;只有一位有借位,OV=1,例:设(A)=0C9H,(30H)=54H,C=1 执行:SUBB A,30H,(A) 1 1 0 0 1 0 0 1- (C) 0 0 0 0 0 0 0 1,1 1 0 0 1 0 0 0,- (30H) 0 1 0 1 0 1 0 0,0 1 1 1 0 1 0 0,C=0,AC=0,OV=1,P=0,(A)=74H,只有在符号数相减时,OV才意味着溢出与否,如出现以下两种情况,OV置1:负-正=正 正-负=负,四、增量指令INC,INC A ; (A) (A)+1INC Rn ; (Rn) (Rn)+1INC direct ; (direct) (direct)+1INC Ri ; (Ri) (Ri)+1INC DPTR; (DPTR) (DPTR)+1,操作:指定变量加1,结果仍存于原地址单元中。除P外,不影响任何标志位。,例:设(R0)=7EH,(7EH)=0FFH (7FH)=40H,执行下列指令:,INC R0 ;INC R0 ;INC R0 ;,(R0)=(R0)+1, (7EH)=00H,(R0)=(R0)+1, (7FH)=41H,(R0)=(R0)+1, (R0)=7FH,运行结果:(R0)=7FH,(7EH)=00H(7FH)=41H,例:执行指令序列,MOV DPTR,#1FFEH;INC DPTR ;INC DPTR ;INC DPTR ;,(DPTR)=1FFEH,(DPTR)=1FFFH,(DPTR)=2000H,(DPTR)=2001H,五、减量指令DEC,DEC A ; (A) (A)-1DEC Rn ; (Rn) (Rn)-1DEC direct ; (direct) (direct)-1DEC Ri ; (Ri) (Ri)-1,操作:指定变量减1,结果送回原地址单元,不影响标志位(除P)。,设(40H)=00H 执行 DEC 40H,结果:(40H)=FFH不影响标志位,六、乘法指令,MUL AB ;,(A)07(B)815,(A)*(B),影响标志位:如乘积255 (0FFH) (即B0) ,OV=1C总是被清0,即C=0AC不变,影响P,例:设(A)=80H(128),(B)=32H(50),执行指令:MUL AB,结果:乘积为1900H(6400),(A)=(B)=,00H,19H,OV=Cy=P=,1,0,0,七、除法指令,DIV AB ;,(A)(B),商余数,(A)/(B),对标志位影响:当B中除数为00H,除法运算结果为不定值,则A、B中内容均为不定值,OV置1C=0,例: (A)=87H(135),(B)=0CH(12) DIV AB,(A)=(B)=,0BH(11),03H,OV=C=,00,八、二十进制调整指令,DA A ; 调整A中内容为BCD码,调整方法:根据C和AC的状态,并结合A的内容,IF (A03)9 OR (AC)=1, THEN (A03)=(A03)+06H;,IF (A47)9 OR (C)=1 ,THEN (A47)=(A47)+60H,因为指令要利用C和AC,所以必须跟在加法指令(ADD,ADDC)后面,根据A中的数值及PSW相应标志位的状态,可能的操作为A加06H,60H,66H,例: (A)=0101 0110B(56) (R3)=0110 0111B(67)以上均为BCD码 (C)=0,执行指令: ADDC A,R3 DA A,(A) 0 1 0 1 0 1 1 0+(R3) 0 1 1 0 0 1 1 1,1 0 1 1 1 1 0 1,A309,AC=0A749,C=0+66H调整,+ 0 1 1 0 0 1 1 0,0 0 1 0 0 0 1 1,结果: (A)=23H (C)=1,对于无符号BCD码运算,56+67=123,使用此指令条件:,1、两个操作数均为压缩BCD码2、不适合减法和增1运算,例:对于十进制减法运算,可采用补码相加的方法 即用9AH减去减数得到以十为模的补码,设被减数存30H单元,减数存40H单元,结果存50H单元。程序如下:,CLR C ;MOV A,#9AH;SUBB A, 40H ;ADD A , 30H;DA A ;MOV 50H, A,清进位位,求减数的十补码,补码相加,调整至BCD码,3.3.3 逻辑运算类指令,按操作数分为两类:,单操作数指令双操作数指令,针对累加器A进行,A与第二操作数之间进行,操作:清零、求反、移位,与、或、异或,一、单操作数逻辑运算类指令,例:设(A)=0AAH(10101010B) 执行:CPL A,结果: (A)=01010101B(55H),3、累加器A循环左移指令 RL A;,例: (A)=0C5H(1100 0101B),RL A,(A)=1000 1011B=8BH,73,4、累加器A连同进位位C循环左移指令,RLC A;,例: (A)=45H(0100 0101 B),(C)=1,RLC A ;,(A)=1000 1011B=8BH,(C)=0,5、累加器A循环右移指令,RR A ;,6、累加器A连同进位位C循环右移指令,RRC A ;,例: (A)=0C5H(1100 0101B),(C)=1,执行指令: RRC A,结果: (A)=1110 0010B=0E2H,(C)=1,二、双操作数逻辑运算类指令,1、逻辑“与”指令,ANL A , Rn ANL A , directANL A , RiANL A , #data,以A为第一操作数,逻辑“与”运算的结果存入A,ANL direct,AANL direct,#data,目的操作数为direct,源操作数为A和立即数,与指令常用于屏蔽某些不用位。,方法:欲屏蔽位该位与“0”相“与”, 保留位与“1”相“与”,例 ANL A,#1111 0000B; 屏蔽低4位,高4位不变,2、逻辑“或”指令,ORL A , RnORL A , directORL A , RiORL A , #dataORL direct , AORL direct , #data,ORL指令常用于使字节中某些位置1,方法:欲置1的位与“1”相或, 欲保留不变的位与“0”相或,如 ORL A,#0FH; 高4位不变,低4位置1,3、逻辑“异或”指令,XRL A , RnXRL A , directXRL A , RiXRL A , #dataXRL direct , AXRL direct , #data,XRL 指令可用于对某些位取反,方法:欲取反的位用“1”去异或,保留位用“0”去异或,如 XRL A,#0FH;高4位不变,低4位取反,例: 设(A)=0C3H(1100 0011B) (R0)=0AAH(1010 1010B),分别执行以下指令:,ANL A,R0 ;ORL A,R0 ;XRL A,R0 ;,(A)=1000 0010B=82H,(A)=1110 1011B=0EBH,(A)=0110 1001B=69H,3.3.4 控制转移类指令,3类:,无条件转移条件转移子程序调用及返回,一、无条件转移指令,1、绝对无条件转移,AJMP addr11;,(PC) (PC)+2(PC 010) addr 010(PC 1115)不变,addr11:11位地址,是转移目的地址的低11位。 在汇编语言程序中,可写成4位16进制地址,也可写成代表16位地址的标号(符号地址)形式。注:不常用,MCS48兼容指令,转移范围:2K字节,例1: 0345H:AJMP addr11 addr11取值可为000 0000 0000B111 1111 1111B,执行时 (PC)=(PC)+2=0347H,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,0347H:,0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 B,转移目标地址范围:PC 1115不变,0 0 0 0 0 0 0 0 0 0 0 B,1 1 1 1 1 1 1 1 1 1 1 B,有效转移地址范围: 0000H07FFH,例2: 07FFH: AJMP adr11,(PC)+2=07FFH+2=0801H,0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1B,0 0 0 0 0 0 0 0 0 0 1B,1 1 1 1 1 1 1 1 1 1 1B,0801H,0801H,0FFFH,转移范围,转移范围:包括当前指令的下一条指令在内的同一2K字节内,addr11:在0801H0FFFH范围内,例3: 0345H:AJMP 0123H 2567H:AJMP 29ABH,是否正确,正确,错误,2567H:0 0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 B,1 1 1 1 1 1 1 1 1 1 1 B,27FFH,转移地址最大为27FFH,29ABH大于27FFH,超出有效转移地址范围,2、长转移指令,LIMP addr16 ; (PC) addr16,转移范围: 64KB,3、相对转移指令,SJMP rel ;,(PC) (PC)+2(PC) (PC)+rel,rel:8位二进制补码,可写成符号地址的形式,转移范围:PC当前值为基准,-128+127,例: 0345H:SJMP rel,PC 当前值:0347H,向后128字节 02C7H,向前127字节 03C6H,rel=80H,rel=7FH,当rel取值为FEH(-2),则目的地址与源地址相同,如 设rel=FEH,执行指令 HERE:SJMP HERE,程序在此指令处无限循环,4、间接转移指令,JMP A+DPTR ; (PC) (A)+(DPTR),多分支转移指令,DPTR内容为多分支转移程序的首地址,由累加器A的内容来选择其中的某一个分支转移指令,例:,MOV DPTR , #JMP_TBLJMP A+DPTR.AJMP LABEL0AJMP LABEL1AJMP LABEL2AJMP LABEL3,JMP_TBL:,A中内容为偶数,分支转移表不超过256B,二、条件转移指令,均为相对寻址方式,指令提供偏移量rel,转移范围为PC当前值的-128+127,1、判零转移指令,JZ rel ;,(PC) (PC)+2如(A)=0,则(PC)=(PC)+rel否则,程序顺序执行,JNZ rel ;,(PC) (PC)+2如(A)=0,则(PC)=(PC)+rel否则,程序顺序执行,例:将外部数据存储器的一个数据块传送到内部数据RAM,两者的首地址分别为DATA1和DATA2,遇到传送的数据为0时停止传送。,分析:数据块传送,长度较短,均采用间接寻址方式,其中R0寻址外部数据存储器,R1寻址内部RAM。,传送时,要以累加器A作为过渡,利用判零转移可以判别是否继续传送还是终止,程序如下:,MOV R0,#DATA1 ;MOV R1,#DATA2 ;MOVX A,R0 ;JZ STOP ;MOV R1,A ;INC R0 ;INC R1 ;SJMP LOOP ;,LOOP:,HERE:,外部数据块首址,内部数据块首址,外部数据传入A,为零则终止,不为零则传送至内部RAM单元,修改地址指针,继续循环,STOP:,2、比较转移指令,格式: CJNE (目的操作数),(源操作数),rel,根据目的和源操作数的寻址方式不同,共有4条,CJNE A , #data , relCJNE A , direct , relCJNE Rn , #data , relCJNE Ri , #data , rel,三字节指令,例:设(R7)=56H,执行指令,CJNE R7,#60H,K1,K1:,例2、设P1口P10P13为准备就绪信号输入端,当该4位输入全“1”说明各项工作准备好,单片机可顺序执行主程序,否则循环等待。,程序片段如下:,L0:,MOV A , P1 ;ANL A , #0FH ;CJNE A , #0FH , L0 ;,MAN1:,读P1口内容,高4位无意义,屏蔽,低4位不全为1,返回L0,否则继续执行,3、循环转移指令(减1条件转移指令),DJNZ Rn,rel ;,(PC) (PC)+2(Rn) (Rn)-1If(Rn)=0,(PC) (PC)+relElse,程序向下执行,DJNZ direct,rel;,(PC) (PC)+3(direct) (direct)-1If (direct)=0, (PC) (PC)+relElse, 程序向下执行,若循环变量为00H,则循环次数为256次,例1: (40H)=01H,(50H)=70H (60H)=15H,以下程序片段的执行结果,DJNZ 40H,LABEL1;DJNZ 50H,LABEL2;DJNZ 60H,LABEL3;,结束循环向下执行,转向LABEL2执行,继续循环,需等上条指令执行完,才执行本指令,各单元内容变为:,(40H)=00H,(50H)=6FH,(60H)=15H,例2:,MOV R2,#8 ;CPL P17 ;DJNZ R2,TOGGLF;,TOGGLF:,循环次数送R2,P17取反,1个机周,R2控制循环,2个机器周期,执行结果:,三、子程序调用及返回指令,1、长调用指令,LCALL addr16 ;,(PC)=(PC)+3(SP)=(SP)+1(SP)=(PC 07)(SP)=(SP)+1(SP)=(PC 815)(PC)=addr 015,64KB范围内子程序调用,例:设(SP)=53H,子程序首址在3000H单元,并以标号STR表示。即 2000H: LCALL STR,执行时: (PC)=(PC)+3=2003H,(SP)+1, (54H)= 03H,(SP)+1,(55H)= 20H,执行结果:,(SP)=(54H)=(55H)=(PC)=,55H,03H,20H,3000H,STR (PC),2、绝对调用指令,ACALL addr11 ;,(PC)=(PC)+2(SP)=(SP)+1(SP)=(PC 07)(SP)=(SP)+1(SP)=(PC 815)(PC 010) addr11(PC 1115)不变,提供2KB范围内的子程序调用,调用范围同AJMP指令,3、返回指令,RET ;,(PC 815) (SP)(SP) (SP)-1(PC 07) (SP)(SP) (SP)-1,例:设(SP)=6BH,内部RAM(6AH)=23H (6BH)=01H,执行 RET,(PC 815) (6BH),(PC 07) (6AH),执行结果: (PC)=0123H(SP)=69H,4、中断返回指令,RETI ;,功能:,A)恢复断点,同RETB)恢复中断逻辑,使CPU能接收同级或低级中断请求,5、空操作指令,NOP ; (PC) (PC)+1,功能:无任何操作,继续执行下一条指令,不影响任何标志,产生一个机器周期的延时,例: 利用NOP指令产生方波,CLR P2.7 ;NOPNOPNOPSETB P2.7 ;,P2.7清0输出,置位P2.7高电平输出,程 序 举 例,103,在3000H为首地址的存储区域中,存放着14个由ASCII码表示的09之间的数。试编写程序,将它们转换成BCD码,并以压缩BCD码的形式,存放在2000H2006H单元。,分析:1、外部RAM数据块操作,14个数 DPTR做源间址寄存器,R0为目标间址寄存器 R3做计数器2、ASCII码转换为压缩BCD码,ASCII,分离BCD码,压缩BCD码,屏蔽高4位,移位、异或,程序,104,MOV DPTR, #3000HMOV R0, #00HMOV R3, #07HMOVX A, DPTRANL A, #0FHMOV R4, AINC DPTRMOVX A, DPTRANL A, #0FHSWAP AXRL A, R4MOV P2, #20HMOVX R0, AMOV P2, #0FFHINC DPTRINC R0DJNZ R3, LOOP,LOOP:,;源数据块首地址;目标数据块首地址;计数器;取低位字节ASCII码;屏蔽高4位,转换为BCD码;暂存;修改地址指针,指向高位字节;取高位字节ASCII码;转换为BCD码;移位到高4位;异或,转换为压缩BCD码;高8位目标地址;存放压缩BCD码到外部RAM;修改源地址指针;修改目标地址;循环,3.3.5 位操作指令,位处理器:,CPU程序存储器数据存储器累加器(C)I/O口,数据RAM可位寻址空间128位SFR的可寻址位82位,位地址表示:bit在汇编语言中有5种表示方法: (以用户标志F0为例),1、位地址 D5H2、字节地址位 D0H53、位寄存器名称 F04、寄存器名位 PSW55、事先用伪指令定义的符号地址 格式: 字符名称 BIT 位地址 AF BIT F0,一、位传送指令,MOV C , bit ; ( C ) (bit)MOV bit , C ; (bit) ( C ),注:位传送必须通过累加器C进行,例:将30H位的内容传送到20H位,MOV C,30HMOV 20H,C,二、位状态控制指令,1、位清零指令 CLR bit ; (bit) 0 CLR C ; (C) 0,2、位求反指令 CPL bit ; (bit) (bit) CPL C ; (C) (C),3、位置位指令 SETB bit ; (bit) 1 SETB C ; (C) 1,例: 设(P1)=00110101 B 执行以下指令: CLR P1.0 ; CPL P1.0 ; SETB P1.6 ;,P1=00110100 B,P1=00110101B,P1=01110101 B,三、位逻辑操作指令,1、位逻辑“与” ANL C,bit ; (C) (C)与(bit) ANL C,/bit ; (C) (C)与(bit),2、位逻辑“或” ORL C,bit ; (C) ()或(bit) ORL C,/bit ; (C) (C)或(bit),例:设E,B,D都代表位地址,试编写程序完成E、B内容的异或操作。即D=EB+EB,程序如下:MOV C,B1ANL C,/EMOV F0,CMOV C,EANL C,/B1ORL C,F0MOV D,C,;C=EB,;暂存 EB,;C=EB,;C=EB+EB,;将运算结果存入D,位操作必须通过位累加器C进行,四、位控制转移指令,1、判C转移 JC rel ; C=1 转移 JNC rel ; C=0 转移,例: 设(C)=0,以下程序段的执行路径是什么,JC L1 CPL C JC L2L1:L2:,;C=0,不转移,顺序执行,;C取反,C=1,;C=1,转向L2执行,2、判位变量转移指令,JB bit ,rel ; (bit)=1 转移JNB bit,rel ; (bit)=0转移,判位变量并清0转移指令JBC bit,rel ;,(PC) (PC)+3IF(bit)=1,Then(PC) (PC)+relAnd (bit)=0,例1:MOV P1,#0CAH MOV A,#56H JB P1.2 , L1 JNB ACC.3 , L2 L1: L2: ,; P1=1100 1010 B,; A=0101 0110 B,; P1.2=0,不转,; ACC.3=0,转L2执行,例2: MOV A , #43H JBC ACC.2 , L1 JBC ACC.6 , L2 L1 : L2 : ,; A=43H= 0100 0011 B,; ACC.2=0,不转移,;ACC.6=1, 转L2执行, 且使ACC.6=0,执行结果: (A)=03H,5.2 汇编语言常用伪指令,一、设置起始地址ORG,格式: ORG nn,操作码助记符,16位二进制数,功能:指定后续源程序经汇编后的目标程序存放的起始地址值。总是出现在每段源程序或数据块的开始,可使程序员将程序、子程序或数据块存放在程序存储器的任何位置。,例: ORG 1000H START: MOV A,#00H,表示由START开始的目标程序从1000H开始存放,一个源程序中,多次设置程序段起始地址,要求定义地址空间从小到大,且不能重叠,如: ORG 3000H MOV A,20H ORG 2700H MOV A,21H ,地址从大到小,错误,再如: ORG 2000H MOV A,20H ORG 2001H MOV A,21H ,地址从小到大,但重叠,所以不正确,若在源程序开始不放ORG指令,则汇编后的目标程序将从0000H单元开始存放,二、定义字节数据伪指令DB或DEFB格式: (标号: ) DB (项或项表),指一个字节、数或以 括起的字符串,功能:将项或项表的数值存入从标号开始的连续单元中,例: HERE: DB 84H DB 43H,;(HERE)=84H;(HERE+1)=43H,例: ORG 1000H SEG:DB 53H,74H,78H,1,2,结果: (1000H)=53H (1001H)=74H (1002H)=78H (1003H)=31H (1004H)=32H,1,2的ASCII码,注: 操作数为字节数据(00HFFH),字节数据串或字符串(长度应限制在80个字节数据内),三、定义字数据伪指令DW或DEFW,格式: (标号: ) DW (项或项表),功能:类似DB指令,区别在于DW定义16位数据(字数据)。在汇编时,按高位字节在高地址单