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中R0-R15寄存器的作用

根据“ARM-thumb 过程调用标准”: r0-r3    用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。             被...
  • wh8_2011
  • wh8_2011
  • 2016年11月17日 08:48
  • 2080

ARM寄存器(R13/R14/R15)

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

ARM寄存器

一、ARM寄存器: 寄存器类别 寄存器在汇编中的名称 各模式下实际访问的寄存器 用户 系统 管理 中止 ...
  • chunlovenan
  • chunlovenan
  • 2015年06月23日 14:39
  • 1397

ARM寄存器的别名+APCS

ARM寄存器的别名 + APCS ARM中的寄存器的别名 默认的情况下,这些寄存器只是叫做r0,r1,...,r14等,而APCS 对其起了不同的别名。 使用...
  • SongCdut
  • SongCdut
  • 2014年10月31日 14:28
  • 3600

arm IP寄存器

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

ARM 关键几个寄存器

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

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

arm汇编基础(转) 先看个例子: void test2(int a,int b,int c) {  int k=a,j=b,m=c; } ...
  • maochengtao
  • maochengtao
  • 2015年05月06日 00:21
  • 11683

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

AMR寄存器的别名 + APCS ARM中的寄存器的别名 默认的情况下,这些寄存器只是叫做r0,r1,...,r14等,而APCS 对其起了不同的别名。 使用汇编器预处理器的功能,你可以定义 ...
  • Decisiveness
  • Decisiveness
  • 2015年03月06日 22:18
  • 275

专题2-我从内部看ARM-ARM工作模式+寄存器详解

1、ARM家族大检阅1)名字归类(1)芯片:2440(arm9核–采用ARMv4指令架构) 6410(arm11核–采用ARMv6指令架构) 210 (Cortex A8核–采用ARMv7指令架构...
  • lvjianxin6015
  • lvjianxin6015
  • 2016年12月20日 21:26
  • 565

arm 寄存器 函数 参数

1.寄存器使用说明 ARM处理器中R0-R15共16个寄存器,它们的用途是一些约定的习惯! 并依据这些用途定义了别名。 如图: 寄存器的使用情况如下: 1)子程序间通过寄存器R0...
  • u012385733
  • u012385733
  • 2017年03月28日 16:11
  • 564
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:arm中r12(IP)的用途
举报原因:
原因补充:

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