这可能是个愚蠢的问题,但是否有一个网页/文档/书籍可以给您提供英特尔x86和ARM汇编指令的映射关系呢?
我知道这不是一对一的映射,但我会认为许多指令可以非常顺畅地映射(例如MOV)。
abc dst,src1,src2
),更糟糕的是,src2
可以应用位移/旋转。x86指令通常是2操作数,除了像lea
这样的奇怪指令,它通常被用作3操作数加法。指令集架构具有并使用类似的听起来和功能相似的指令,例如add、xor、load、store和move。
无论两个指令集是什么,您要查找的映射都在同一个位置找到。获取一个指令集的文档,获取另一个指令集的文档,然后只需查找指令即可。x86喜欢将mov指令重载为加载和存储以及立即移动和寄存器移动,对于arm,您使用load和store进行加载和存储,使用move进行寄存器到寄存器和立即数到寄存器的移动。
英特尔是CISC,ARM是RISC,因此不会有一对一的映射。很少有指令会无缝映射,例如add rd = rd + rn和其他寄存器到寄存器的ALU函数(适用于全尺寸寄存器而不是小数x86寄存器)。
由于不是无缝的且没有一对一的映射,因此从一个到另一个的多个有效解决方案,因此找到单个映射是没有意义的。
你所需要的是静态二进制翻译或动态二进制翻译,如果你从未做过这方面的工作,静态翻译会更容易。不要直接从一种机器码翻译成另一种汇编或机器码,应该先将机器码翻译成C语言,然后让编译器将其编译成目标代码,并进行优化,同时还可以选择使用不同的目标平台。另一种选择是指令集模拟器。
MOV
,它绝不是无缝映射。首先,在ARM上,立即MOV
(使用常量初始化寄存器)是一条_合成_指令(汇编器可以从两个真实指令中重建它)。其次,由于旋转移位器的存在,ARMMOV
可以_提取_寄存器的部分内容 - 在x86上需要一个SHL
/SHR
对或者至少一个零扩展的MOVZ
;ARM在这方面要灵活得多。第三,在ARM上,与内存的移动是通过STR
/LDR
指令完成的,而不是MOV
。可能还有其他差异...这只是我立刻想到的。 - FrankH.