您当前的位置:五五电子网电子知识单片机-工控设备源码-程序控制转移类指令 正文
控制转移类指令

控制转移类指令

点击数:7611 次   录入时间:03-04 11:36:20   整理:http://www.55dianzi.com   源码-程序

     1.长转移指令
  560
  这条指令执行时,把转移的目的地址,即指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向addr16指定的目的地址。目的地址可以是64KB程序存储器地址空间的任何位置。
  
  2.相对转移指令
  561
  这是无条件转移指令,其中rel为相对偏移量。前面已介绍过,rel是一个单字节的带符号8位二进制补码数,因此它所能实现的程序转移是双向的。rel如为正,则向地址增大的方向转移;rel如为负,则向地址减小的方向转移。执行该指令时,在PC加2(本指令为2B)之后,把指令的有符号的偏移量rel加到PC上,并计算出目的地址,因此跳转的目的地址可以在与这条指令相邻的下一条指令首地址的前128B到后127B(-128B~+127B)之间。
  
  用户在编写程序时,只需在相对转移指令中直接写上要转向的目的地址标号就可以了,相对偏移量由汇编程序自动计算。例如:562

      程序在汇编时,转移到LOOP处的偏移量由汇编程序自动计算和填入。
  
  3.绝对转移指令
  563
  AJMP指令提供了11位地址去替换PC的低11位指令,形成新的PC值,即为转移的目的地址。AJMP指令为双字节,格式如下:
  564
  指令提供了11位地址A10~A0(即addrll),其中A10~A8位于第1字节的高3位,A7~A0在第2字节,而指令的操作码只占第1字节的低5位。AJMP指令的功能是构造转移的目的地址,来实现程序的转移。构造转移目的地址的方法是:执行本指令,先将PC加2(本指令为2个字节,即PC指向AJMP下条指令的首地址),然后把指令中的11位无符号整数地址addrll(AlO~AO)送入PC.10~PC.O,PC. 15~PC.11保持不变,这样就形成新的16位的PC值,即转移的目的地址。
  
  使用AJMP指令需要注意的是,即转移的目标地址必须与AJMP指令的下一条指令首地址的高5位地址码A15~All相同,否则将引起混乱。所以,本指令是2KB范围内的无条件跳转指令。
  
  本指令是为了能与MCS-48的JMP指令兼容而设置的。
  
  4.间接跳转指令
  570
  这是一条单字节的转移指令,转移的目的地址由A中8位无符号数与DPTR的16位无符号数内容之和来确定。该指令以DPTR内容作为基址,A的内容作为变址。因此,只要DPTR的值固定,而给A赋予不同的值,即可实现程序的多分支转移。
  
  本指令不改变累加器A和数据指针DPTR的内容,也不影响标志位。
  
  5.条件转移指令
  
  条件转移指令就是程序的转移是有条件的。执行条件转移指令时,如指令中规定的条件满足,则进行转移;条件不满足,则顺序执行下一条指令。转移的目的地址在以下一条指令首地址为中心的256B范围内(-128B~+127B)。当条件满足时,PC装入下一条指令的第一个字节地址,再把带符号的相对偏移量rel加到PC上,计算出要转向的目的地址。
  571
  6.比较不相等转移指令
  572
  这组指令的功能是比较前面两个操作数的大小,如果它们的值不相等则转移,在PC加到下一条指令的起始地址后,把指令最后一个字节的带符号的相对偏移量加到PC上,并计算出转向的目的地址。如果第一操作数(无符号整数)小于第二操作数(无符号整数),则进位标志位Cy置1,否则Cy清O。该指令的执行不影响任何一个操作数的内容。
  
  7.减1不为0转移指令
  
  这是一组把减1与条件转移两种功能结合在一起的指令。共有两条指令:
  573
  这组指令将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中。如果结果不为O则转移。本指令允许程序员把寄存器Rn或direct单元用作程序循环计数器。
  
  这两条指令主要用于控制程序循环。如预先把寄存器Rn或内部RAM的direct单元装入循环次数,则利用本指令,以减1后是否为O作为转移条件,即可实现按次数控制循环。
  
  8.调用子程序指令
  
  (1)长调用指令
  574
  LCALL指令可以调用64KB范围内程序存储器中的任何一个子程序。指令执行时,先把程序计数器加3获得下一条指令的地址(也就是断点地址),并把它压入堆栈(先低位字节,后高位字节),同时把堆栈指针加2。接着把指令的第二和第三字节(A15~A8,A7~AO)分别装入PC的高位和低位字节中,然后从PC指定的地址开始执行程序。
  
  本指令执行后不影响任何标志位。
  
  (2)绝对调用指令
  580
  这条指令与AJMP指令类似,是为了与MCS-48中的CALL指令兼容而设置的。指令的执行不影响标志位。本指令的格式如下:
  581
  这是2KB范围内的调用子程序的指令。执行时先把PC加2(本指令为2字节),获得下一条指令的首地址,把该地址压人堆栈中保护,即栈指针SP加l,PCL进栈,SP再加1,PCH进栈。最后把PC的高5位和指令代码中的11位地址addrll连接获得16位的子程序入口地址,并送入PC,转向执行子程序。所调用的子程序地址必须与ACALL指令下一条指令的16位首地址中的高5位地址相同,否则将引起程序转移混乱。所以,本指令是2KB范围内的子程序调用指令。
  
  9.子程序的返回指令
  582
  执行本指令时:
  583
  这条指令的功能是,从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值处开始继续执行程序。它不影响任何标志位。
  
  10.中断返回指令
  584
  这条指令的功能和RET指令相似,两条指令的不同之处在于该指令清除了在中断响应时被置1的AT89S51内部中断优先级寄存器的中断优先级状态,其他操作均与RET指令相同。
  
  11.空操作指令
  585
  CPU不进行任何实际操作,只消耗一个机器周期的时间,且只执行(PC)+1→PC操作。NOP指令常用于程序中的等待或时间延迟。




本文关键字:暂无联系方式源码-程序单片机-工控设备 - 源码-程序

上一篇:AT89S51指令汇总

《控制转移类指令》相关文章>>>