繁体   English   中英

将ARM程序集助记符转换为字节

[英]Converting ARM assembly mnemonics to bytes

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

例如,我有一句话说

b 0x00002B78

它位于存储器地址0x00002A44。 这如何转换为EA00004B(上述程序集的字节表示)? 我的印象是“EA00”表示装配的“b”分支部分,但是“004B”呢? 如果有人能够对这个和资源进行一般性的了解以找到转换等,那将是值得赞赏的。 我试过谷歌搜索这个,但我真的不确定谷歌究竟是什么。 我一直在谷歌搜索的东西没有帮助。

您正在寻找的所有信息都在“ 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两个:

0x12c / 4 = 0x4b = 0b1001011

那是最后一个领域:

1110 1010 0000 0000 0000 0000 0100 1011

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

0xea00004b

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM