我是汇编语言的新手,我需要帮助理解助记符如何直接转换为字节。
例如,我有一句话说
b 0x00002B78
它位于内存地址 0x00002A44。这如何转换为 EA00004B(上述程序集的字节表示)?我的印象是“EA00”表示组件的“b”分支部分,但是“004B”呢?如果有人可以大致了解这一点以及寻找转换等的资源,那将不胜感激。我试着用谷歌搜索这个,但我真的不确定到底要谷歌什么。我一直在谷歌搜索的东西没有帮助。
您要查找的所有信息都在ARM 体系结构参考手册中。如果您查看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
两个:
0x12c / 4 = 0x4b = 0b1001011
这是最后一个字段:
1110 1010 0000 0000 0000 0000 0100 1011
将该二进制指令转换回十六进制可为您提供您正在寻找的指令编码:
0xea00004b