表 3-6 程序控制指令
1. 程序控制指令的一般性說明
* 程序控制指令又分“無條件轉(zhuǎn)移”、“調(diào)用與返回”和“條件轉(zhuǎn)移”等三類。
* 對(duì)程序控制指令應(yīng)掌握:轉(zhuǎn)移地址如何生成及其轉(zhuǎn)移范圍。
* 注意!MCS-51條件轉(zhuǎn)移指令的運(yùn)用與計(jì)算并無特別的聯(lián)系。
* 位值判別轉(zhuǎn)移使程序設(shè)計(jì)更為靈活,是MCS-51指令系統(tǒng)的特色。
* 應(yīng)特別注意變址轉(zhuǎn)移指令JMP與比較轉(zhuǎn)移指令CJNE的用法。
操作碼 |
操作數(shù) |
條 件 |
轉(zhuǎn) 移 地 址 |
說 明 | ||||
AJMP |
addr11 |
無條件 |
(PC)←(PC)+2 (PC)0-10←addr11 |
短轉(zhuǎn)移,只改變PC的低11位,轉(zhuǎn)移范圍2K。 | ||||
LJMP |
addr16 |
無條件 |
(PC)←addr16 |
長轉(zhuǎn)移,轉(zhuǎn)移范圍全64K空間 | ||||
SJMP |
rel |
無條件 |
(PC)←(PC)+2+rel |
相對(duì)轉(zhuǎn)移 ,范圍-126~+129。 | ||||
JMP |
@A+DPTR |
無條件 |
(PC)←(A)+(DPTR) |
散轉(zhuǎn)指令,根據(jù)A值變址轉(zhuǎn)移 | ||||
ACALL |
addr11 |
無條件 |
(PC)←(PC)+ 2 (PC)L、(PC)H壓棧 (PC)0-10←addr11 |
短調(diào)用,只改變PC的低11位,轉(zhuǎn)移范圍2K。 | ||||
LCALL |
addr16 |
無條件 |
(PC)←(PC)+ 3 (PC)L、(PC)H壓棧 (PC)←addr16 |
長調(diào)用,調(diào)用范圍全64K空間 | ||||
RET |
隱含 ((SP)) |
無條件 |
(PC)H←((SP)) (PC)L←((SP)-1)) |
子程序返回。 | ||||
RETI |
中斷返回。 | |||||||
JZ |
rel |
(A)= 0 |
(PC)←(PC)+2+rel |
根據(jù)A的值條件轉(zhuǎn)移。 | ||||
JNZ |
(A)≠0 | |||||||
JC |
rel |
(C)= 0 |
(PC)←(PC)+2+rel |
根據(jù)C的值條件轉(zhuǎn)移。 | ||||
JNC |
(C)= 1 | |||||||
JNB |
bit, rel |
(bit)=0 |
(PC)←(PC)+3+rel |
位值判別轉(zhuǎn)移。(負(fù)邏輯) | ||||
JB |
(bit)=1 |
位值判別轉(zhuǎn)移。(正邏輯) | ||||||
JBC |
(bit)=1 |
同 JB ,加(bit)清零功能。 | ||||||
DJNZ |
Rn, rel |
(Rn)-1≠0 |
(PC)←(PC)+2+rel |
循環(huán)指令。循環(huán)計(jì)數(shù)器自動(dòng) 減1,歸0則退出循環(huán)。 | ||||
dir, rel |
(dir)-1≠0 |
(PC)←(PC)+3+rel | ||||||
操作碼 |
操作數(shù) |
條 件 |
轉(zhuǎn) 移 地 址 |
說 明 | ||||
CJNE |
A,dir,rel A,#data,rel Rn,#data,rel @Ri,#data,rel |
(A)≠(direct) (A)≠#data (Rn)≠#data ((Ri))≠#data |
(PC)←(PC)+3+rel |
按無符號(hào)數(shù)比較,兩數(shù)不等則轉(zhuǎn)移。若前一數(shù)小,C置1;若前一數(shù)不小于后一數(shù),C清零。 | ||||
NOP |
無 |
無 |
(PC)←(PC)+1 |
空操作,順序執(zhí)行。 | ||||
2. AJMP、LJMP及SJMP的轉(zhuǎn)移范圍
指令 |
轉(zhuǎn)移地址 |
轉(zhuǎn)移范圍 |
說明 |
AJMP addr11 |
(PC)+2的高5位 + addr11 |
(PC)+2所在的2k頁 |
2k頁:X000H~X7FFH X800H~XFFFH |
LJMP addr16 |
addr16 |
全64k空間 |
|
SJMP rel |
(PC)+2+rel |
(PC)-126~(PC)+129 |
Rel是8位有符號(hào)數(shù) |
注:①表中的(PC)是轉(zhuǎn)移指令的地址。
②在實(shí)際使用時(shí),地址一般用標(biāo)號(hào)表示。
3. 變址轉(zhuǎn)移指令JMP的使用
* JMP的轉(zhuǎn)移地址 = 基址(DPTR)+變址偏移量(A)。
* 應(yīng)用例:按照(A)= 0,1,2,分別轉(zhuǎn)向三個(gè)不同的程序分支。
MOV DPTR,#GO ;設(shè)立散轉(zhuǎn)入口地址
MOV B A, ;
RL A ; (A) ←(A)+3
ADD A,B ;
JMP @A+DPTR
GO: LJMP GO1 ;指令地址為GO
LJMP GO2 ;指令地址為GO+3
LJMP GO3 ;指令地址為GO+6
* 問題一:上例中,如果由LJMP改用AJMP,程序應(yīng)如何變化?
* 問題二:上例中,如果A的值大于2會(huì)如何?怎樣解決?
4. 條件轉(zhuǎn)移指令的使用
* 因?yàn)锳與C的值并不一定由計(jì)算操作而改變,故JZ、JNZ、JC、JNC等指令的運(yùn)用與計(jì)算并無特別的聯(lián)系,
* 位值判別轉(zhuǎn)移指令使條件轉(zhuǎn)移的功能更豐富和靈活。例如:
* 如果(B)³0,轉(zhuǎn)向POS分支:JNB B.7,POS
* 如果計(jì)算溢出,轉(zhuǎn)向FL分支: JB OV,F(xiàn)L
* 如果C=1,將C清零并轉(zhuǎn)向NEG分支:JBC C,NEG
* 由P1.4檢測(cè)火災(zāi)傳感器,1有效。傳感器報(bào)警時(shí)轉(zhuǎn)向FIRE分支:JB P1.4,F(xiàn)IRE
5. 比較轉(zhuǎn)移指令CJNE及其使用
* 格式:CJNE 前數(shù),后數(shù),相對(duì)偏移量
轉(zhuǎn)移條件:前數(shù)≠后數(shù)
對(duì)C的影響:按無符號(hào)數(shù)減法。前數(shù)減后數(shù),有借位C = 1,否則C = 0。
* 應(yīng)用例:A、B中為無符號(hào)數(shù),比較兩數(shù),大數(shù)存A,小數(shù)存B。
CJNE A,B,0
JNC DONE
EXC A,B
DONE:……
* 應(yīng)用例:A、B中為有符號(hào)數(shù),比較兩數(shù),大數(shù)存A,小數(shù)存B。
有符號(hào)數(shù)比較的算法:
以A 與B 表示A與B的無符號(hào)值。
對(duì)于A >B 有,若A>0 則A>B,A<0 則A;
據(jù)此可以畫出右邊的流程圖,相應(yīng)的程序如下
CJNE A,B,NEQ
SJMP DONE
NEQ:JNC AGT
XCH A,B
AGT:JNB Acc.7,DONE
XCH A,B
DONE:……