【发布时间】: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