ARM和Intel汇编指令映射

5

这可能是个愚蠢的问题,但是否有一个网页/文档/书籍可以给您提供英特尔x86和ARM汇编指令的映射关系呢?

我知道这不是一对一的映射,但我会认为许多指令可以非常顺畅地映射(例如MOV)。


特别是MOV,它绝不是无缝映射。首先,在ARM上,立即 MOV(使用常量初始化寄存器)是一条_合成_指令(汇编器可以从两个真实指令中重建它)。其次,由于旋转移位器的存在,ARM MOV 可以_提取_寄存器的部分内容 - 在x86上需要一个 SHL/SHR 对或者至少一个零扩展的 MOVZ;ARM在这方面要灵活得多。第三,在ARM上,与内存的移动是通过 STR/LDR 指令完成的,而不是 MOV。可能还有其他差异...这只是我立刻想到的。 - FrankH.
2个回答

1
为什么?你是想从一个平台移植代码到另一个平台吗?你已经了解其中一个,想要一个“速查表”来学习另一个平台吗?我能提供的最好的建议是ARM/Thumb快速参考卡(x86可能有很多其他的)。
我似乎找不到这样的速查表,主要原因是两个平台之间的映射远非“无缝”。ARM指令通常是3操作数(abc dst,src1,src2),更糟糕的是,src2可以应用位移/旋转。x86指令通常是2操作数,除了像lea这样的奇怪指令,它通常被用作3操作数加法。
我能想到的最接近的东西是一个结合了ARM/x86的速查表,将常见指令分成类别(算术、位运算、控制流、浮点数、内存访问)。
然后还有Thumb...

这只是一般的好奇心。 - MarkP

1

指令集架构具有并使用类似的听起来和功能相似的指令,例如add、xor、load、store和move。

无论两个指令集是什么,您要查找的映射都在同一个位置找到。获取一个指令集的文档,获取另一个指令集的文档,然后只需查找指令即可。x86喜欢将mov指令重载为加载和存储以及立即移动和寄存器移动,对于arm,您使用load和store进行加载和存储,使用move进行寄存器到寄存器和立即数到寄存器的移动。

英特尔是CISC,ARM是RISC,因此不会有一对一的映射。很少有指令会无缝映射,例如add rd = rd + rn和其他寄存器到寄存器的ALU函数(适用于全尺寸寄存器而不是小数x86寄存器)。

由于不是无缝的且没有一对一的映射,因此从一个到另一个的多个有效解决方案,因此找到单个映射是没有意义的。

你所需要的是静态二进制翻译或动态二进制翻译,如果你从未做过这方面的工作,静态翻译会更容易。不要直接从一种机器码翻译成另一种汇编或机器码,应该先将机器码翻译成C语言,然后让编译器将其编译成目标代码,并进行优化,同时还可以选择使用不同的目标平台。另一种选择是指令集模拟器。
如果你只是想手动重写一些代码,可以使用两个指令集手册:源指令集和目标指令集。即使有地图,你仍然需要对这两个指令集有很好的了解才能使用该地图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接