arm中r12(IP)的用途

转载 2008年12月16日 11:51:00
  1. arm中r12的用途
    第一篇博客。就写一个最近遇到的bug吧。算是为光秃秃的博客填点东西吧。
    近来在维护一个年久失修的程序, 包括应用,库文件以及一个linux device driver.很久以前程序是用arm-linux-gcc 3.4.3编译的。而最近当换用arm-linux-gcc 4.1.1进行编译的时候发现程序神奇的无法运行了。经过尝试,发现当我们使用shared library形式编译程序后,它便无法正常运行。而如果将库和应用static linking在一起后就能得出正确结果。
    苦思良久不得其法。几个人只好痛苦的开始研究arm的文档试图找到答案。也算功夫不负有心人。终于在一份arm公司的文档中找到了答案。原来曾经被视为general register的r12, 现在已不再仅仅是通用寄存器了。在新的规范中,它被称为Intra-Procedure-call scratch register。以下摘录一些文档的内容:
     
    Register r12 (IP) may be used by a linker as a scratch register between a routine and any subroutine it calls (for details, see §5.3.1.1, Use of IP by the linker). It can also be used within a routine to hold intermediate values between subroutine calls
     
    Both the ARM- and Thumb-state BL instructions are unable to address the full 32-bit address space, so it may be necessary for the linker to insert a veneer between the calling routine and the called subroutine. Veneers may also be needed to support ARM-Thumb inter-working or dynamic linking. Any veneer inserted must preserve the contents of all registers except IP (r12) and the condition code flags; a conforming program must assume that a veneer that alters IP may be inserted at any branch instruction that is exposed to a relocation that supports inter-working or long branches.
     
    即是说。现在如果汇编代码中存在bl指令,而r12又被用来作为通用寄存器,那么r12的值就很有可能会被链接器插入的veneer程序修改掉了。当然如果源代码是纯粹的c代码,那arm-linux-gcc 4.1.1 本身并不会犯这样的错误。但由于我维护的程序中有部分汇编代码,而早年写的汇编代码又没有估计到这个因素。所以才引发了这个稀奇古怪的问题。
     
    哦, 对了。还是发一下文档的引用。
    [1] "Procedure Call Standard for the ARM Architecture", 19th January, 2007, Richard Earnshaw.
     

arm IP寄存器

arm中ip只是个通用寄存器,用来 在函数间分析和调用时暂存数据,例如arm和thumb互调 在8088中 PC是指向下一条将要执行的指令,而IP是指向下一次要取出的指令 mov ip, sp stm...

arm中R0-R15寄存器的作用

根据“ARM-thumb 过程调用标准”: r0-r3    用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。             被...

ARM寄存器的别名+APCS

ARM寄存器的别名 + APCS ARM中的寄存器的别名 默认的情况下,这些寄存器只是叫做r0,r1,...,r14等,而APCS 对其起了不同的别名。 使用...

ARM寄存器中a1、ip的含义 ARM寄存器的别名

AMR寄存器的别名 + APCS ARM中的寄存器的别名 默认的情况下,这些寄存器只是叫做r0,r1,...,r14等,而APCS 对其起了不同的别名。 使用...

ARM寄存器

一、ARM寄存器: 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 ...

ARM寄存器(R13/R14/R15)

一、ARM工作状态下的寄存器组织 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作...

sp,lr,pc即汇编语言中几个常见寄存器的使用

arm汇编基础(转) 先看个例子: void test2(int a,int b,int c) {  int k=a,j=b,m=c; } ...

ARM 关键几个寄存器

arm 寄存器和对应的汇编描述符 图中缩写如下:R:Register;寄存器 PC:Program Counter;程序计数器 CPSR:Current Program Status Regist...
  • jscese
  • jscese
  • 2015年06月18日 14:48
  • 2523

ARM常用重要的寄存器及指令解释 和 指令英文全称

一.常用的寄存器 r0 -r3 临时变量 用于传递参数,传递返回指,当传递参数的参数大于4个时,用栈空间。即开辟sp fp:frame pointer 记录回溯sp ip: 很少用 ,...

GNU汇编中.word伪指令的理解

在u-boot中遇到_armboot_start、_bss_start等这些变量,这些伪指令的用法涉及以下知识1.汇编是“绝对引用”,即引用的就是地址在start.s中_TEXT_BASE: .wor...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:arm中r12(IP)的用途
举报原因:
原因补充:

(最多只允许输入30个字)