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中r12(IP)的用途相关推荐

  1. Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

  2. ARM中C语言和汇编语言互相调用以及实例

    1.内联汇编 在C语言中内嵌汇编注意事项: 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令 在使用物理寄存器时,不要使用过于复杂的C表达式(比如ADD y,R0 ,x/y(无形中就是c语言表达 ...

  3. arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍

    ARM中所有寄存器都是32位的.这里以cortex-a7内核的MX6ULL处理器为例,按照功能可以分为两类:运行需要寄存器(程序正常运行所需要的,比如变量暂存,pc制作等,总共43个),系统管理控制寄 ...

  4. 关于在ARM中的函数调用问题

    本人菜鸟一只,最近在学习arm汇编,做一个关于函数调用的笔记,如果有出错的地方希望大牛们指出. 以下汇编代码均为MDK5所生成的 首先看一个简单的例子 int main(void) { int a=1 ...

  5. Altera 的SOC器件之将自定义的IP挂在ARM硬核下(通过avalon总线),实现arm核与IP之间的通信

    Altera 的SOC器件之将自定义的IP挂在ARM硬核下(通过avalon总线),实现arm核与IP之间的通信 软件: Quartus II 17.0 芯片: ALTERA Cyclone5 5CG ...

  6. aka鉴权 ims_IMS鉴权过程中各参数的用途

    IMS 鉴权过程中各参数的用途 发帖日期: 2011-08-18 14:12:52 按照目前的国际规范, IMS 认证方式主要有 IMS AKA . SIP Digest . NASS-IMS Bun ...

  7. ARM中通过ldr pc, xxx地址,来跳转到对应的绝对地址去执行

    先来了解一下ldr指令: LDR 是ARM中的指令,也是伪指令. 当用 LDR r0, =num 编译时,编译器会根据num是否能表示为立即数,决定用 ldr 指令或者是mov或mvn指令. 当num ...

  8. linux查看Windows的ip命令,在windows系统和linux系统中查询IP地址命令的不同

    在linux和windows系统上查询IP地址的命令是不一样的. 在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开dos命令行,然后输 ...

  9. Loadrunner中的IP欺骗的设置以及误区

    最近在忙着部署web性能测试的环境后,对IP欺骗进行设置,特地做个笔记,给自己的学习历程留下点足迹. 一. 什么是IP欺骗? 做什么事首先要问个为什么,如果知道为什么了,即使不知道如何做,简单,goo ...

最新文章

  1. Runtime Errors:CALL_FUNCTION_REMOTE_ERROR/CALL_FUNCTION_NOT_REMOTE
  2. 信息学奥赛一本通 2025:【例4.11】体操队
  3. WPF的几种布局方式
  4. 20180828 上课截图
  5. 【聚类3】密度聚类+层次聚类
  6. 【Sniffer和网络执法官软件助你维护网络(转网络安全)】
  7. 常山浙西计算机学校,常山这所最早的学校你上过吗?历经三个世纪,他依然在最初的地方等你……...
  8. 网线制作:网线和水晶头的接法
  9. 好用的工作邮箱有哪些?工作邮箱如何登录
  10. 北冥乘海生:996其实没什么卵用
  11. Google Dremel 理解
  12. wchar_t的用法
  13. 【转载】如何用Python发送Email邮件?
  14. 5分钟教你利用css3动画实现奔跑的北极熊效果
  15. 英文字幕视频翻译成中文字幕
  16. 关于计算两日期之间经过多少天的超巧妙算法(转载)
  17. 逻辑思维在编程中的重要性!!!(回答问题有感)
  18. 计算机基本办公软件应用技能考试,办公软件应用操作专项职业能力考核规范
  19. 初二因式分解奥数竞赛题_日本初中数学竞赛题:分解因式,中国学生:确定不是送分题?...
  20. 白话经典算法之七大排序

热门文章

  1. 考研英语 - word-list-38
  2. springboot拿来即用的项目
  3. while(t--)和while(--t)的区别
  4. Firefox扩展安装
  5. IDC圈探营:山西联通太原云数据中心
  6. 开源一款娱乐的qq机器人-QQRobot
  7. 【Matlab基础】数据拟合
  8. 记录远程桌面无法互相拷贝文件可能的原因和解决方法
  9. 2022-2028年中国300毫米自动探针台套件市场现状研究分析与发展前景预测报告
  10. oracle 和mysql语法上的区别,Mysql和Oracle的一些语法区别