新闻中心

EEPW首页>嵌入式系统>设计应用> ARM处理器的位置无关程序设计

ARM处理器的位置无关程序设计

作者: 时间:2011-09-26 来源:网络 收藏

  上述汇编代码段经编译后的结果为:

  LDR R1, [PC, OFFSET_TO_GPIO_BASE]

  LDR R0, [PC, OFFSET_TO_init_GPDR0]

  STR R0, [R1, #0xc]?

  GPIO_BASE

  DCD 0x40e00000

  GPDR0

  DCD 0x00c

  init_GPDR0

  DCD 0xfffbfe00

  可见,LDR伪指令实际上使用基于PC的偏移量来对符号常量GPIO_BASE和init_GPDR0进行引用,因而是的。由此可以得出如下结论:使用LDR伪指令将一个常量读取到非PC的其他通用寄存器中可实现的常量访问;但将一个地址值读取到PC中进行程序跳转时,跳转目标则是相关的。

  (2)规范2

  其他被ROPI段中的代码引用的必须是绝对地址,或者是基于可读写位置(RWPI)段的静态基址寄存器的可写数据。

  使用绝对地址只能引用被重定位到特定位置的代码段中的符号,通过在位置无关代码中引入绝对地址,可以让程序跳转到指定位置。例如,假设Bootloader的阶段1将其自身代码拷贝到链接时所指定的SDRAM地址空间后,当要跳转到阶段2的C程序入口时,可以使用指令“LDR PC, =main”跳转到程序在SDRAM中的main函数入口地址开始执行。这是因为程序在编译链接时给main函数分派绝对地址,系统通过将main函数的绝对地址直接赋给PC实现程序跳转。如果使用相对跳转指令“B main”,那么只会跳转到启动ROM内部的main函数入口。



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭