我是汇编语言的新手,我需要帮助理解助记符如何直接转换为字节。
例如,我有一句话
b 0x00002B78
位于内存地址0x00002A44。这如何转换为 EA00004B(上述程序集的字节表示)?我的印象是“EA00”表示组件的“b”分支部分,但是“004B”又如何呢?如果有人能对此有一个总体的了解,并提供寻找转换等的资源,我们将不胜感激。我尝试用谷歌搜索这个,但我真的不确定到底要用谷歌搜索什么。我一直在谷歌搜索的东西没有帮助。
最佳答案
您要查找的所有信息都在 ARM Architecture Reference Manual 中。如果您查找 b
指令,您将看到它的编码及其工作原理。以下是您关心的具体说明:
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
右移 2:
0x12c / 4 = 0x4b = 0b1001011
这是最后一个字段:
1110 1010 0000 0000 0000 0000 0100 1011
将该二进制指令转换回十六进制即可获得您正在寻找的指令编码:
0xea00004b
关于assembly - 将 ARM 汇编助记符转换为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18340750/