bl和ldr用作跳转指令的区别

原创 2013年12月01日 20:55:12

bl指令经过汇编编译器编译后形成的指令码表示:新的pc值为,从当前pc值开始(即pc+8),跳过offset* 4个字节位置。下面看反汇编:


当前pc值为:bldisable_watch_dog经过编译后机器码为0xeb000005,即offset为5条指令,偏移字节数为5*4=20=0x14。当前pc值为0x30000000+8=0x30000008。则指令执行后的pc值为:0x30000008+0x14=0x3000001c,即为disable_watch_dog标号的地址。

因此,bl和b指令被称为位置无关指令。在编码时要生成位置无关指令有两点要注意:

1.       跳转使用bl和b指令;2.C语言中不用全局变量和静态变量。

 

下面再看ldr用作跳转指令。ldr指令经过编译后指令码表示:新的pc值为一个固定地址的值,即ldr也叫做位置相关跳转。

继续看上面这段反汇编,ldr指令编译后机器码表示:新的pc值被临时存储在当前pc加上144字节位置处(0x300000a4)。当前pc值为0x3000000c+8=0x30000014,然后0x30000014+144=0x300000a4,跟反汇编中注释吻合。


再看0x300000a4地址处存放值为0x30000010,即on_sdram标号的地址。

相关文章推荐

bl 和 ldr跳转程序的区别

首先说明 BL main 为相对跳转指令,与位置无关代码。 LDR PC,=main 为绝对跳转指令,与位置有关代码。 可能看到这的人都有疑问,如下图。链接地址为0x50000000。 两...

ARM的B,BL跳转指令

B跳转指令:它是个相对跳转指令,其机器码格式如下: [31:28]位是条件码;[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令;[23...

ARM平台下ldr和bl跳转的区别

主要就是: bl一般是地址无关的跳转,最简单理解就是跳转函数也是在4K片内RAM里的。这个不管你编译时候它存放的位置,函数间的相互的位置关系是不会变的,函数间是一个确定的相对位置关系。跳转的实现是通...
  • marc07
  • marc07
  • 2017年03月17日 12:42
  • 326

ARM平台下bl和ldr指令的区别

学linux驱动,断断续续已经有个把月了,但一直停留在跟着视频模仿的阶段,不知其所然更不知其所以然。就决定,按照玩单片的方式,先去玩玩裸机的程序开发,把自己做的电路板小模块测试下(本来想在linux系...

b MAIN 和 ldr pc,=MAIN 的区别(谈到代码位置无关性)

看bootloader的时候经常看到这两种写法,不太明白区别,网上查了查。其实看了之后还是一头雾水? 其中,2和3 似乎是一个东西,但结果是相反的。晕。 //===============...

浅析跳转指令B和 ldr pc =label的不同

今天看了一个小程序,学习了下ARM 在裸机下的开发。学习了写东西,整理下作为笔记,程序名为link.s。 .text.global _start.start:                     ...

关于BL跳转指令只能在正负32MB范围内的解释

关于BL跳转指令只能在正负32MB范围内的解释:(说法见杜春雷第三章P59) BL指令在编码的时候,有24位用于表示相对地址的,(BL跳转的范围有限,这也是ldr给pc赋值跳转的区别),其中...

汇编跳转指令B、BL、BX、BLX 和 BXJ的区别

跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转: (1) 使用专门的跳转指令。 (2) 直接向程序计数器 PC 写入跳转地址值。 通过向程序计数器 PC 写...
  • bytxl
  • bytxl
  • 2015年11月17日 09:27
  • 4768

bl跳转指令使用错误导致编译出现错误--relocation truncated to fit: R_ARM_PC24 init_irq

bl 跳转指令只能在+/- 32MB内跳转:
  • ychongx
  • ychongx
  • 2014年04月29日 18:49
  • 542

thumb长跳转指令(BL)机器码详解

最近因为工作的原因,经常接触到长跳转指令,但是总是弄不明白,跳转的目标地址怎么得来的 经过多方面的资料查找,和自己的反复推算,现在总算弄明白了 先上例子: 下面是几个实际遇到的机器码机器对应的反汇编 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bl和ldr用作跳转指令的区别
举报原因:
原因补充:

(最多只允许输入30个字)