是否可以从机器代码中检测CPU架构?

Tib*_*ibi 4 x86 assembly arm x86-64

假设有两种可能的架构,ARM和x86.有没有办法检测代码运行的系统,从汇编/机器代码实现这样的事情?

if (isArm)
    jmp to arm machine code
if (isX86)
    jmp to x86 machine code
Run Code Online (Sandbox Code Playgroud)

我知道ARM机器代码与x86机器代码有很大不同.我正在考虑的是一些精心设计的汇编指令,它们会产生相同的二进制机器代码.

Mar*_*oom 18

假设您已经处理了所有其他差异1并且您只需要编写一个小的多语言蹦床,您可以使用以下操作码:

EB 02 00 EA
Run Code Online (Sandbox Code Playgroud)

当放在地址0时,对于ARM(非拇指),转换为:

00000000: b 0xbb4
00000004: ...
Run Code Online (Sandbox Code Playgroud)

但对于x86(实模式),转换为:

0000:0000 jmp 04h
0000:0002 add dl, ch
0000:0004 ...
Run Code Online (Sandbox Code Playgroud)

然后,您可以在地址04h处放置更精细的x86代码,在地址0bb4h处放置ARM代码.

当然,在重新定位基地址时,请确保重新定位跳转目标.


1例如,ARM 从地址0开始,而x86从地址0fffffff0h开始,因此您需要特定的硬件/固件支持来抽象引导地址.

  • @slebetman是的,那是真的.我把问题称为"我们可以使相同的二进制代码成为有效的ARM和x86代码吗?".我不知道OP将要做什么或需要什么.只是给他要的东西. (6认同)
  • 有趣的事实:在ARM中,一个32/64位的多语言入口点非常简单,因为A32`b`看起来像A64`add`(是的,我编写的代码(ab)使用了这个事实...) (5认同)
  • 如果两个体系结构从不同的地址开始,那么就不需要将二进制文件设置为兼容.只需将ROM二进制文件加载到ROM地址0,将x86二进制文件加载到相应的ROM地址即可.如果OP想要从拇指驱动器启动,那将无济于事. (2认同)