我是汇编语言的新手,我需要帮助了解助记符如何直接转换为字节。
例如,我有一句话
b 0x00002B78
位于内存地址0x00002A44。这如何转换为EA00004B(上述程序集的字节表示)?我的印象是" EA00"表示" b"分支的一部分,但是" 004B"?如果有人能够对这个和资源进行一般性的了解以找到转换等,那将是值得赞赏的。我试过谷歌搜索这个,但我真的不确定谷歌究竟是什么。我一直在谷歌搜索的东西没有帮助。
答案 0 :(得分:8)
您要查找的所有信息都在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
(PC在ARM中始终为“当前指令+8”),因此我们的相对跳转需要为:
0x2b78 - 0x2a4c = 0x12c
太棒了 - 现在我们应用上面文档中描述的转换的反向,将0x12c
向右移动两个:
0x12c / 4 = 0x4b = 0b1001011
这是最后一个字段:
1110 1010 0000 0000 0000 0000 0100 1011
将该二进制指令转回十六进制,为您提供您正在寻找的指令编码:
0xea00004b