首页 理论教育 嵌入式系统中的转移指令及范围

嵌入式系统中的转移指令及范围

时间:2023-11-23 理论教育 版权反馈
【摘要】:缺省时为“AL”,即无条件转移。②当转移指令转移到32 MB 地址空间的范围之外时,将产生不可预测的结果。转移指令的范围也是±32 MB。

嵌入式系统中的转移指令及范围

在ARM 中有两种方法可以实现程序的转移:一种是利用传送指令直接向PC 寄存器(R15)中写入转移的目标地址值,通过改变PC 的值实现程序的跳转;另一种是使用专门的转移指令。

ARM 的转移指令可以从当前指令向前或向后的32 MB 的地址空间跳转,根据完成的功能它可以分为四种:①B:转移指令;②BL:带链接的转移指令;③BX:带状态切换的转移指令;④BLX:带链接和状态切换的转移指令。

(1)转移和转移链接指令(B,BL)

转移指令B 在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。 转移和转移链接指令的二进制编码如图3.2 所示。

在一个程序中通常需要转移到子程序,并且当子程序执行完毕时能确保恢复到原来的代码位置。 这就需要将执行转移之前程序计数器PC 的值保存下来,ARM 使用转移链接指令BL 来提供这一功能。 BL 指令完全像转移指令一样地执行转移,同时将转移后面紧接的一条指令的地址保存到链接寄存器LR(r14)。

图3.2 转移和转移链接指令的二进制编码

转移和转移链接指令跳转的目标地址的计算方法是:先对指令中定义的带符号的24 位偏移量用符号扩展为32 位,并将该32 位左移两位形成字的偏移,然后将它加到程序计数器PC 中(相加前程序计数器的内容为转移指令地址加8 字节),即得到跳转的目标地址。 一般情况下汇编器将会计算正确的偏移。

转移指令的范围为:±32 MB。

转移指令的L 位(第24 位)置“1”时,表示是转移链接指令,它在执行跳转的同时,将转移指令后下一条指令的地址传送到当前处理器模式下的链接寄存器LR(r14)。 这一般用于实现子程序调用,返回时只需将链接寄存器LR 的内容拷贝回PC。

两种形式指令都可以条件执行或无条件执行。

1)指令格式

“L”指定转移与链接属性,如果不包含“L”,便产生没有链接的转移。 “ <cond >”是条件执行的助记符扩展。 缺省时为“AL”,即无条件转移。 “ <target address>”一般是汇编代码中的标号,是转移的目标地址。

举例如下:

无条件跳转:

执行10 次循环:

调用子程序:

条件子程序调用:

只有SUB1 不改变条件码,本例才能正确工作,如果BLLT 执行了转移,执行完子程序后,将返回到BLGE;如果条件码被SUB1 改变,SUB2 可能又会被执行

举例如下:

由于返回地址保存在寄存器里,在保存r14 之前子程序不应再调用下一级的嵌套子程序;否则,新的返回地址将覆盖原来的返回地址,就无法返回到原来的调用位置。 这时,一般是将r14 压入存储器中的堆栈。 由于子程序经常还需要一些工作寄存器,所以可以使用多寄存器存储指令同时将这些寄存器中原有的数据一起存储。(www.xing528.com)

不调用其他子程序的子程序(叶子程序)不需要存储r14,因为它不会被覆盖。

2)注意事项

①在上面第一个例子中,对于其他的RISC 处理器,可能将采用的延迟转移模式,即在转移到标号label 之前会执行转移指令之后的指令。 但是,在ARM 中将不会出现这种情况,因为ARM 不使用转移延迟的机制。

②当转移指令转移到32 MB 地址空间的范围之外时,将产生不可预测的结果。

(2)转移交换和转移链接交换(BX、BLX)

这些指令用于支持Thumb(16 位)指令集的ARM 芯片,程序可以通过这些指令完成处理器从ARM 状态到Thumb 状态的切换,如图3.3 所示。 类似的Thumb 指令可以使处理器切换回32 位ARM 指令。

图3.3 转移交换(带链接选项)指令的二进制

在第一种格式中,寄存器Rm 的值是转移目标,Rm 的第0 位拷贝到CPSR 中的T 位(它决定了是切换到Thumb 指令还是继续执行ARM 指令),[31:1]位移入PC;如果Rm[0]是“1”,处理器切换执行Thumb 指令,并在Rm 中的地址处开始执行,但需将最低位清零,使之以半字的边界定位;如果Rm[0]是“0”,处理器继续执行ARM 指令,并在Rm 中的地址处开始执行,但需将Rm[1]清零,使之以字的边界定位。

在第二种格式中,转移指令跳转的目标地址的计算方法是:先对指令中定义的带符号的24 位偏移量用符号扩展为32 位,并将该32 位数左移两位形成字的偏移,然后将它加到程序计数器PC 中(相加前程序计数器的内容为转移指令地址加8 字节),H 位(第24 位)也加到目标地址的第1 位,使得可以为目标指令选择奇数的半字地址,而这目标指令将总是Thumb指令。 一般情况下汇编器将会计算正确的偏移。

转移指令的范围也是±32 MB。

如果在格式(1)中将L 位(第5 位)置位,那么这两种转移指令具有链接的属性(BLX 仅用于v5T 处理器),也将转移指令后下一条指令的地址传送到当前处理器模式的链接寄存器(r14)。 当ARM 指令调用Thumb 子程序时,一般用这种指令来保存返回地址,通过BLX 指令来实现程序调用和程序状态的切换。 如果用BX 作为子程序返回机制,调用程序的指令集状态能连同返回地址一起保存,因此,可使用同样的返回机制从ARM 或Thumb 子程序对称地返回到ARM 或Thumb 的调用程序。

注意:格式(1)指令可以条件或无条件执行,但格式(2)指令是无条件执行。

1)指令格式

“ <target address> ”一般是汇编代码中的一个标号,表示目标地址;汇编器将产生偏移(它将是目标的字地址和转移指令地址加8 的差值)并在适当时设置H 位。

举例如下:

无条件跳转:

调用Thumb 子程序:

2)注意事项

①一些不支持Thumb 指令集的ARM 处理器将捕获这些指令,允许软件仿真Thumb指令。

②BLX <target address> 始终引起处理器切换到Thumb 状态,而且不能转移到当前指令±32 MB 范围之外的地址,它是无条件执行的。

③只有实现v5T ARM 体系结构的处理器支持BLX 指令的任意形式。

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

我要反馈