首页 理论教育 控制转移指令及偏移量计算实例

控制转移指令及偏移量计算实例

时间:2023-10-22 理论教育 版权反馈
【摘要】:图2-26 执行LJMP 0A08H指令时的工作过程示意图2.程序转移指令相对偏移量的计算PC当前值的概念 能够改变PC值的指令是转移指令,如SJMP、AJMP、LJMP。图2-28 相对转移范围说明3.条件转移指令执行条件转移指令时,如指令中规定的条件满足,则进行程序转移,否则程序顺序执行。累加器A判零转移指令 这类指令以累加器A是否为零作为条件来控制程序的转移,共有2条。

控制转移指令及偏移量计算实例

1.引言

(1)无条件转移指令

①短转移类指令:978-7-111-46831-8-Chapter02-107.jpg

978-7-111-46831-8-Chapter02-108.jpg

(2)间接转移指令 JMP@A+DPTR;PC←(A)+(DPTR)

(3)有条件转移指令 见2.5.5节中的3。

(4)子程序调用与返回指令

①长调用指令LCALL addr16。

②短调用指令ACALL addr11。

③调用返回RET。

④中断返回RETI。

(5)空操作指令 NOP是空操作,停一个周期,一般用作短时间的延时。

这里以LJMP为例来讲述的概念。

例如,要使单片机在开机后自动执行监控程序(若监控程序的首地址为0A08H),则可用如下指令:

978-7-111-46831-8-Chapter02-109.jpg

执行LJMP 0A08H指令时的工作过程如图2-26所示。转移指令写在存储单元的前三个单元中,执行该指令后,PC值变为0A08H,之后单片机将从ROM的0A08H单元起执行监控程序。

978-7-111-46831-8-Chapter02-110.jpg

图2-26 执行LJMP 0A08H指令时的工作过程示意图

2.程序转移指令相对偏移量的计算

(1)PC当前值的概念 能够改变PC值的指令是转移指令,如SJMP、AJMP、LJMP。其中,LJMP是长地址无条件转移指令,此指令能使PC值在16位地址范围内无条件跳转;AJMP是无条件绝对地址转移指令,该指令作用时使PC值在11位地址范围内无条件跳转。LJMP后面一般给一个直接地址或地址标志符,这个地址是16位的绝对地址,地址标志符在编译时是要转化为直接地址的。AJMP也是绝对地址,但它只有11位,适用于短距离转移。为什么设置两条指令呢?LJMP转移16位地址必须为3个字节,AJMP可以缩短成两个字节,目的就是为了省一个字节,在单片机中,有时一个字节的资源是非常宝贵的。

SJMP是相对寻址,什么叫相对呢?这就牵涉到一个偏移量的问题。这种指令的功能是使PC值相对PC当前值偏移一个量rel。例如,单片机执行下面指令:

1017H 8030H SJMP 30H

此时,1017H是SJMP这条指令在存储器里的首地址,是程序编译后确定的。SJMP的汇编码是80H,在执行的时候它是以PC的当前值[(1017+2)H]为基础进行偏移。SJMP 30H这条指令是双字节的,故PC当前值为(1017+2)。第一个字节是操作码80H,第二个字节是操作数30H,也就是相对偏移量。所以当CPU取入相对转移指令SJMP 30H后,PC的当前值就应当是1019H。而在执行此指令后,PC值就变为1019H+30H=1049H,即程序跳转到ROM的1049H单元。指令的相对偏移量rel说明如图2-27所示。

总之,记住一句话,CPU执行某一条指令的时候,PC当前值指向CPU要取用的下一条指令在ROM中的地址。

(2)相对偏移量rel的算法 含有相对偏移量的指令一般为双字节指令。那么,rel=转移目标地址-PC当前值,PC当前值=指令在ROM中地址+2字节。

例如:计算以下程序中“SJMP START”指令中的rel,并分析目标地址的转移范围。

978-7-111-46831-8-Chapter02-111.jpg

图2-27 指令的相对转移量rel说明图

a)指令执行前 b)指令执行后的程序转移情况

978-7-111-46831-8-Chapter02-112.jpg

1)计算偏移量rel。跳转的目的是要改变下一条指令的走向。SJMP后面肯定是一个8位的补码二进制数。既然是补码,那就有正负。正数表示正向转移,就是PC值越来越大。补码能表示的最大范围是-128~+127,这也是它所能跳转的范围。此例的具体情况是:

目标转移地址(START)=1000H

PC当前值=1017H+2H=1019H

PC源地址=1017H,即SJMP所在ROM单元地址

所以,rel=1000H-1019H=-19H(=-25D)(www.xing528.com)

以补码表示:rel=[-25D]=E7H

则,SJMP START中的rel汇编成实际偏移量时为E7H。

2)分析。相对转移指令的有效跳转范围为-126~+129D,其理由如下:

补码的范围是-128~+127D,但相对转移时的起始地址PC当前值=相对转移指令首地址+2字节。所以最后的实际有效转移范围(相对源地址)变为:(-128+2)~(+127+2)即,-126D~+129D。相对转移范围说明如图2-28所示。

978-7-111-46831-8-Chapter02-113.jpg

图2-28 相对转移范围说明

3.条件转移指令

执行条件转移指令时,如指令中规定的条件满足,则进行程序转移,否则程序顺序执行。

(1)比较条件转移指令 比较条件转移指令将两个操作数进行比较,比较结果作为条件来控制程序的转移。是MCS-51指令系统中仅有的4条三操作数指令。

978-7-111-46831-8-Chapter02-114.jpg

其特点:

①相比较的两个操作数不相等时程序跳转。

②偏移量rel=目标地址-PC当前值。

③比较转移指令为3字节指令,PC当前值=PC+3。

④两个操作数比较后不改变操作数单元内容,但将影响Cy(相当于减法情况)。

第一操作数≥第二操作数时Cy=0;第一操作数<第二操作数时Cy=1。

由以上特点可以看出,比较转移指令的功能表现为程序转移和数值比较。

(2)累加器A判零转移指令 这类指令以累加器A是否为零作为条件来控制程序的转移,共有2条。

978-7-111-46831-8-Chapter02-115.jpg

例如:片外RAM中DATA1为始地址的数据块以零为结束标志,试编程将之送到以DATA2为始地址的内部RAM区,(设DATA1在0000H—00FFH范围内)。

相应程序为:

978-7-111-46831-8-Chapter02-116.jpg

计算相对转移偏移量rel说明如图2-29所示,CPU取JZ DONE相对转移指令后的PC当前值=1101H+2=1103H,其转移目标地址=1108H,所以此指令的操作数DONE=rel=目标地址-PC当前值=1108H-1103H=05H。同理:SJMP$指令的rel=目标地址-PC当前值=1108H-110AH=0FEH。

978-7-111-46831-8-Chapter02-117.jpg

图2-29 计算相对转移偏移量rel说明图

(3)减1条件转移指令

这类指令将减1与条件转移结合在一起,主要用来实现控制程序循环,把减1后结果是否为0作为条件来控制程序的转移,即实现按次数控制程序循环。共有2条指令。

978-7-111-46831-8-Chapter02-118.jpg

4.间接转移指令

978-7-111-46831-8-Chapter02-119.jpg

例如:根据R1中的数值执行相应的子程序。

978-7-111-46831-8-Chapter02-120.jpg

执行过程:第一句“MOV DPTR,#TAB”执行完之后,DPTR中的值就是TAB;假设R1=2(R1中的值可以是通过键盘输入的值),则执行完第二条指令后,A=2;第三条、第四条指令是将A中的值乘以2,即A=4;执行“JMP@A+DPTR”时,根据DPTR=TAB,得A+DPTR=TAB+4,因此执行此句程序后,PC指向TAB+4这个地址继续执行,TAB+4是AJMP S2的首地址,之后程序将跳到S2处执行相应的子程序段。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈