位置无关代码,即该段代码无论放在内存的哪个地址,都能正确运行。究其原因,是因为代码里
没有使用绝对地址,都是相对地址。
位置无关的写法:
(1) B指令
B指令接受一个相对地址,因此在汇编里用B跳转到一个标号时,实际编译的结果是一个相对跳转。
相对地址有个范围限制,即目标不能太远,一般目标放在同一个文件里是肯定可以的。
_start:
b _reset
_reset:
...
(2) BL
BL用于调用函数,也是一个相对跳转
(3) ADR
获取标号的地址,在编译时会使用PC+偏移的方式得到该位置的地址。例如,当TEXT_BASE是0时
SMRDATA可能被放在0x100的位置,当TEXT_BASE为0x30000000时放在0x30000100的位置。使用ADR
总能获取正确的位置,与程序的加载地址无关。
ADR R0, SMRDATA
SMRDATA:
.word 0x22111120
.word 0x00002F50
.word 0x00000700
(相应的, LDR Rn, =LABEL是位置相关的)
(4) LDR
当加标号时,LDR可以用于伪指令,也可以真指令。
真指令: (标号前不加=号,表示取标号处的值)
LDR R0, SDRDATA
实际被编译为LDR R0, [PC, #NN],其中NN是目标的相对距离
伪指令: (标号前加=号,取标号的地址)
LDR R0, = SDRDATA
实际编译的时候的时候,会在某位置存处SDRDATA的值,然后用一个LDR取出来。
显然,用LDR时,加不加=号有很大区别。
无=号:取该标号处的值,位置无关
有=号:取该标号的地址,位置相关
举例分析
例1:中断向量跳转
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
其中,
ldr pc, _irq,由于没加=号,表示取值_irq处的值放在pc里 (位置无关)
_irq: .word irq ,表示_irq存放的值是irq的绝对地址(位置有关)
关键字:ARM 位置无关 代码
引用地址:
ARM下书写位置无关的代码
推荐阅读最新更新时间:2024-03-16 14:32
arm linux 下中断流程简要分析中断处理流程
三 响应中断 首先在分析源码之前,让我们了解一些原理性的东西, 我们都知道在处理中断要保存当前现场状态,然后才能处理中断,处理完之后还要把现场状态恢复过来才能返回到被中断的地方继续执行,这里要说明的是在指令跳转到中断向量的地方开始执行之前,CPU帮我们做了哪些事情: R14_irq = 要执行的下条指令地址 + 4 //这里的下条指令是相对于被中断指令的下条。即返回地址 SPSR_irq = CPSR //保存的现场状态,r0到r12要由我们软件来保存(如果需要的话)。 CPSR = 0b10010 //进入中断模式 CPSR = 0 //在ARM模式下执行(不是Thumb下) CPSR
[单片机]
基于ARM9的无线多床位心电监护仪的设计
1 引言 随着社会生活节奏加快、人口逐渐老龄化,心血管疾病已经成为同前威胁人类生命的丰要疾病之一,此类疾病往往具有突发性、短暂性和危险性的特点,如果不能及时发现并进行治疗将会产生非常严重的后果。心电图是检查.诊断和预防该类疾病的主要手段和依据,对于心肌梗塞、心律失常等症状,心电监护仪的使用贯穿于治疗、康复的整个过程。由于传统的基于PC机平台的心电躲护仪,价格昂贵,体积庞大,不便于移动且主要集中在大医院,给医生和病人带来了很大的不便。因此,为了降低成本、缩小体积,本文设计了一种基于ARM9微处理器的新型便携式多床位遥测心电监护仪。该监护仪采用Samsung公司的一款以ARM920T为控制器内核的16/32位高速处理器S3C2
[工业控制]
基于ARM的海底大地电磁信号采集系统主控模块改进
摘要:对现有海底大地电磁信号采集系统的主控模块进行了改进。采用AT91m40800为主控单元,通过移植嵌入式实时操作系统μC/OS-II进行任务管理,并扩展了ISA总线、串行接口和网络接口。概要介绍了改进方案的设计思路、μC/OS-II的移植以及ARM对外围器件的扩展,并通过ISA总线仿真了系统时序效果。
关键词:大地电磁 ARM μC/OS-II 动耗
1 海底大地电磁仪的分析
海底大地电磁数据采集器是对海底大地电磁场和海底环境信息进行自动采集的智能化仪器,旨在建立具有我国特色的海底大地电磁探测技术,并使之实用化,为我国海域区域地质调查提供新的技术支撑,为发展我国海洋电磁探测奠定基础。仪器于2000年研制成功后,在我国东
[嵌入式]
基于ARM和Linux交叉开发环境的搭建
摘要:交叉开发环境是嵌入式Linux开发的基础.后续的开发过程几乎都是基于此环境的。而ARM作为一种高性能、低成本的嵌入式RISC微处理器。已成为应用最广泛的嵌入式处理器。本文内容包括基于32位ARM920T核“GEC2410”开发板的硬件结构和嵌入式Linux交叉开发环境的概念和配置.开发工具的使用以及交叉调试器制作的方法。利用虚拟机在Windows操作系统下,为“GEC2410”开发板搭建了一个嵌入式Linux的运行平台。 关键词:交叉开发环境;ARM;Linux 0 引言 目前,随着ARM技术的日益成熟和广泛应用,基于ARM核的微处理器已经成为嵌入式市场的主流。而建立面向ARM构架的嵌入式操作系统也就成为当前研究
[工业控制]
基于ARM的嵌入式操作系统该如何设计
嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。 Linux做嵌入式的优势,首先,Linux是开放源代码;其次,Linux的内核小、效率高,可以定制,其系统内核最小只有约134KB;第三,Linux是免费的OS,Linux还有着嵌入式操作系统所需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台而且性能稳定,裁剪性很好,开发和使用都很容易。同时,Linux内核的结构在网络方面是非常完整的,Linux对网络中最常用的TCP/IP协议有最完备的支持。提供了包括十兆、百兆、千兆的以太网络,以及无线网络,Token Ring(令牌环网)、光纤甚至卫星的支持。
[单片机]
ARM Linux S3C2440 之UART分析
在分析ARM-Linux s3c2440中UART的时有必要先了解 s3c2440A中串口的硬件知识。 硬件篇: S3c2440A串口提供三个独立的异步串行通信I/O端口(asynchronousserial I/O ports)。每一个串口均可以以普通中断方式或者DMA方式进行数据收发。采用系统时钟时,最大速率为115.2kbps.如果采用外部时钟(UEXTCLK),UART速度可以更快。每个串口包含有2个64-byte的FIFO缓存区用来发送或传输数据。S3c2440A 串口具有可编程波特率,红外(IR)收发数据,1或者2 位的停止位(stop),5/6/7/8 位数据宽度和奇偶校验功能(parity checking)。
[单片机]
ST-Ericsson与ARM演示多处理移动平台
2009年2月16日ST-Ericsson在上海宣布,将在巴塞罗那举行的世界移动大会上,演示全球首个支持Symbian OS™(操作系统)的对称式多处理(SMP)移动平台。这项技术突破在移动领域尚属首次,它基于ARM® Cortex™-A9多核处理器,可提供前所未有的性能与功效,与前几代基带/应用处理器架构相较,实现了重大跨越。利用ST-Ericsson的移动平台,Symbian OS将以更高效率运行更多应用,而总功耗更低。
高速互联网接入催生用户对PC般高速的移动终端的需求,这进一步要求计算性能的提升。ST-Ericsson新系列系统级芯片(SoC)支持SMP,可根据性能和功耗要求,将不同进程分配给多个
[网络通信]
以ARM7为核心的嵌入式工控网络设计
0 引言 本文详细介绍了嵌入式系统各个步骤的实现方法及其功能,给出了嵌入式系统的硬件平台,研究基于ARM的μClinux的移植,并介绍了一种嵌入式工控网络系统的具体设计过程。 1 硬件平台的设计 硬件平台的搭建是嵌入式开发平台设计的首要任务,本文采用比较流行的体系结构,并选择S3C44BOX作为嵌入式处理器,然后围绕S3C4 4BOX进行外围器件的选型,设计了系统的硬件总体结构框图,然后以单元电路为基础,介绍了原理图设计的详细过程。 1.1 系统硬件选型 嵌入式系统的核心部件是嵌入式处理器,系统硬件选型首先是选择嵌入式处理器,然后围绕该嵌入式处理器选择各种外围芯片,以实现各种扩展功能。本系统选择三星公司基于ARM7T
[单片机]