Assembly 如何在二进制中引用ARM寄存器

Assembly 如何在二进制中引用ARM寄存器,assembly,arm,Assembly,Arm,我知道ARM有很多寄存器,我想知道寄存器(r0-r15、cpsr等)到最终二进制中使用的二进制表示之间的映射是什么(基本上,指令中进入Rn和Rd字段的值是什么)。例如,它是r0是0b0000还是r1只是0b001?如果是这样,那么在特定的CPU模式下是什么。或者CPU模式不影响寄存器的标识符(我觉得应该是不同的代码) 谢谢。是一个链接,可以将您带到ARM网页并允许您下载ARM。简单的回答是,它因体系结构(V4-7)、指令和指令类型(THUMB、ARM、THUMB2、64位等)而异。从infoce

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


谢谢。

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

从infocenter.ARM.com获取ARM体系结构参考手册。你想知道的一切都在那里

指令编码r0=4'b0000和r1 4'b0001等,直到r15=4'b1111。有一些寄存器是基于模式、管理器模式、用户模式中断模式等存储的,指令中的编码没有改变r13在编码中是13,但处理器中的某个地方有一些if-then-else的味道,以获得真正的寄存器。这对我们来说是看不见的,但却隐藏在他们的逻辑中

thumb指令通常限于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手册,它们参考了指令结构的所有内容(什么位是什么,它们的意思是什么),但它没有从寄存器到二进制关系的映射。我想它会有所不同,因为如果您处于FIQ模式,然后,进入该模式前的CPSR保存在SPSR_fiq中,然后在离开fiq模式后再次可用,或者至少按照我的理解。我想我还有很多阅读工作要做。位字段中引用给定寄存器(比如R5)的实际值是否真的发生了变化?用于在整个指令字内指定寄存器的位字段的位置将明显改变(因为指令字长度改变),并且可用寄存器和可能的使用可能性将在变体之间改变。但是,看到登记册突然编号不同,这将是非常奇怪的。不过,可能有一些扩展寄存器。在指令集之间是的,甚至在指令需要一个可变数量的寄存器来执行操作(MUL vs MOV)时也不是。至于架构更改,Thumb仅支持8个寄存器,因此其位置不同于支持16个寄存器的ARM。它们倾向于在指令之间保持相当一致,但不是完全一致。啊,但你是正确的,一旦在指令中开始,位字段位置就保持一致,除非它是一条非常专门的指令。谢谢,那时我必须在ARM站点注册。我一直在使用一些不需要注册的东西。如果你想做arm的东西,那么你正在研究的核心的架构参考手册和技术参考手册是必须的。注意:如果您没有特定的armv5,请从armv5开始,然后根据需要获取更多的armv5,以查看随着时间的推移发生了哪些更改或添加了哪些内容。