【问题标题】:Why the machine code of the ARM32 instruction cannot be found in ARM64 instruction set为什么在ARM64指令集中找不到ARM32指令的机器码
【发布时间】:2020-07-17 08:36:13
【问题描述】:

由于ARM32机器指令可以直接在ARM64处理器上执行,所以我认为ARM32指令add r0, r0, r1的机器码应该和这两条ARM64指令之一的机器码相同:

add w0, w0, w1
add x0, x0, x1

但是,在 objdump 一些 .o 文件之后,我发现并非如此。他们的机器码是这样的:

e0800001    add r0, r0, r1
0b010000    add w0, w0, w1
8b010000    add x0, x0, x1

然后我试图找到e0800001在ARM64中是什么意思,但是在ARM64中没有找到任何以0xe0开头的操作码。我在https://github.com/CAS-Atlantic/AArch64-Encoding上搜索了有关ARM64操作码的文档

【问题讨论】:

  • "由于 ARM32 机器指令可以直接在 ARM64 处理器上执行," - 不能,你必须先切换指令集,类似于你需要在 Thumb (T32) 和 ARM 之间切换(A32)。
  • this。异常返回时,内核可以在 AArch64 和 AArch32 之间切换。
  • 如果您想了解 arm 指令,请参阅实际的 arm 文档。
  • arm文档清楚地记录了aarch32 vs aarch64,如何切换模式等。arm文档的哪些部分你不明白?
  • ARM (A32) 与 Thumb (T32) 的区别在于,即使在同一个应用程序中,也可以通过 BX 指令“直接”完成与 Thumb 之间的切换。根据性能需要在 A32/T32 之间切换并不罕见。 AArch32/AArch64 之间的切换必须通过内核级别完成,例如Linux 不支持同时使用两种指令集的应用程序,因此每个应用程序都是 32 位或 64 位的。因此,切换并不是那么容易/直接。

标签: arm backwards-compatibility arm64 instruction-set opcode


【解决方案1】:

你做了很多毫无根据的假设。

引用ARMv8 Architecture Reference Manual

A1.3.2 Armv8 指令集

在 Armv8 中,可能的指令集取决于执行状态: AArch64 AArch64 状态仅支持一个指令集,称为 A64。这是 使用 32 位指令编码的固定长度指令集。 有关 A64 指令集的信息,请参阅章节 C3 A64 指令集概述AArch32 AArch32 状态支持以下指令集: A32 这是一个使用 32 位的定长指令集 指令编码 T32 这是一个可变长度指令集,它同时使用 16 位和 32 位指令编码。

TL;DR:你有 3 个指令集,它们彼此无关。

此外,您声称...

ARM32机器指令可以直接在ARM64处理器上执行

...对于所有 ARMv8 CPU 来说根本不是这样。
如果我们查看ID_AA64PFR0_EL1(页面D13-3255)的寄存器描述:

EL3,位 [15:12] EL3 异常级别处理。定义的值是: 0b0000 EL3 未实现。 0b0001 EL3 只能在 AArch64 状态下执行。 0b0010 EL3 可以在 AArch64 或 AArch32 状态下执行。 保留所有其他值。 EL2,位 [11:8] EL2 异常级别处理。定义的值是: 0b0000 EL2 未实现。 0b0001 EL2 只能在 AArch64 状态下执行。 0b0010 EL2 可以在 AArch64 或 AArch32 状态下执行。 保留所有其他值。 EL1,位 [7:4] EL1 异常级别处理。定义的值是: 0b0001 EL1 只能在 AArch64 状态下执行。 0b0010 EL1 可以在 AArch64 或 AArch32 状态下执行。 保留所有其他值。 EL0,位 [3:0] EL0 异常级别处理。定义的值是: 0b0001 EL0 只能在 AArch64 状态下执行。 0b0010 EL0 可以在 AArch64 或 AArch32 状态下执行。 保留所有其他值。

因此,ARMv8 CPU 可能在任何异常级别都不支持 AArch32。这种 CPU 的一个例子是 Apple 的 A11,它在 iPhone 8 和 X 中使用。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2011-08-19
    • 2016-05-27
    • 2014-12-10
    • 2011-03-31
    • 2017-09-03
    相关资源
    最近更新 更多