B跳转指令与Ldr指令几点区别
B跳转指令是代码位置无关的,经过汇编后会替换为当前PC值加(减)一个修正值,不管这条指令是在哪一个地址执行,都能跳转到指定的位置。
B只能在当前PC的32M范围内跳转,LDR只能在当前PC的4KB(0xfff范围)跳转。
LDR PC,=xxx指令将向PC直接装载一个标号xxx的值,但标号经过编译后将被替换为一个与RO相对应的值,这样无论指令在何处执行都能跳转到一个指定的位置。
归纳如下:
(1) b step1 :b跳转指令是相对跳转,依赖当前PC的值,偏移量是通过该指令本身的bit[2
3:0]算出来的,这使得使用b指令的程序不依赖于要跳到的代码的位置(位置无关码),只看指令本身。
(2) ldr pc, =step1 :该指令是从内存中的某个位置(step1)读出数据并赋给PC,同样依
赖当前PC的值,但是偏移量是那个位置(step1)的连接地址(运行时的地址),所以可
以用它实现从Flash到RAM的程序跳转。
另一个人的:
今天参看链接方面的知识时,遇到一个编译无关的概念,遂百度之,发现一篇文章不错,转载之,有些地方不懂,待之后再查看~
应用程序必须经过编译、汇编和链接后才变成可执行文件,在链接时,要对所有目标文件进行重定位(relocation),建立符号引用规则,同时为变量、函数等分配运行地址。当程序执行时,系统必须把代码加载到链接时所指定的地址空间,以保证程序在执行过程中对变量、函数等符号的正确引用,使程序正常运行。在具有操作系统的系统中,重定位过程由操作系统自动完成。
如何编写位置无关代码呢?
引用同一位置无关段或相对位置固定的另一位置无关段中的符号时,必须是基于PC的符号引用,即使用相对于当前PC的偏移量来实现跳转或进行常量访问。
1.位置无关的程序跳转。使用相对跳转指令实现程序跳转。指令中所跳转的目标地址用基于当前PC的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可以在任何位置进行跳转,实现位置无关性。
2.位置无关的常量访问。在应用程序中,经常要读写相关寄存器以完成必要的硬件初始化。为增强程序的可读性,利用EQU伪指令对一些常量进行赋值,但在访问过程中,必须实现位置无关性。
3. 使用绝对地址进行跳转,一般是在不同的位置无关代码段之间跳转。
最后,总结一下位置无关代码段的优点:
1.简化设计,方便实现系统的快速引导。位置无关代码可以避免在引导时进行地址映射,并方便地跳转到RAM中实现快速引导
2.实现复位处理智能化。位置无关的代码可以被加载到任意地址空间运行
3.便于调试。Bootloader的调试通常也是一个繁琐的过程,使用位置无关代码,则可以将映像文件加载到RAM中进行调试,这既能真实地反映程序从ROM中 进行系统引导的情况,又可以避免频繁烧写程序存储器。