[英]Converting ARM assembly mnemonics to bytes
我是汇编语言的新手,我需要帮助理解助记符如何直接转换为字节。
例如,我有一句话说
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
两个:
0x12c / 4 = 0x4b = 0b1001011
那是最后一个领域:
1110 1010 0000 0000 0000 0000 0100 1011
将该二进制指令转回十六进制为您提供您正在寻找的指令编码:
0xea00004b
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.