51单片机控制转移指令的一些理解

2019-04-15 18:12发布

        控制转移指令的功能是改变指令的执行顺序,转到指令的指示的新的PC地址执行。         MCS-51单片机的控制转移指令有以下几钟类型:
  • 无条件转移:无需判断,执行该指令就转移到目的地址。
  • 条件转移:需判断标志位是否满足条件,若满足条件,则转移到目的地址,否则顺序执行。
  • 绝对转移:转移的目的地址用绝对地址指示,通常为无条件转移。
  • 相对转移:转移的目的地址用相对于当前PC的偏差(偏移量)指示,通常为条件转移。
  • 长转移或是长调用:目的地址距当前PC64KB地址范围内。
  • 短转移或是短调用:目的地址距当前PC2KB地址范围内。
        以上指令共有14条,做项目时需要根据机器码反汇编,有几条指令困扰了我蛮久,特别说下,需要注意下:         1.长调用        LCALL    addr16;addr16->PC0~15         该指令的机器码为3字节   12 addr16 。(addr16的范围为0x0000~0xFFFF,addr16为2字节的无符号数         该指令为64KB地址范围内的调用子程序指令,子程序可以在64KB地址空间的任意一处。         2.短调用        ACALL    addr11;addr11->PC0~10         该指令的机器码为2字节,假设addr11的各位是a10a9a8...a0,则ACALL指令的机器码为a10a9a810001a7a6a5a4a3a2a1a0,所以在反汇编时,第一个字节的机器码为11,31,51,71,91,B1,D1,F1均为ACALL。         addr11->PC0~10,而PC11~15保持原值不变。         该指令为2KB地址范围的调用子程序指令,子程序入口地址距当前PC不得超过2KB的地址范围。         3.无条件短转移指令        AJMP    addr11;addr11->PC0~10         该指令的机器码为2字节,假设addr11的各位是a10a9a8...a0,则ACALL指令的机器码a10a9a800001a7a6a5a4a3a2a1a0,所以在反汇编时,第一个字节的机器码为01,21,41,61,81,A1,C1,E1均为AJMP。         4.无条件相对转移        SJMP rel;PC+rel->PC         即as+2+rel->PC,as为源地址(该指令的首地址),该指令为两个字节的指令,执行该指令时的当前PC=as+2,rel为转移的偏移量,转移可以向前转(目的地址小于源地址),也可以向后转,因此偏移量rel是1字节的有符号数,用补码表示(-128~+127),所以指令转移方位在离源地址as的-126~+129字节之间。机器码为80 rel。   在其他条件转移指令中,也有出现rel,所以需要特别注意,特别是写程序时,我当时是假设机器码字节类型为unsigned char,结果碰到rel时就出问题了,正确的使用是将rel转换为有符号数(char)rel。
(以上大部分内容摘自《单片机原理、接口及应用——嵌入式系统技术基础(第2版)》,清华大学出版社)