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标号的地址。

汇编指令b 和 bl

b用于不返回的跳转,比如跳到某个标号处,b  .  其中的‘.’代表当前地址,那么 b  .  就是死循环。 bl用于子程序跳转,要返回地址,返回地址存于LR中。...
  • u012088914
  • u012088914
  • 2016年02月19日 11:25
  • 1640

汇编中标号的使用

其实标号就代表一个地址,在这个地址上存储着数据,可以是指令或是其他的地址。 比如说_start:b reset,就是在_start这个地址上存储着b reset这条指令。而这个地址是由编译器指定的。...
  • bingchentiao
  • bingchentiao
  • 2013年08月21日 12:00
  • 735

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

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

ARM汇编中B跳转指令和LDR跳转的区别 【转】

B跳转指令是代码位置无关的,经过汇编后会替换为当前PC值加(减)一个修正值,不管这条指令是在哪一个地址执行,都能跳转到指定的位置。 B只能在当前PC的32M范围内跳转,LDR只能在当前PC的4KB(...
  • yaomoon
  • yaomoon
  • 2014年04月16日 18:25
  • 812

bl 和 ldr跳转程序的区别

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

LDR指令

LDR指令的格式:  LDR{条件}   目的寄存器     作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。 LDR指令的寻址方式比较灵活,实例如下: ...
  • tanyouliang
  • tanyouliang
  • 2011年09月11日 10:26
  • 51660

说说ARM汇编的LDR伪指令

我们知道ARM CPU中有一条被广泛使用的指令LDR,它主要是用来从存储器(确切地说是地址空间)中装载数据到通用寄存器。但不论是ARMASM还是GNU ARM AS,都提供了一条与之同名的伪指令LDR...
  • axx1611
  • axx1611
  • 2008年04月27日 17:20
  • 21208

ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM

汇编指令:LDR、LDRB、LDRH、STR、STRB、STRH
  • u013477200
  • u013477200
  • 2016年02月23日 15:30
  • 17444

LDR指令详解

ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。 (1)LDR   r0,=name,像这种带等号的是伪指令,而不是ARM指令,LDR 伪指令用于加载立即数或一个地址值到指定寄...
  • w282529350
  • w282529350
  • 2013年04月09日 14:48
  • 768

关于LDR指令的理解

之前在阅读arm的汇编代码时,碰到了adr指令,查arm的指令手册,只说该指令是采用相对地址的,但这个相对地址应该怎么理解,却没有具体说明。之后在网上以adr指令为关键字进行搜索,也没有找到进一步的知...
  • zzsfqiuyigui
  • zzsfqiuyigui
  • 2013年08月11日 18:12
  • 2824
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bl和ldr用作跳转指令的区别
举报原因:
原因补充:

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