将ARM程序集助记符转换为字节

时间:2013-08-20 16:53:30

标签: assembly arm byte mnemonics

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

例如,我有一句话

b 0x00002B78

位于内存地址0x00002A44。这如何转换为EA00004B(上述程序集的字节表示)?我的印象是" EA00"表示" b"分支的一部分,但是" 004B"?如果有人能够对这个和资源进行一般性的了解以找到转换等,那将是值得赞赏的。我试过谷歌搜索这个,但我真的不确定谷歌究竟是什么。我一直在谷歌搜索的东西没有帮助。

1 个答案:

答案 0 :(得分:8)

您要查找的所有信息都在ARM Architecture Reference Manual中。如果您查找b指令,您将看到其编码及其工作原理。以下是您关注的具体说明:

excerpt from ARM docs

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

condition fields

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

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

b 0x00002B78

位于地址0x00002a44。太好了。首先,我们可以坚持使用操作码位:

cccc 101L xxxx xxxx xxxx xxxx xxxx xxxx

现在,对于我们的情况,L位为零:

cccc 1010 xxxx xxxx xxxx xxxx xxxx xxxx

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

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