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

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

阅读更多
个人分类: GNU
上一篇u-boot向kernel传递参数
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭