×
嵌入式 > 技术百科 > 详情

ARM当中一种位置无关代码的分析

发布时间:2022-11-28 发布时间:
|

PIC是一种在ARM当中的位置无关码。位置无关码的意义,是代码放在存储器的无论哪个位置中都能使得程序正常执行,位置无关代码的相对地址没有变化,就不会影响程序的运行。在ARM中,PIC就是这样一种位置无关代码。本文就将针对PIC进行分析,帮助刚入门的朋友进行深入了解。

PIC的特点

它被加载到任意地址空间都可以正确的执行。其原理是PIC对常量和函数入口地址的操作都是基于PC+偏移量的寻址方式。即使程序被移动,但是PC也变化了,而偏移量是不变的,所以程序仍然可以找到正确的入口地址或者常量。

加载域:是代码存放的地址。

运行域:是代码运行时的地址。

链接地址:运行时,程序应该位于的地址。

在一些场合,一些代码并不在储存这部分代码的地址上执行,比如说,放在norflash中的代码可能最终是放在RAM中运行,那么在norflash中的地址就是加载域,而在RAM中的地址就是运行域。

在汇编代码中开发者常常会看到一些跳转指令,比如说b、bl(是位置无关的指令)等这些指令后面是一个相对地址而不是绝对地址,比如说bmain,这个指令应该怎么理解?main这里究竟是一个什么东西?

这时候就需要涉及到链接地址的概念了,链接地址实际上就是链接器对代码中的变量名、函数名等东西进行一个地址的编排,赋予这些抽象的东西一个地址,然后在程序中访问这些变量名、函数名就是在访问一些地址。一般所说的链接地址都是指链接这些代码的起始地址,代码必须放在这个地址开始的地方才可以正常运行,否则的话当代码去访问、执行某个变量名、函数名对应地址上的代码时就会找不到,接着程序无疑就是跑飞。

但是上面说的那个bmain的情形有点特殊,b、bl等跳转指令并不是一个绝对跳转指令,而是一个相对跳转指令,什么意思呢?就是说,这个main标签最后得到的只并不是main被链接器编排后的绝对地址,而是main的绝对地址减去当前的这个指令的绝对地址所得到的值,也就是说b、bl访问到的是一个相对地址,不是绝对地址,因此,包括这个语句和main在内的代码段无论是否放在它的运行域它都能正常运行。这就是所谓的位置无关代码。

所以在一些需要通过ARM来实现位置相关代码的设计,并不建议使用位置无关代码来进行书写。在代码中如果需要实现位置相光,那么开发者就不能够只用绝对寻址指令,反之就是和位置相关的代码有关了。希望大家在阅读过本文之后能够有所收获。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题