控制轉移指令
控制轉移類指令
計算機運行過程中,有時因為操作的需要,程序不能按順序逐條執(zhí)行指令,需要改變程序運行方向,即將程序跳轉到某個指定的地址再順序執(zhí)行下去。
控制轉移類指令的功能就是根據(jù)要求修改程序計數(shù)器PC的內(nèi)容,以改變程序運行方向,實現(xiàn)轉移。
控制轉移類指令可分為:無條件轉移、條件轉移、絕對轉移、相對轉移和調(diào)用、返回指令。下面我們將分類介紹。
1.無條件轉移指令(4條)
LJMP add16 ;add16→PC,無條件跳轉到add16地址,可在64KB范圍內(nèi)
轉移,稱為長轉移指令
AJMP add11 ;add11→PC,無條件轉向add11地址,在2KB范圍內(nèi)轉移
SJMP rel ;PC+2+rel→PC,相對轉移,rel是偏移量,8 位有符號
數(shù),范圍-128~127,即可向后跳轉128,向前可跳轉127
JMP @A+DPTR ;A+DPTR→PC ,屬散轉指令,無條件轉向A與DPTR內(nèi)容相
加后形成的新地址
例1 執(zhí)行指令
LJMP 9100H
不管這條指令存放在哪里,執(zhí)行時將使程序轉移到9100H,和AJMP,SJMP指令是有差別的。
例2 程序
2000H MOV R0 , #10H ;10H→PC
2002H SJMP 03H ;PC+2+rel=2002H+2+03H=2007H→PC
┇ ┇
2006H ┇
2007H ┇
從說明中可見,執(zhí)行SJMP 03H 指令后,馬上跳轉到2007H地址執(zhí)行程序。
2.條件轉移指令(8條)
條件轉移指令是根據(jù)某種特定條件轉移的指令。條件滿足時轉移,條件不滿足時則順序
執(zhí)行下面的指令。
JZ rel ;A=0轉向PC+2+rel→PC,A≠0順序執(zhí)行
JNZ rel ;A≠轉向PC+2+rel→PC ,A=0順序執(zhí)行
CJNE A, direct, rel ;A≠ (direct)轉向PC+3+rel→PC且當A>(direct),Cy=0
;當A<(direct),Cy=1
;否則A=(direct),PC+3→PC即順序執(zhí)行
CJNE A, #data, rel ;A data P轉向PC+3+rel→PC且當A >data,Cy=0
;當A <data,Cy=1,
;A=data,PC+3→PC順序執(zhí)行
CJNZ Rn, #data, rel ;Rn≠data轉向PC+3+rel→PC
;且當Rn>data,Cy=0,當Rn<data,Cy=1
;Rn=data,PC+3→PC順序執(zhí)行
CJNE @Ri,#data, rel ;(Ri) ≠data ,PC+3+rel→PC
;且當(Ri)>data ,Cy=0,當(Ri)<data,Cy=1
;(Ri)=data, PC+3→PC順序執(zhí)行
DJNZ Rn, rel ;Rn-1→Rn ,Rn ≠0轉向PC+2+rel→PC
;Rn=0,PC+2→PC順序執(zhí)行
DJNZ direct, rel ;(direct)-1→(direct),(direct) ≠0轉向 PC+2+rel
→PC
;(direct)=0 ,PC+2→PC順序執(zhí)行
注意:
1)CJNE類指令借用進位標志Cy作為比較結果的標志位。從指令中可知,目的操作數(shù)內(nèi)容小于原操作數(shù)內(nèi)容Cy置1,反之Cy清0,該類指令多用于分支程序。
2) DJNZ指令執(zhí)行時Rn或direct先減1,然后再判斷Rn或direct內(nèi)容是否等于0。不為0則轉,為0順序執(zhí)行。DJNZ用在循環(huán)程序中,控制循環(huán)次數(shù)很方便。
3) JZ和JNZ的操作數(shù)只有一個,是對A的內(nèi)容的進行判斷的指令。
例1 以下程序的循環(huán)次數(shù)是多少,最后(R0)=?
MOV R0 , #0
LL: ┇
DJNZ R0 , LL
分析:由于DJNZ是減1再判斷大小的,因為R0=0,所以第一次執(zhí)行DJNZ R0 , LL后R0=FFH=255,則程序要執(zhí)行的次數(shù)為256次,R0最后的值為0。
解:程序要循環(huán)的次數(shù)為256次,最后R0=0
3.調(diào)用、返回、控操作指令
在程序設計中,常常要把具有一定功能的公用程序編制成子程序。當主程序轉至子
程序時用調(diào)用指令,而在子程序的最后安排一條返回指令,使執(zhí)行完子程序后再返回到主程序。
(1) LCALL addr16 ;調(diào)用入口地址為addr16的子程序
這是一條長調(diào)指令,可調(diào)用64KB范圍內(nèi)的子程序,因此,可放在程序的任何位置。
指令的執(zhí)行過程分兩步:第一步把斷點(當前執(zhí)行指令的下一條指令地址)壓入堆棧。第二步將調(diào)用的子程序的入口地址裝入PC。即addr16(16位地址)→PC,轉向執(zhí)行子程序。
(2) ACALL addr11 ;子程序入口地址為addr11的子程序
這是一條短調(diào)指令,只能實現(xiàn)2KB范圍內(nèi)的子程序的調(diào)用。其指令執(zhí)行過程與LCALL
指令一樣。但是需要注意的是:ACALL中addr11只占用PC的PC.0~PC.10位。
(3) RET ;放在子程序最后,使程序準確返回到主程序斷點處
執(zhí)行過程為:(SP)→PC.8~PC.15斷點地址高字節(jié)送入PC
SP-1→SP,(SP) →PC.0~PC.7斷點低字節(jié)送入PC,
這時PC中為主程序斷點地址,程序準確返回到調(diào)用指令的下一條。
例 設SP=62H,(62H)=07H,(61H)=30H,執(zhí)行指令RET
結果:SP=60H,(PC)=0730H,CPU從0730H開始執(zhí)行程序。
(4) RETI ;中斷返回指令
該指令用于中斷服務程序,使中斷程序結束后準確返回到主程序斷點處,執(zhí)行過程同RET,它還能清除優(yōu)先級狀態(tài)。
(5) NOP ;空操作
執(zhí)行該指令時,CPU只進行取指令、譯碼,而不進行任何操作,故稱為控操作。常用于產(chǎn)生一個機器周期延時。
編輯:admin 最后修改時間:2018-05-19