2025年ldr 指令(ldr指令属于)

ldr 指令(ldr指令属于)位置无关码 即该段代码无论放在内存的哪个地址 都能正确运行 究其原因 是因为代码里没有使用绝对地址 都是相对地址 位置相关码 即它的地址与代码处于的位置相关 是绝对地址 BL 带链接分支跳转指令 也是位置无关码 相对位置 用于调用函数用的 B 分支跳转指令 指目标不能太远 一般用于同一个文件下的目标地址跳转 LDR 通常都是作加载指令的 但是它也可以作伪指令

大家好,我是讯享网,很高兴认识大家。



位置无关码

即该段代码无论放在内存的哪个地址,都能正确运行。究其原因,是因为代码里没有使用绝对地址,都是相对地址。 

位置相关码

即它的地址与代码处于的位置相关,是绝对地址

BL :带链接分支跳转指令,也是位置无关码(相对位置),用于调用函数用的。

B:分支跳转指令,指目标不能太远,一般用于同一个文件下的目标地址跳转。

LDR:通常都是作加载指令的,但是它也可以作伪指令,通常有两种不同的表示: 

1)LDR pc, =MyHandleIRQ 表示将MyHandleIRQ地址放入pc寄存器中,相当于PC=MyHandleIRQ 。

例如:

1. LDR r0,=label    //用于加载立即数或一个地址值到指定寄存器中

              //如果label是立即数: LDR r0,=0X123 ;将0X123存入r0中

              //如果name是个标识符: LDR r0,=label_1 ;将label_1所指向的地址值存入r0中

2)LDR PC,MyHandleIRQ 表示将 MyHandleIRQ地址中的值放入pc寄存器中,类似于C语言中的指针形式,相当于PC=(MyHandleIRQ )。

例如:


讯享网

实例:

链接脚本如下,链接地址在0X:

反汇编如下:

反汇编中可以看出当执行ldr pc, =on_sdram 时的反汇编是 ldr pc, [pc, #12] ; 相当于pc=(pc+12)=,此时的*(pc+12)是指的pc+12地址所指的地址,所以无论pc怎么变都是指的这个常量来执行on_sdram,属于绝对转移

 执行  bl  disable_watch_dog  时,地址0X跳转到0X.这里的0X是通过机器码算出来的,机器码格式如下图所示:

其中[31:28]位是条件码;[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令;[23:0]表示偏移地址。

从反汇编中可以看到 bl  disable_watch_dog  的机器码是eb00000a ,二进制为1110 1011 000000000000000000001010

其中1110表示无条件执行,接下的1011就是BL指令,如L==0则就表示B指令,剩下的Offset就是链接位。

BL指令的跳转地址计算:

1.如上图所示,先将24位Offset补码左移两位,得到000000000000000000001010 00 =0X28

2.由于ARM流水线,当前PC永远等于PC+8,所以PC=PC+0X28+8=0X+0X28+8=0X。

若这里的PC值为其它值,算出来的转移地址也会随之改变,所以BL指令为地址无关码,跳转地址与位置无关。

 注:ARM9是3级流水线,也就是PC处理时正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出,如下图所示,PC总是指向第3条指令取值的地方。

小讯
上一篇 2025-06-15 15:17
下一篇 2025-05-12 14:41

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/201740.html