正確區分LJMP、AJMP、SJMP、JMP跳轉指令
正確區分LJMP、AJMP、SJMP、JMP指令
MCS-51的控制轉移類指令,共17條,分為無條件轉移指令、條件轉移指令、子程式呼叫和返回指令、空操作指令等四類。
無條件轉移指令(共4條)
LJMP addr16 ; PC〈—— addr16
AJMP addr11 ; PC〈—— PC+2 , PC10-0〈—— addr11
SJMP rel ; PC〈—— PC+2 , PC 〈—— PC+rel
JMP @A+DPTR ; PC〈—— A+DPTR
第一條指令稱為長轉移指令(Long Jump);
第二條指令叫作絕對轉移指令(Absolute Jump);
第三條指令稱作短轉移指令(Short Jump);
第四條指令是變址定址轉移指令(散轉指令)。
顯然,每條指令均以改變程式計數器PC(Program Counter)中的內容為宗旨。
(1)長轉移指令(64KB範圍內轉移指令)
長轉移指令的功能是:把指令碼中的目標地址addr16裝入程式計數器PC,使機器執行下一條指令時無條件轉移到addr16處執行程式,不影響任何標誌。由於addr16是一個16位二進位制地址(地址範圍為0000H—FFFFH),因此長轉移指令一條可以在64KB範圍內轉移的指令。為了使程式設計方便易編,addr16常採用標號地址(如:LOOP、LOOP1、MAIN、START、DONE、NEXT1……)表示,只有在上機執行前才被彙編(或代真)為16位二進位制地址。
長轉移指令為三位元組,雙週期指令。
上機試試吧!很直觀的! For Example: LJMP F886H
注意:
在下載的這個8051DEBUG軟體中,不支援標號,且程式狀態字PSW(Program State Word)中的D0位,即奇偶標誌位P,與正確的正好相反,這一點是錯誤的,用的時候留意一下。
只要記好:累加器ACC中1的個數為奇數,則P=1;否則P=0。
(2)絕對轉移指令(2KB範圍內的轉移指令)
絕對轉移指令是一條雙位元組雙週期指令,11位地址addr11(a10—a0)在指令中的分佈是:
a10 a9 a8 0 0 0 1|a7 a6 a5 a4 a3 a2 a1 a0,其中,00001B是操作碼。在程式設計中,11位地址也可以用符號表示,但在上機執行前必須按照上述指令格式加以代真。
絕對轉移指令執行時分為兩步:
第一步是取指令操作,程式計數器PC中內容被加1兩次;
第二步是把PC加2後的高5為地址PC15—PC11和指令程式碼中低11位構成目標轉移地址:PC15—PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
其中,a10—a0的地址範圍是全“0”——全“1”。因此,絕對轉移指令可以在2KB範圍內向前或向後跳轉。
如果把微控制器64KB定址區分成32頁(每頁2KB),則PC15—PC11(00000B—11111B)稱為頁面地址(即:0頁—31頁),a10—a0稱為頁內地址,但應注意:AJMP指令的目標轉移地址不是和AJMP指令地址在同一個2KB區域,而是應和AJMP指令取出後的PC地址(即:PC+2)在同一個2KB區域。例如:若AJMP指令地址為2FFEH,則PC+2=3000H,故目標轉移地址必在3000H—37FFH這2KB區域中。
例如:MGH2001:AJMP addr11,
其中,MGH2001為AJMP addr11指令的標號地址,由該指令在程式儲存器中的位置確定,addr11為11位地址,試分析該指令執行後的情況以及指令碼的確定方法。
解:設MGH2001=3100H,addr11=10110100101B,則根據上述指令碼格式可得絕對轉移指令的格式碼為:1 0 1| 0 0 0 0 1|1 0 1 0 0 1 0 1|(a10 a9 a8|操作碼|a7—a0|)
即:A1A5H。該指令執行後:
PC15——PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
PC= 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 B =35A5H
即:程式轉移到35A5H處執行。
(3)短轉移指令(-126—+129範圍內的轉移指令)
短轉移指令的功能是先使程式計數器PC加1兩次(即:取出指令碼),然後把加2後的地址和rel相加作為目標轉移地址。因此,短轉移指令是一條相對轉移指令,是一條雙位元組雙週期指令,指令碼格式為:80H rel(操作碼 地址偏移量),這裡,80H是SJMP指令的操作碼;rel是地址偏移量,在程式中也常採用符號地址,上機執行前才被代真成二進位制形式。
遇到具體問題時,頭腦中一定要清楚一個關係式:目標轉移地址=源地址+2+rel
(4)變址定址轉移指令(只能在256個儲存器單元內轉移)
這是一條單位元組雙週期無條件轉移指令。
在指令執行之前,使用者應預先把目標轉移地址的基地址送入DPTR,目標轉移地址對基地址的偏移量放在累加器A中。在指令執行時,MCS-51微控制器把DPTR中基地址和累加器A中地址偏移量相加,以形成目標轉移地址送入程式計數器PC中。
通常,DPTR中基地址是一個確定的值,常常是一張轉移指令表的起始地址,累加器A中之值為表的偏移量地址,機器通過變址定址轉移指令便可實現程式的分支轉移
跳轉的範圍不一樣,可以說是到達的遠近距離不一樣。儲存空間佔用不一樣。
AJMP 的範圍是11位地址,也就是2K的空間內,佔用儲存空間2個位元組,執行週期24個時鐘週期。
LJMP 的範圍是16位地址,也就是64K的空間內,佔用儲存空間3個位元組,執行週期24個時鐘週期。
SJMP 的範圍是8位地址,也就是256BIT的空間內,佔用儲存空間2個位元組,執行週期24個時鐘週期。
JMP一般配合DPTR使用,儲存空間1個位元組,執行週期24個時鐘週期。一般用於多分枝選擇的時候使用,比如按鍵處理。
ACALL,LCALL和以上說明類似,是呼叫指令,ACALL佔用儲存空間2個位元組,執行週期24個時鐘週期。LCALL佔用儲存空間3個位元組,執行週期24個時鐘週期。
相關文章
- 操作符offset 和 jmp指令
- 學 Win32 彙編[28] - 跳轉指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等Win32JS
- 彙編跳轉指令
- 64位下JMP遠跳地址的計算方法
- 如何正確區分人工智慧介面和聊天機器人?人工智慧機器人
- 轉:正確使用rman crosscheckROS
- AI 玩跳一跳的正確姿勢,跳一跳 Auto-Jump 演算法詳解AI演算法
- 正確理解Hibernate Inverse (轉)
- 正確安裝VMWARE TOOLS(轉)
- 使用正確的工具(轉載)
- AI 玩微信跳一跳的正確姿勢——跳一跳 Auto-Jump 演算法詳解AI演算法
- 玩轉 Ceph 的正確姿勢
- 正確理解 PHP 錯誤資訊(轉)PHP
- 如何區分router.push跳轉快應用的來源渠道
- 處理日期和時區轉換:為什麼正確的 UTC 轉換很重要
- 區塊鏈的正確開啟姿勢區塊鏈
- ETL、ELT區別以及如何正確運用
- 【轉】C#中dynamic的正確用法C#
- 如何區分資料和指令
- Gridview分頁,清空,跳轉到View
- 你的專案應該如何正確分層?
- MPLS標籤分發協議正確方式——Vecloud協議Cloud
- 彙編debug程式跳轉指令的方法
- 開發一個好專案:二、actvity簡便跳轉,建立選單按鈕,正確使用fr
- Java 正確的做字串編碼轉換Java字串編碼
- “Linux”正確讀音及音標(轉)Linux
- 正確理解專案交付成果(Deliverable)(轉)
- Linux攻略:正確安裝VMWARE TOOLS(轉)Linux
- 正確的燒錄紅旗LinuxISO(轉)Linux
- Linux下正確安裝 VMWARE TOOLS(轉)Linux
- 最新跳轉App Store評分的方法APP
- 如何正確看待區塊鏈 區塊鏈搭建開發公司哪家好區塊鏈
- ToString()字串轉換你用正確了嗎?字串
- JAVA中如何正確的用String轉DateJava
- 百分百正確設定CSS斷點的方法CSS斷點
- 如何寫出正確的二分法以及分析
- Go 中數字轉換字串的正確姿勢Go字串
- 專案實施中如何正確理解“ERP”(轉)