单片机中级教程 第3章 指令系统

前两条指令的功能分别是将累加器A的内容循环左移或右移一位;执行后不影响PSW中的标志位;后两条指令的功能分别是将累加器A的内容带进位位CY一起循环左移或右移一位;执行后影响PSW中的进位位CY和奇偶标志位P。 以上移位指令,可用图形表示,如图3-6 所示。

RR A

RR A

RLC A

RRC A

图3-6 移位指令示意图

例3-18 设(A)=08H,试分析下面程序执行结果。 (1) RL A ;A的内容左移一位,结果 (A)=10H RL A ;A的内容左移一位,结果 (A)=20H RL A ;A的内容左移一位,结果 (A)=40H 即左移一位,相当于原数乘2(原数小于80H时)。 (2) RR A ;A的内容右移一位,结果 (A)=04H RR A ;A的内容右移一位,结果 (A)=02H RR A ;A的内容右移一位,结果 (A)=01H 即右移一位,相当于原数除2(原数为偶数时)。

3.6 控制转移类指令

通常情况下,程序的执行是按顺序进行的,这是由PC自动加1实现的。有时因任务要求,需要改变程序的执行顺序,这时就需要改变程序计数器PC中的内容,这种情况称作程序转移。控制转移类指令都能改变程序计数器PC的内容。

MCS-51系列单片机有比较丰富的控制转移指令,包括无条件转移指令、条件转移指令和子程序调用及返回指令。这类指令一般不影响标志位。

3.6.1 无条件转移指令

MCS-51系列单片机有四条无条件转移指令,提供了不同的转移范围和方式,可使程序无条件地转到指令所提供的地址上去。

1.长转移指令

LJMP addr16 ;PC ← addr16

17

该指令在操作数位置上提供了16位目的地址addr16,其功能是把指令中给出的16位目的地址addr16送入程序计数器PC,使程序无条件转移到addr16处执行。16位地址可以寻址64KB,所以用这条指令可转移到64KB程序存储器的任何位置,故称为“长转移”。 长转移指令是三字节指令,依次是操作码、高8位地址、低8位地址。 2.绝对转移指令

AJMP addr11 ;PC ←(PC) + 2, PC10~0 ←addr11

这是一条二字节指令,其指令格式为:

a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 指令中提供了11位目的地址,其中 a7~a0 在第二字节,a10~a8 则占据第一字节的高3位,而00001是这条指令特有的操作码,占据第一字节的低5位。 绝对转移指令的执行分为两步:

第一步,取指令。此时PC自身加2指向下一条指令的起始地址(称为PC当前值)。 第二步,用指令中给出的11位地址替换PC当前值的低11位,PC高5位保持不变,形成新的PC地址——即转移的目的地址。

11位地址的范围为00000000000~11111111111,即可转移的范围是2KB。转移可以向前也可以向后,如图3-7 所示。但要注意转移到的位置是要与PC+2的地址在同一个2K区域,而不一定与AJMP指令的地址在同一个2K区域。例如AJMP指令地址为1FFFH,加2以后为2001H,因此可以转移的区域为2000H~27FFH的区域。

图 3-7 AJMP指令转移范围

例3-19 分析下面绝对转移指令的执行情况。 1234H:AJMP 0781H 解:在指令执行前,(PC)=1234H;取出该指令后,(PC)+2 形成PC当前值,它等于1236H,指令执行过程就是用指令给出的11位地址1 1 1 1 0 0 0 0 0 0 1B替换PC当前值的低

11位。即:新的PC值为1781H,所以指令执行结果就是转移到1781H处执行程序。

应注意:只有转移的目的地址在2K范围之内时,才可使用AJMP指令,超出2K范围,应使用长转移指令LJMP。

3.短转移指令

SJMP rel ;PC ←(PC) + 2, PC ←(PC) + rel

18

SJMP是无条件相对转移指令,该指令为双字节,rel是相对转移的偏移量。指令的执行分两步完成:

第一步,取指令。此时PC自身加2形成PC的当前值。

第二步,将PC当前值与偏移量rel 相加形成转移的目的地址。即:

目的地址=(PC)+2 + rel

rel是一个带符号的相对偏移量,其范围为-128~+127,负数表示向后转移,正数表示向前转移。

这条指令的优点是:指令给出的是相对转移地址,不具体指出地址值。这样,当程序地址发生变化时,只要相对地址不发生变化,该指令就不需要作任何改动。

通常,在用汇编语言编写程序时,在rel位置上直接以符号地址形式给出转移的目的地址,而由汇编程序在汇编过程中自动计算和填入偏移量。省去人工计算偏移量的工作。 4.变址寻址转移指令(又称散转指令、间接转移指令)

JMP @A+DPTR ;PC ←(A)+(DPTR)

指令采用的是变址寻址方式,该指令的功能是把累加器A中的8位无符号数与基址寄存器DPTR中的16位地址相加,所得的和作为目的地址送入PC。指令执行后不改变A和DPTR中的内容,也不影响任何标志位。

这条指令的特点是转移地址可以在程序运行中加以改变。例如,在DPTR中装入多分支转移指令表的首地址,而由累加器A中的内容来动态选择该时刻应转向哪一条分支,实现由一条指令完成多分支转移的功能。

例3-20 设累加器A中存有用户从键盘输入的键值0~3,键处理程序分别存放在

KPRG0、KPRG1、KPRG2、KPRG3处,试编写程序,根据用户输入的键值,转入相应的键处理程序。

解: MOV A ,#JPTAB ;转移指令表首地址送入DPTR RL A ;键值×2,因AJMP指令占2个字节。 JMP @A+DPTR ;JPTAB+2倍键值,和送PC中,则程序就转移

到表中某一位置去执行指令。

JPTAB:AJMP KPRG0 AJMP KPRG1 AJMP KPRG2 AJMP KPRG3 KPRG0: ┇

KPRG1: ┇ KPRG2: ┇ KPRG3: ┇ 3.6.2 条件转移指令

19

条件转移指令是指当某种条件满足时,转移才进行;而条件不满足时,程序就按顺序往下执行。

条件转移指令的共同特点是:

(1)所有的条件转移指令都属于相对转移指令,转移范围相同,都在以PC当前值为基准的256B范围内(-128~+127); (2)计算转移地址的方法相同,即:转移地址=PC当前值 + rel

条件转移指令有如下指令: 1.累加器判零转移指令

JZ rel ;若(A)=0,则转移,PC ←(PC)+ 2 + rel ;若(A)?0,按顺序执行,PC ←(PC)+ 2 JNZ rel ;若(A)?0,则转移,PC ←(PC )+ 2 + rel ;若(A)=0,按顺序执行,PC ←(PC )+ 2

这是一组以累加器A的内容是否为0作为判断条件的转移指令。JZ指令的功能是:累加器(A)=0则转移,否则就按顺序执行。JNZ指令的操作正好与之相反。

这两条指令都是二字节的相对转移指令,rel为相对转移偏移量。与短转移指令中的rel一样,在编写源程序时,经常用标号来代替,只是在翻译成机器码时,才由汇编程序换算成8位相对地址。

2.比较条件转移指令

比较条件转移指令共有四条,其差别只在于操作数的寻址方式不同。 CJNE A ,# data ,rel ;若(A)=data,则PC←(PC)+3,CY←0 若(A)> data, 则PC←(PC)+3+rel,CY←0 若(A)< data, 则PC←(PC)+3+rel,CY←1 CJNE A ,direct ,rel ;若(A)=(direct), 则PC←(PC)+3 ,CY←0 若(A)>(direct), 则PC←(PC)+3+rel,CY←0 若(A)<(direct), 则PC←(PC)+3+rel,CY←1 CJNE Rn ,#data ,rel ;若(Rn)=data, 则PC←(PC)+3,CY←0 若(Rn)> data, 则PC←(PC)+3+rel,CY←0 若(Rn)< data, 则PC←(PC)+3+rel,CY←1 CJNE @Ri ,#data ,rel ;若((Ri))=data,则PC←(PC)+3,CY←0 若((Ri))> data, 则PC←(PC)+3+rel,CY←0 若((Ri))

该组指令在执行时首先对两个规定的操作数进行比较,然后根据比较的结果来决定是否转移——若两个操作数相等,程序按顺序往下执行;若两个操作数不相等,则进行转移。指令执行时,还要根据两个操作数的大小来设置进位标志CY——若目的操作数大于、等于源操作数,则CY=0;若目的操作数小于源操作数,则CY=1;为进一步的分支创造条件。通常在该组指令之后,选用以CY为条件的转移指令,则可以判别两个数的大小。

在使用CJNE指令时应注意以下几点:

(1) 比较条件转移指令都是三字节指令,因此PC当前值=PC+3(PC是该指令所在地址),转移的目的地址应是PC加3以后再加偏移量rel。

20

联系客服:779662525#qq.com(#替换为@)