ARM中跳转的三种方法

  1. 使用跳转指令b,bl,bx等

    使用这一系列指令的优点是执行速度快,只需要一个指令周期即可完成跳转。但该系列指令有一个明显的缺点,那就是他们都不能实现任意地址的跳转。但该系列指令有一个明显的缺点,那就是他们都不能实现对任意地址的跳转。比如程序在地址0x0处运行了跳转指令,但是该指令不能跳转到0xc0000000,原因是ARM指令等宽特性决定。ARM指令集是32位等长的,所以,所有指令(包括指令的参数在内)都必须在4字节的范围内完成。这样,当一条指令需要附带一个立即数或一个地址值作为参数时,该立即数或地址值作为参数时,该立即数或地址值必然要小于32位,事实上,跳转指令b所能跳转的最大范围是当前指令地址前后的32M,b指令构成31~28位是条件码,27~25是101,24是是否链接标志,23~0是跳转你地址

2.使用内存装载指令

    使用内存装载指令,将存储在内存的某一地址转载到程序计数器PC中(PC计数器,告诉CPU该取得下一条指令的地址,CPU  每执行一条指令,PC自动加1(加一个字节)),例如,若我们将跳转的目的地址存储在高于当前地址24字节处,就可以使用"ldr pc,[pc,#24]"这条指令实现跳转。当然,在实际编码中,我们并不一定要亲自做这种偏移量的计算,而可以采用ldr伪指令来实现,这样,编译器会根据情况将该指令展开成b或者ldr指令。ldr指令能够实现任意地址的跳转,但因为需要读写存储器,所以在执行速度上与b指令相比就稍逊一筹了

    这里补充一下ldr伪指令的用法,LDR{cond}{.w} Rt, =label_expr/=expr

                            cond是一个可选的条件码

                            .W是可选的指令宽度说明符

                            Rt是要加载的加载的寄存器

                            expr是一个数字表达式

                            label_expr是一个以标号加上或减去一个数字值形式出现的PC相对或外部地址表达式相当于LDR Rt,[PC,#offset_to_litpool]

3.使用mov指令来跳转

        MOV指令是最简单的移动指令,几乎所有的处理器都包含这条指令。通过mov指令将已经保存到某一寄存器中的地址值直接赋予给程序计数器PC,也可以实现程序跳转。使用该方法仍然需要额外的指令或别的手段,将跳转地址预先保存到寄存器中,因此这种方法多用在函数返回时的跳转中


猜你喜欢

转载自blog.csdn.net/weixin_42135997/article/details/80589575