1、五、累加器移位指令五、累加器移位指令D0D1D2D3D4D5D6D71 1、循环左移、循环左移 RL A01100101假设假设:(A)=0A6H,:(A)=0A6H,则在执行指令则在执行指令“RL A”“RL A”后后,(A)=4DH(A)=4DH执行前执行前(A):(A):10110010执行后执行后(A):(A):2D0D1D2D3D4D5D6D72 2、循环右移、循环右移 RR A01100101假设假设:(A)=0A6H,:(A)=0A6H,则在执行指令则在执行指令“RR A”“RR A”后后,(A)=53H执行前执行前(A):(A):11001010执行后执行后(A):(A):33
2、、带进位循环左移带进位循环左移RLC A例例:假设假设(A)=0A6H,(CY)=0;(A)=0A6H,(CY)=0;则在执行指令则在执行指令“RLC “RLC A”A”后后(A)=_,(CY)=_(A)=_,(CY)=_执行前执行前:CYD7 D6 D5 D4 D3 D2 D1 D0010100110101001100执行后执行后:44、带进位位循环右移带进位位循环右移RRC A例例:假设假设(A)=0A6H,(CY)=0;(A)=0A6H,(CY)=0;则在执行指令则在执行指令“RRC A”“RRC A”后后(A)=_,(CY)=_(A)=_,(CY)=_执行前执行前:CY D7 D6 D
3、5 D4 D3 D2 D1 D0010100110110010100执行后执行后:5综合例 把R2R3中的16位补码数(高位在R2中)右移一位,并不改变符号。MOV A,R2MOV C,ACC7;把符号位存入进位位CRRC AMOV R2,AMOV A,R3RRC AMOV R3,ASJMP 62、绝对转移指令绝对转移指令AJMP addrll;addrll一PC0-10说明:转移范围 本指令为2K地址范围内的转移指令。对转移目的地址的要求与ACALL指令中对于程序入口地址的要求相同。机器码形式 本指令为2字节指令。设addrll的各位是a10a9a8a7a6a5a4a3a2a1a0,则指令A
4、JMP addrll的二进制机器码为al0a9a800001a7a6a5a4a3a2ala0。8例:例:4002H AJMP MM 4600H MM:MOV A,#00H 注意:目标语句必须和当前语句同页。在注意:目标语句必须和当前语句同页。在5151单片机中,单片机中,64KB64KB程序存储器分成程序存储器分成3232页,每页,每页页2KB(7FFH)2KB(7FFH)。比如比如:0000H07FFH 0800H0FFFH 1000H17FFH 1800H1FFFH9例:绝对转移指令AJMP在程序存储器中的首地址为2500H,要求转移到2250H地址处执行程序,试确定能否使用AJMP指令实
5、现转移?如能实现,其指令的机器码形式是什么?解:因为AJMP指令的首址为2500H,其下一条指令的首址为2502H,由表21可见,2502H与转移目的地址2250H在同一2K地址范围内,故可用AJMP指令实现程序的转移。指令的机器码:0100000l01010000B4150H 103、短跳转指令短跳转指令 SJMP rel;PC十十2十十rel-PC说明:本指令为一页地址范围内的相对转移指令。说明:本指令为一页地址范围内的相对转移指令。因为肥因为肥l为为l字节补码字节补码(偏移量偏移量),且,且SJMP rel 指令为指令为2字节指令,所以转移范围为一字节指令,所以转移范围为一126D一十一
6、十129D。例:例:4060H SJMP LOOP 4090H LOOP:MOV A,#0FFH v注意:短跳转的目标语句地址必须在当前语句向注意:短跳转的目标语句地址必须在当前语句向前前128128(80H80H)字节,向后)字节,向后127127(7FH7FH)字节,否则在)字节,否则在进行程序编译时肯定出错。进行程序编译时肯定出错。114、变址寻址转移指令变址寻址转移指令 JMP A十十DPTR;A十十DPTR-PC例例1 A02H,DPTR2000H,指令,指令JMP A十十DPTR执行后,执行后,PC2002H。也就是说,程序转移到。也就是说,程序转移到2002H地址单元去执行。地址
7、单元去执行。该指令主要用于多分支的跳转程序设计。跳转的目该指令主要用于多分支的跳转程序设计。跳转的目标地址是累加器标地址是累加器A A和数据指针和数据指针DPTRDPTR之和,它可以是之和,它可以是64KB64KB存储空间的任何地方。存储空间的任何地方。程序设计举例:如果程序设计举例:如果(A)=00H,(A)=00H,执行执行SSSS子程序;如果子程序;如果(A)=01H(A)=01H,执行,执行MMMM子程序;如果子程序;如果(A)=02H(A)=02H,执行,执行XXXX子程子程序。序。124090H LOOP:MOV A,#0FFH注意:短跳转的目标语句地址必须在当前语句向前128(8
8、0H)字节,向后127(7FH)字节,否则在进行程序编译时肯定出错。转移类指令包含有条件转移和无条件转移两种5006H LCALL XX该指令主要用于多分支的跳转程序设计。注意:目标语句的地址是相对地址,应该在当前语句向前不超过128字节,向后不超过127字节.(dir)o,程序顺序执行程序设计举例:说明:CJNE指令都是3字节指令。因为肥l为l字节补码(偏移量),且SJMP rel 指令为2字节指令,所以转移范围为一126D一十129D。四、累加器清0和取反指令5000H LCALL SS取反:01110110=76H把符号位存入进位位CRRC AMOV R2,AMOV A,R3RRC AM
9、OV R3,ASJMP MOV R2,A例:绝对转移指令AJMP在程序存储器中的首地址为2500H,要求转移到2250H地址处执行程序,试确定能否使用AJMP指令实现转移?如能实现,其指令的机器码形式是什么?ORG 4000H MOV DPTR,#5000H MOV R2,A CLR C RLC A ADD A,R2 JMP A+DPTR ORG 5000H5000H LCALL SS5003H LCALL MM5006H LCALL XX 13二、条件转移指令组二、条件转移指令组所谓条件转移,指指令中规定的条件满足时,程序跳所谓条件转移,指指令中规定的条件满足时,程序跳转到目标地址。转到目标
10、地址。1 1、累加器判零转移指令、累加器判零转移指令JZJZ 目标地址目标地址(rel);(rel);如如(A)=0,(A)=0,跳到目标语句跳到目标语句 ;如如(A)0,(A)0,顺序执行下顺序执行下 ;一条指令一条指令JNZ JNZ 目标地址目标地址(rel);(rel);如如(A)0,(A)0,跳到目标语句跳到目标语句 ;如如(A)=0,(A)=0,顺序执行下一条顺序执行下一条 ;指令指令v注意注意:目标语句的地址是相对地址目标语句的地址是相对地址,应该在当前语句向应该在当前语句向前不超过前不超过128128字节字节,向后不超过向后不超过127127字节字节.14程序举例程序举例:MOV
11、 A,#10H JZ OUT MOV R2,#30H OUT:RLC A 152 2、数值比较转移指令、数值比较转移指令程序举例:如果程序举例:如果(A)=00H,(A)=00H,执行执行SSSS子程序;如子程序;如果果(A)=10H(A)=10H,执行,执行MMMM子程序;如果子程序;如果(A)=20H(A)=20H,执行,执行XXXX子程序。子程序。16CJNE A,#00H,SSCJNE A,#10H,MMCJNE A,#20H,XXSS:MM:XX:17说明:CJNE指令都是3字节指令。若第一操作数大于或等于第二操作数,则影响标志C0(如指令CJNE A,dir,rel中A=(dir)
12、等);若第一操作数小于第二操作数,则Cl(如指令CJNE A,dir,rel中A(d5r)等。利用对C的判断,可使这几条指令实现两操作数相等与否的判断,还可完成两数大小的比较。例1 R756H,指令CJNE R7,#34H,十08H执行后,程序转移到放本条CJNE指令的首地址()加08H后的地址单元去执行。183、减减1 1条件转移指令组条件转移指令组DJNZ Rn,rel;;Rn一一1-Rn,Rn o,则转移,则转移(PC十十2十十re-PC);Rn0,程序顺序执行,程序顺序执行DJNZ dir,rel;(dir)一一l-dir,(dir)0则转移则转移(PC十十3十十rel-PC);(di
13、r)o,程序顺序执行,程序顺序执行程序设计举例:程序设计举例:将内部将内部RAMRAM中中30H30H3FH3FH的数依次送到的数依次送到70H7FH 单元中。单元中。19 ORG0000H MOV R0,#30H ;数据源首地址数据源首地址 MOV R1,#70H ;数据存放目标首地址数据存放目标首地址 MOV R2,#10H ;数据个数数据个数LOOP:MOV A,R0 MOV R1,A INC R0 INC R1 DJNZ R2,LOOP SJMP$END 说明:DJNZ Rn,rel是2字节指令,而DJNz dir,rel是3字节指令,所以在满足转移的条件后,前者是PC十2十rel一P
14、C,而后者是PC十3十rel一PC。20三、子程序调用和返回指令三、子程序调用和返回指令子程序调用指令子程序调用指令、长调用指令、长调用指令 LCALL addrl6;addrl6一一PCo-l5说明:本指令为说明:本指令为64K程序存储器空间中的全程序存储器空间中的全范围子程序调用指令,子程序入口地址可在范围子程序调用指令,子程序入口地址可在64K地址空间中的任一处。本指令为地址空间中的任一处。本指令为3字节指字节指令。令。例:例:LCALL DELAY ;调用调用DELAY 子程序子程序v目标子程序的地址可以是目标子程序的地址可以是64K64K存储器空间存储器空间的任何地方。的任何地方。21 23四、空操作指令四、空操作指令指令格式指令格式 NOPv指令作用:计算机执行这条指令时,只是消耗指令作用:计算机执行这条指令时,只是消耗1 1个机器周期的时间。个机器周期的时间。3 3、子程序返回指令、子程序返回指令 RET ;子程序调用返回子程序调用返回4 4、中断服务子程序返回指令、中断服务子程序返回指令 RETI ;中断服务子程序返回中断服务子程序返回 24