assembly - 将 ARM 汇编助记符转换为字节

标签 assembly arm byte mnemonics

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

例如,我有一句话

b 0x00002B78

位于内存地址0x00002A44。这如何转换为 EA00004B(上述程序集的字节表示)?我的印象是“EA00”表示组件的“b”分支部分,但是“004B”又如何呢?如果有人能对此有一个总体的了解,并提供寻找转换等的资源,我们将不胜感激。我尝试用谷歌搜索这个,但我真的不确定到底要用谷歌搜索什么。我一直在谷歌搜索的东西没有帮助。

最佳答案

您要查找的所有信息都在 ARM Architecture Reference Manual 中。如果您查找 b 指令,您将看到它的编码及其工作原理。以下是您关心的具体说明:

excerpt from ARM docs

E 是条件字段,您可以在此表中查找:

condition fields

对你来说,它是“始终执行”。然后是 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/

相关文章:

assembly - 如何编写在非常接近系统启动时运行的软件?

Android Studio 可以正确地将应用程序与 -lGLESv3 链接到 64 位arm,但不能链接到 32 位arm

assembly - ldr 中相同的源和目标寄存器

c# - 如何在 C# 中使用字节常量作为 switch case?

c++ - 如何在另一个正在运行的进程中找到自定义函数的地址以 Hook /绕行?

assembly - 如何开始逆向工程 z80 机器代码?

c - GDB和汇编: how to examine consts variables defined in heap?

assembly - MRC命令的附加协处理器寄存器的作用是什么?

java - 我想在 Java 中反转字符串并删除和复制

c++ - 线程函数无法从堆上分配的缓冲区中读取字符