【问题标题】:How are ARM Registers referred to in binaryARM 寄存器如何在二进制中引用
【发布时间】:2013-06-20 20:29:56
【问题描述】:

我知道 ARM 有很多寄存器,我想知道寄存器(r0 - r15、cpsr 等)与它们在最终二进制文件中使用的二进制表示之间的映射是什么(基本上是什么值进入指令中的 Rn 和 Rd 字段)。例如,r00b0000r1 只是 0b0001?如果是这样,当涉及到特定的 CPU 模式时,它是什么。还是CPU模式不影响寄存器的标识符(感觉应该是不同的代码)。

谢谢。

【问题讨论】:

  • 如果你有访问ARM指令集的详细信息,你应该参考它。应该很简单。
  • @为什么你觉得应该不一样?
  • 我有 2 个单独的 ARM 手册,它们引用了有关指令结构的所有内容(位是什么以及它们的含义),但它没有从寄存器到二进制关系的映射.
  • 好吧,我认为它会有所不同,因为如果您处于 FIQ 模式,则进入该模式之前的 CPSR 会保存在 SPSR_fiq 中,然后在离开 FIQ 模式后再次可用,或者至少我如何理解它是。我想我还有很多阅读要做。

标签: assembly arm


【解决方案1】:

从 infocenter.arm.com 获取 ARM 架构参考手册。你想知道的都在那里。

指令将 r0 = 4'b0000 和 r1 4'b0001 等编码到 r15 = 4'b1111。有一些寄存器基于模式、主管模式、用户模式中断模式等进行分组,指令中的编码不会改变 r13 是编码中的 13,但处理器中的某个地方有点 if-then-else得到真正的寄存器。这对我们来说是不可见的,隐藏在他们的逻辑中。

对于大多数指令,拇指指令通常仅限于 r0-r7,有一些专门用于移入/移出更高编号的寄存器 r8-r15,但编码相同 r0 = 0 r1 = 1 , r2 = 2 以此类推。

对于许多指令集,您可以自己解决这个问题,尝试类似

add r0,r0,r1
add r0,r0,r2
add r0,r0,r3
add r0,r0,r4
...
add r0,r1,r0
add r0,r2,r0
add r0,r3,r0
...

看看你组装然后反汇编后有什么变化......

【讨论】:

  • 谢谢,那我必须在 ARM 网站上注册。我一直在使用不需要注册的东西。
  • 如果你想做 arm 的东西,架构参考手册和你正在研究的核心的技术参考手册是必须的。请注意,如果您没有特定的想法,请先获取 armv5 的 arm arm,然后根据需要获取更多,以查看随着时间的推移发生了哪些更改或添加了哪些内容。
【解决方案2】:

Here 是一个链接,可将您带到 ARM 网页并允许您下载 ARM ARM。简短的回答是,它因架构 (V4-7)、指令和指令类型(THUMB、ARM、THUMB2、64 位等)而异

【讨论】:

  • 位域中用于引用给定寄存器(例如 R5)的实际值是否真的发生了变化?用于指定寄存器的位域在整个指令字中的位置会明显改变(因为指令字长度会改变),并且可用的寄存器和可能的使用可能性会在变体之间改变。但是看到寄存器突然编号不同会很奇怪。不过也许有一些扩展寄存器。
  • 在指令集之间是的,甚至当指令需要可变数量的寄存器来执行操作时(MUL 与 MOV)。 至于架构更改,Thumb 仅支持 8 个寄存器,因此其位置与 ARM 不同它支持 16。它们往往在指令之间保持相当一致,但并不完美。
  • 啊,但您是正确的,位字段位置一旦开始在指令中,就会保持一致,除非它是非常专门的指令。
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多