2

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

例如,我有一句话说

b 0x00002B78

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

4

1 回答 1

8

您要查找的所有信息都在ARM 体系结构参考手册中。如果您查看b指令,您会看到它的编码以及它是如何工作的。这是您关心的具体说明:

摘自 ARM 文档

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

条件字段

对你来说,它是“永远执行”。然后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在(ARM中PC总是“当前指令+8”),所以我们的相对跳转需要是:

0x2b78 - 0x2a4c = 0x12c

太好了 - 现在我们应用上面文档中描述的转换的反向,右移0x12c两个:

0x12c / 4 = 0x4b = 0b1001011

这是最后一个字段:

1110 1010 0000 0000 0000 0000 0100 1011

将该二进制指令转换回十六进制可为您提供您正在寻找的指令编码:

0xea00004b
于 2013-08-20T17:00:15.327 回答