【问题标题】:ARM - How to convert Assembly code into machine languageARM - 如何将汇编代码转换为机器语言
【发布时间】:2017-06-17 10:31:26
【问题描述】:

我正在学习汇编语言,并试图了解如何在汇编语言和机器语言之间进行转换。我正在尝试阅读资料等,甚至询问我的教授,但没有任何帮助。这是我正在处理的以下代码:

MOV R10, #63488 
LSL R9, R6, #7 
STR R4, [R11, R8] 
ASR R6, R7, R3

我找到了一个 ARM 到 HEX 转换器的网站,这是转换:

3EABA0E3
8693A0E1
08408BE7
5763A0E1

有人可以帮我解释一下这是如何工作的吗?太感谢了!

【问题讨论】:

  • 你查看this question的答案了吗?
  • 您在使用该站点时假设的处理器或架构是什么?你在上什么课,这只是家庭作业吗?
  • @GrishaLevit 谢谢。我错过了这个。我去看看。
  • @InfinitelyManic 处理器/架构是 ARM
  • @Ani - 是的 - 但 ARM 下有不同的微架构。见en.wikipedia.org/wiki/List_of_ARM_microarchitectures。如果我使用假设 ARMv7 指令集的汇编代码,那么机器代码将与您发布的不同。例如,使用 Raspberry Pi2 的 e3a0ab3e、e1a09386、e78b4008、e1a06357。

标签: assembly binary arm hex machine-language


【解决方案1】:

您需要的是 ARM ARM(架构参考手册),可从 Arm 的网站免费获得,但您可能需要注册。它包含所有可用指令的编码。

【讨论】:

  • 这不是最人性化的 :P 但我会再试一次!
【解决方案2】:

科林的答案基本上就是答案,只是添加了更多信息。您需要的工具称为汇编器,而不是手臂到十六进制转换器。然后,您可以使用反汇编程序来查看它,例如使用 gnu 工具的程序:

arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -D so.o

生产

00000000 <.text>:
   0:   e3a0ab3e    mov r10, #63488 ; 0xf800
   4:   e1a09386    lsl r9, r6, #7
   8:   e78b4008    str r4, [r11, r8]
   c:   e1a06357    asr r6, r7, r3

处理器如何解释机器代码在 ARM ARM 中有很好的记录,可能从 ARMv5 开始,它是较旧的不太复杂的版本。 ARMv6、ARMv7 有更多的操作系统和保护功能,大部分指令集相同,虽然拇指指令更多,然后 ARMv8 是与 aarch32 的混合,较旧的 ARMv4 到 ARMv7 指令集,然后是同一个内核中的全新 aarch64 指令集。所以 google arm 架构参考手册,有些人非法将它们闲置或访问 infocenter.arm.com 以获取真实的。

【讨论】:

  • 我与一些人一起工作并得到了与您建议的相同的答案。我们使用 Keil 的一个名为 uVision 的工具来构建目标和调试。我将尝试查看调试过程是否对我有任何帮助。但我希望最终能够在不使用任何工具的情况下手动追踪它:P
  • 追踪什么机器码?虽然在技术上是可行的,但这是一种痛苦,不值得获得荣誉徽章。 ARM 编码无处不在,因此需要大量工作才能让该工具完成。例如,如果它是 mips 或其他一些,则查看机器代码并自己手动解码要容易得多。更有趣/有用的是从头开始编写自己的反汇编程序,相同的知识,不同的应用。