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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章