一般情况下指令是顺序执行的逐条执行的,但实际上程序不可能全部顺序执行而经常需要改变程序的执行流程,常用的控制转移指令有: 本文来自www.eadianqi.com 1. 无条件转移指令 本文来自www.eadianqi.com 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 本文来自www.eadianqi.com LJMP addr16 ; addr16→(PC) 本文来自www.eadianqi.com AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0) 本文来自www.eadianqi.com
SJMP rel ;(PC)+ 2 + rel→(PC) 自动控制网www.eadianqi.com版权所有 JMP @A+DPTR ;(A)+(DPTR)→(PC) 自动控制网www.eadianqi.com版权所有 2. 条件转移指令 本文来自www.eadianqi.com
条件转移指令是依某种特定条件转移的指令。条件满足时转移(相当于一条相对转移指令),条件不满足时则顺序执行下面的指令。目的地址在下一条指令的起始地址为中心的256个字节范围中(-128~+127)。当条件满足时,先把PC指向指向下一条指令的第一个字节地址,再把有符号的相对偏移量加到PC上,计算出转向地址。 自动控制网www.eadianqi.com版权所有 JZ rel ; A=0,(PC)+ 2 + rel→(PC) 自动控制网www.eadianqi.com版权所有 JNZ rel ; A≠0,(PC)+ 2 + rel→(PC) 本文来自www.eadianqi.com 3. 比较不相等转移指令 本文来自www.eadianqi.com 这组指令的功能是比较前面两个操作数的大小。如果它们的值不相等则转移。在PC指向下一条指令的起始地址后,通过把指令最后一个字节的有符号的相对偏移量加到PC上,并计算出转向地址。操作数有寄存器寻址、直接寻址,寄存器间接寻址和立即寻址等方式。 本文来自www.eadianqi.com CJNE A, direct, rel ; A≠(direct),(PC)+ 3 + rel→(PC) 自动控制网www.eadianqi.com版权所有 CJNE A, #data, rel ; A≠data,(PC)+ 3 + rel→(PC) 自动控制网www.eadianqi.com版权所有 CJNE Ri, #data, rel ; A≠data,(PC)+ 3 + rel→(PC) 本文来自www.eadianqi.com
CJNE @Rj, #data, rel ; A≠data,(PC)+ 3 + rel→(PC) 本文来自www.eadianqi.com 4. 减1不为0转移指令 自动控制网www.eadianqi.com版权所有 这组指令把源操作数减1,结果回送到源操作数中去,如果结果不为0则转移,跳到标号rel处执行,等于0就执行下一条指令。源操作数有寄存器寻址和直接寻址方式。该指令通常用于实现循环计数。 本文来自www.eadianqi.com DJNZ Ri, rel ;(Ri)-1→(Ri),(Ri)≠0,(PC)+ 2 + rel→(PC) 本文来自www.eadianqi.com
DJNZ direct, rel ;(direct)-1→(direct),(direct)≠0,(PC)+ 2 + rel→(PC) 自动控制网www.eadianqi.com版权所有 5. 子程序返回指令 自动控制网www.eadianqi.com版权所有 编程时一般都把需要反复执行的一些程序编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 自动控制网www.eadianqi.com版权所有 LCALL addr16 ;长调用指令,可在64kB空间调用子程序。此时(PC)+ 3→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr16→(PC),即分别从堆栈中弹出调用子程序时压入的返回地址。 自动控制网www.eadianqi.com版权所有 ACALL addr11 ;绝对调用指令,可在2kB空间调用子程序,此时(PC)+ 2→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr11→(PC10-0)。 自动控制网www.eadianqi.com版权所有
RET ; 子程序返回指令。此时(SP)→(PC15-8),(SP)- 1→(SP),(SP)→(PC7-0),(SP)- 1→(SP)RET指令通常安排在子程序的末尾,使程序能从子程序返回到主程序。 本文来自www.eadianqi.com
RETI ; 中断返回指令,除具有RET功能外,还具有恢复中断逻辑的功能,需注意的是,RETI指令不能用RET代替 。 本文来自www.eadianqi.com
空操作也是CPU控制指令,它没有使程序转移的功能,一般用于软件延时。指令为:NOP。 本文来自www.eadianqi.com
|