|
MCS-51的控制轉(zhuǎn)移類指令,共17條,分為無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、子程序調(diào)用和返回指令、空操作指令等四類。
無條件轉(zhuǎn)移指令(共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
第一條指令稱為長轉(zhuǎn)移指令(Long Jump);
第二條指令叫作絕對轉(zhuǎn)移指令(Absolute Jump);
第三條指令稱作短轉(zhuǎn)移指令(Short Jump);
第四條指令是變址尋址轉(zhuǎn)移指令(散轉(zhuǎn)指令)。
顯然,每條指令均以改變程序計數(shù)器PC(Program Counter)中的內(nèi)容為宗旨。
(1)長轉(zhuǎn)移指令(64KB范圍內(nèi)轉(zhuǎn)移指令)
長轉(zhuǎn)移指令的功能是:把指令碼中的目標(biāo)地址addr16裝入程序計數(shù)器PC,使機器執(zhí)行下一條指令時無條件轉(zhuǎn)移到addr16處執(zhí)行程序,不影響任何標(biāo)志。由于addr16是一個16位二進(jìn)制地址(地址范圍為0000H—FFFFH),因此長轉(zhuǎn)移指令一條可以在64KB范圍內(nèi)轉(zhuǎn)移的指令。為了使程序設(shè)計方便易編,addr16常采用標(biāo)號地址(如:LOOP、LOOP1、MAIN、START、DONE、NEXT1……)表示,只有在上機執(zhí)行前才被匯編(或代真)為16位二進(jìn)制地址。
長轉(zhuǎn)移指令為三字節(jié),雙周期指令。
上機試試吧!很直觀的! For Example: LJMP F886H
注意:
在下載的這個8051DEBUG軟件中,不支持標(biāo)號,且程序狀態(tài)字PSW(Program State Word)中的D0位,即奇偶標(biāo)志位P,與正確的正好相反,這一點是錯誤的,用的時候留意一下。
只要記好:累加器ACC中1的個數(shù)為奇數(shù),則P=1;否則P=0。
(2)絕對轉(zhuǎn)移指令(2KB范圍內(nèi)的轉(zhuǎn)移指令)
絕對轉(zhuǎn)移指令是一條雙字節(jié)雙周期指令,11位地址addr11(a10—a0)在指令中的分布是:
a10 a9 a8 0 0 0 1|a7 a6 a5 a4 a3 a2 a1 a0,其中,00001B是操作碼。在程序設(shè)計中,11位地址也可以用符號表示,但在上機執(zhí)行前必須按照上述指令格式加以代真。
絕對轉(zhuǎn)移指令執(zhí)行時分為兩步:
第一步是取指令操作,程序計數(shù)器PC中內(nèi)容被加1兩次;
第二步是把PC加2后的高5為地址PC15—PC11和指令代碼中低11位構(gòu)成目標(biāo)轉(zhuǎn)移地址:PC15—PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
其中,a10—a0的地址范圍是全“0”——全“1”。因此,絕對轉(zhuǎn)移指令可以在2KB范圍內(nèi)向前或向后跳轉(zhuǎn)。
如果把單片機64KB尋址區(qū)分成32頁(每頁2KB),則PC15—PC11(00000B—11111B)稱為頁面地址(即:0頁—31頁),a10—a0稱為頁內(nèi)地址,但應(yīng)注意:AJMP指令的目標(biāo)轉(zhuǎn)移地址不是和AJMP指令地址在同一個2KB區(qū)域,而是應(yīng)和AJMP指令取出后的PC地址(即:PC+2)在同一個2KB區(qū)域。例如:若AJMP指令地址為2FFEH,則PC+2=3000H,故目標(biāo)轉(zhuǎn)移地址必在3000H—37FFH這2KB區(qū)域中。
例如:MGH2001:AJMP addr11,
其中,MGH2001為AJMP addr11指令的標(biāo)號地址,由該指令在程序存儲器中的位置確定,addr11為11位地址,試分析該指令執(zhí)行后的情況以及指令碼的確定方法。
解:設(shè)MGH2001=3100H,addr11=10110100101B,則根據(jù)上述指令碼格式可得絕對轉(zhuǎn)移指令的格式碼為:1 0 1| 0 0 0 0 1|1 0 1 0 0 1 0 1|(a10 a9 a8|操作碼|a7—a0|)
即:A1A5H。該指令執(zhí)行后:
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
即:程序轉(zhuǎn)移到35A5H處執(zhí)行。
(3)短轉(zhuǎn)移指令(-126—+129范圍內(nèi)的轉(zhuǎn)移指令)
短轉(zhuǎn)移指令的功能是先使程序計數(shù)器PC加1兩次(即:取出指令碼),然后把加2后的地址和rel相加作為目標(biāo)轉(zhuǎn)移地址。因此,短轉(zhuǎn)移指令是一條相對轉(zhuǎn)移指令,是一條雙字節(jié)雙周期指令,指令碼格式為:80H rel(操作碼 地址偏移量),這里,80H是SJMP指令的操作碼;rel是地址偏移量,在程序中也常采用符號地址,上機運行前才被代真成二進(jìn)制形式。
遇到具體問題時,頭腦中一定要清楚一個關(guān)系式:目標(biāo)轉(zhuǎn)移地址=源地址+2+rel
(4)變址尋址轉(zhuǎn)移指令(只能在256個存儲器單元內(nèi)轉(zhuǎn)移)
這是一條單字節(jié)雙周期無條件轉(zhuǎn)移指令。
在指令執(zhí)行之前,用戶應(yīng)預(yù)先把目標(biāo)轉(zhuǎn)移地址的基地址送入DPTR,目標(biāo)轉(zhuǎn)移地址對基地址的偏移量放在累加器A中。在指令執(zhí)行時,MCS-51單片機把DPTR中基地址和累加器A中地址偏移量相加,以形成目標(biāo)轉(zhuǎn)移地址送入程序計數(shù)器PC中。
通常,DPTR中基地址是一個確定的值,常常是一張轉(zhuǎn)移指令表的起始地址,累加器A中之值為表的偏移量地址,機器通過變址尋址轉(zhuǎn)移指令便可實現(xiàn)程序的分支轉(zhuǎn)移跳轉(zhuǎn)的范圍不一樣,可以說是到達(dá)的遠(yuǎn)近距離不一樣。存儲空間占用不一樣。
AJMP 的范圍是11位地址,也就是2K的空間內(nèi),占用存儲空間2個字節(jié),執(zhí)行周期24個時鐘周期。
LJMP 的范圍是16位地址,也就是64K的空間內(nèi),占用存儲空間3個字節(jié),執(zhí)行周期24個時鐘周期。
SJMP 的范圍是8位地址,也就是256BIT的空間內(nèi),占用存儲空間2個字節(jié),執(zhí)行周期24個時鐘周期。
JMP一般配合DPTR使用,存儲空間1個字節(jié),執(zhí)行周期24個時鐘周期。一般用于多分枝選擇的時候使用,比如按鍵處理。
ACALL,LCALL和以上說明類似,是調(diào)用指令,ACALL占用存儲空間2個字節(jié),執(zhí)行周期24個時鐘周期。LCALL占用存儲空間3個字節(jié),執(zhí)行周期24個時鐘周期。
完整的Word格式文檔51黑下載地址:
正確區(qū)分LJMP,AJMP,SJMP,JMP.docx
(17.81 KB, 下載次數(shù): 20)
2018-5-9 10:09 上傳
點擊文件名下載附件
正確區(qū)分LJMP,AJMP,SJMP,JMP 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|