Assembly 将ARM部件助记符转换为字节

Assembly 将ARM部件助记符转换为字节,assembly,arm,byte,mnemonics,Assembly,Arm,Byte,Mnemonics,我是汇编语言的新手,我需要帮助理解助记符是如何直接转换成字节的 例如,我有一句台词说 b 0x00002B78 它位于内存地址0x00002A4处。如何将其转换为EA00004B(上述程序集的字节表示)?我的印象是,“EA00”表示组件的“b”分支部分,但是“004B”呢?如果有人能大致了解这一点和资源,以找到转换等,将不胜感激。我试着用谷歌搜索这个,但我真的不确定到底该用谷歌搜索什么。我在谷歌上搜索的内容没有任何帮助。您要查找的所有信息都在。如果您查找b指令,您将看到它的编码及其工作方式。以

我是汇编语言的新手,我需要帮助理解助记符是如何直接转换成字节的

例如,我有一句台词说

b 0x00002B78

它位于内存地址0x00002A4处。如何将其转换为EA00004B(上述程序集的字节表示)?我的印象是,“EA00”表示组件的“b”分支部分,但是“004B”呢?如果有人能大致了解这一点和资源,以找到转换等,将不胜感激。我试着用谷歌搜索这个,但我真的不确定到底该用谷歌搜索什么。我在谷歌上搜索的内容没有任何帮助。

您要查找的所有信息都在。如果您查找
b
指令,您将看到它的编码及其工作方式。以下是您关心的具体说明:

E
是条件字段,您可以在此表中查找:

对你来说,这就是“永远执行”。然后是
A
,二进制形式为
1010
,以匹配位27:24(您有一条分支指令,而不是分支与链接指令)。最后,指令的其余部分是立即偏移量字段。这是一个PC相对偏移量,这就是为什么它被编码为
0x00004b

现在让我们看看您的具体示例。你有指示:

b 0x00002B78
位于地址
0x00002A4
。好的,太好了。因此,首先,我们可以坚持操作码位:

cccc 101L xxxx xxxx xxxx xxxx xxxx xxxx
1110 1010 xxxx xxxx xxxx xxxx xxxx xxxx
现在,对于我们的情况,
L
位为零:

cccc 1010 xxxx xxxx xxxx xxxx xxxx xxxx
我们希望无条件执行此指令,因此添加
AL
条件代码位:

cccc 101L xxxx xxxx xxxx xxxx xxxx xxxx
1110 1010 xxxx xxxx xxxx xxxx xxxx xxxx
现在我们要做的就是计算偏移量。执行此指令时,PC将
0x2a4c
(PC在ARM中始终为“当前指令+8”),因此我们的相对跳转需要:

0x2b78 - 0x2a4c = 0x12c
太好了-现在我们应用与上述文档中描述的转换相反的转换,右移
0x12c
两次:

0x12c / 4 = 0x4b = 0b1001011
这是最后一个字段:

1110 1010 0000 0000 0000 0000 0100 1011
将该二进制指令转换回十六进制将为您提供所需的指令编码:

0xea00004b

@PaulSullivan I也有点这样想,但004B在0x2A44和0x2B78之间实际上是如何关联的?在执行分支时,
PC
由于预取,将比当前指令提前8字节。因此,取目标地址(0x2B78),减去0x2A44+8(0x2A4C),得到0x12C。除以4(因为指令中存储的偏移量将左移2位),最终得到0x4B。@Michael感谢关于“预取”的那一位。我想知道为什么PC会是8字节。在您刚刚编辑之前,Ahead准备用另一个问题进行注释,但这是一个非常彻底和有用的回答!非常感谢你写这篇文章(也感谢你的链接);如果有什么我可以进一步澄清的,请告诉我。