表 3-6 程序控制指令
1. 程序控制指令的一般性说明
* 程序控制指令又分“无条件转移”、“调用与返回”和“条件转移”等三类。
* 对程序控制指令应掌握:转移地址如何生成及其转移范围。
* 注意!MCS-51条件转移指令的运用与计算并无特别的联系。
* 位值判别转移使程序设计更为灵活,是MCS-51指令系统的特色。
* 应特别注意变址转移指令JMP与比较转移指令CJNE的用法。
操作码 |
操作数 |
条 件 |
转 移 地 址 |
说 明 | ||||
AJMP |
addr11 |
无条件 |
(PC)←(PC)+2 (PC)0-10←addr11 |
短转移,只改变PC的低11位,转移范围2K。 | ||||
LJMP |
addr16 |
无条件 |
(PC)←addr16 |
长转移,转移范围全64K空间 | ||||
SJMP |
rel |
无条件 |
(PC)←(PC)+2+rel |
相对转移 ,范围-126~+129。 | ||||
JMP |
@A+DPTR |
无条件 |
(PC)←(A)+(DPTR) |
散转指令,根据A值变址转移 | ||||
ACALL |
addr11 |
无条件 |
(PC)←(PC)+ 2 (PC)L、(PC)H压栈 (PC)0-10←addr11 |
短调用,只改变PC的低11位,转移范围2K。 | ||||
LCALL |
addr16 |
无条件 |
(PC)←(PC)+ 3 (PC)L、(PC)H压栈 (PC)←addr16 |
长调用,调用范围全64K空间 | ||||
RET |
隐含 ((SP)) |
无条件 |
(PC)H←((SP)) (PC)L←((SP)-1)) |
子程序返回。 | ||||
RETI |
中断返回。 | |||||||
JZ |
rel |
(A)= 0 |
(PC)←(PC)+2+rel |
根据A的值条件转移。 | ||||
JNZ |
(A)≠0 | |||||||
JC |
rel |
(C)= 0 |
(PC)←(PC)+2+rel |
根据C的值条件转移。 | ||||
JNC |
(C)= 1 | |||||||
JNB |
bit, rel |
(bit)=0 |
(PC)←(PC)+3+rel |
位值判别转移。(负逻辑) | ||||
JB |
(bit)=1 |
位值判别转移。(正逻辑) | ||||||
JBC |
(bit)=1 |
同 JB ,加(bit)清零功能。 | ||||||
DJNZ |
Rn, rel |
(Rn)-1≠0 |
(PC)←(PC)+2+rel |
循环指令。循环计数器自动 减1,归0则退出循环。 | ||||
dir, rel |
(dir)-1≠0 |
(PC)←(PC)+3+rel | ||||||
操作码 |
操作数 |
条 件 |
转 移 地 址 |
说 明 | ||||
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 |
按无符号数比较,两数不等则转移。若前一数小,C置1;若前一数不小于后一数,C清零。 | ||||
NOP |
无 |
无 |
(PC)←(PC)+1 |
空操作,顺序执行。 | ||||
2. AJMP、LJMP及SJMP的转移范围
指令 |
转移地址 |
转移范围 |
说明 |
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位有符号数 |
注:①表中的(PC)是转移指令的地址。
②在实际使用时,地址一般用标号表示。
3. 变址转移指令JMP的使用
* JMP的转移地址 = 基址(DPTR)+变址偏移量(A)。
* 应用例:按照(A)= 0,1,2,分别转向三个不同的程序分支。
MOV DPTR,#GO ;设立散转入口地址
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,程序应如何变化?
* 问题二:上例中,如果A的值大于2会如何?怎样解决?
4. 条件转移指令的使用
* 因为A与C的值并不一定由计算操作而改变,故JZ、JNZ、JC、JNC等指令的运用与计算并无特别的联系,
* 位值判别转移指令使条件转移的功能更丰富和灵活。例如:
* 如果(B)³0,转向POS分支:JNB B.7,POS
* 如果计算溢出,转向FL分支: JB OV,FL
* 如果C=1,将C清零并转向NEG分支:JBC C,NEG
* 由P1.4检测火灾传感器,1有效。传感器报警时转向FIRE分支:JB P1.4,FIRE
5. 比较转移指令CJNE及其使用
* 格式:CJNE 前数,后数,相对偏移量
转移条件:前数≠后数
对C的影响:按无符号数减法。前数减后数,有借位C = 1,否则C = 0。
* 应用例:A、B中为无符号数,比较两数,大数存A,小数存B。
CJNE A,B,0
JNC DONE
EXC A,B
DONE:……
* 应用例:A、B中为有符号数,比较两数,大数存A,小数存B。
有符号数比较的算法:
以A 与B 表示A与B的无符号值。
对于A >B 有,若A>0 则A>B,A<0 则A;
据此可以画出右边的流程图,相应的程序如下
CJNE A,B,NEQ
SJMP DONE
NEQ:JNC AGT
XCH A,B
AGT:JNB Acc.7,DONE
XCH A,B
DONE:……