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

        控制转移指令的功能是改变指令的执行顺序,转到指令的指示的新的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版)》,清华大学出版社)

发布了25 篇原创文章 · 获赞 15 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章