Android CPU 注册名字?

Android CPU register names?

此代码片段摘自 Android Samsung Tab S 的崩溃报告:

Build fingerprint: 'samsung/chagallwifixx/chagallwifi:5.0.2/LRX22G/T800XXU1BOCC:user/release-keys'
Revision: '7'
ABI: 'arm'
    r0 a0d840bc  r1 a0dcb880  r2 00000001  r3 a0d840bc
    r4 a0dc3c4c  r5 00000000  r6 a066d200  r7 00000000
    r8 32d68f40  r9 a0c359a8  sl 00000014  fp bef3ba84
    ip a0dc3fb8  sp bef3ba10  lr a0c35a0c  pc a0c34bc8  cpsr 400d0010

r0r9很明显是通用寄存器,spr13)是堆栈指针,pcr15) 是程序计数器(指令指针)。参考 Wikipedia's ARM Architecture page Registers section(我浏览过 许多 页之一),我发现 lr (r14) 是 link注册,cpsr就是"Current Program Status Register."

我想知道 sl (r10), fp (r11) 和 ip (r12) 是什么.我希望 ip 而不是 而 "instruction pointer" 因为该功能是由 pc (r15).

完成的

是否有我没有找到的参考文档来说明这些名称?

当前 ARM EABI procedure call standard 概述了 r12-r15 的标准 'special' 名称:

  • PC (r15): 程序计数器
  • LR (r14): Link 注册
  • SP (r13): 堆栈指针
  • IP (r12): 程序内临时寄存器*

GNU 工具还支持已弃用 legacy APCS 中的名称作为给定寄存器编号的标识符,即使它们不再一定具有任何意义:

  • FP (r11): 帧指针 - 对于 ARM 代码可能仍然适用; Thumb 代码倾向于在 r7 中保留实际的帧指针,当然代码可能根本没有帧指针进行编译,在这种情况下 "fp" 只是另一个被调用者保存的通用寄存器。
  • SL (r10):堆栈限制 - 我实际上并不知道那个的历史,但在大多数现代代码中,r10 并不比 r4-r8 更特殊。

请注意,r9 不一定是 通用寄存器 - EABI 将其保留用于特定于平台的目的。在 linux-gnueabi 下它没什么特别的,但其他平台可能将它用于特殊目的,如 TLS 或全局对象 table 指针,因此它也可能通过 SB(静态基)或 TR(线程寄存器) ).

* PC 相关分支指令的有限范围背后的故事 - 如果链接器发现调用的目标最终超过 32MB,它可能会生成一个单板(一些额外的调用站点范围内的指令)作为分支目标,它计算真实地址并执行绝对分支,为此它可能需要一个临时寄存器。