简短的答案:您无法翻译已编译的链接可执行文件。尽管在技术上可行,但极不可能实现(请参见下文)。 但是,如果您具有汇编源文件(包含说明和标签),则很可能会这样做(尽管以某种方式获得了汇编源,除非程序是用汇编编写的,否则应将原始程序源代码保存为好吧,因此最好先针对不同的架构进行编译)。
长答案:
QEMU和其他仿真器可以即时翻译指令,因此可以在未为其编译的计算机上运行可执行文件。为什么不提前翻译而不是即时翻译以加快翻译过程呢?
我知道原则上看起来似乎很容易,但是在实践中,出于几个主要原因,这几乎是不可能的。首先,不同的指令集使用非常不同的寻址模式,不同的操作码结构,不同的字长,有些甚至没有您需要的指令。
假设您需要将指令替换XYZ
为另外两个指令ABC
和DEF
。现在,您已从该点开始有效地转移了整个程序中的所有相对/偏移地址,因此您将需要分析并遍历整个程序并更新偏移量(在更改之前和之后)。现在,假设偏移量发生了很大的变化-现在您需要更改寻址模式,这可能会更改地址的大小。这将再次迫使您重新扫描整个文件并重新计算所有地址,依此类推。
编写汇编程序时,可能会使用标签,但CPU不会使用-汇编文件时,所有标签的计算位置都是相对,绝对或偏移位置。您会看到为什么这很快变成一项艰巨的任务,并且几乎是不可能的。更换一个单一的指令可能需要您在移动之前,整个程序轻车熟路通过。
据我对汇编的了解有限,大多数指令(如MOV,ADD和其他指令)应可跨体系结构移植。
是的,但请看我上面概述的问题。机器的字号如何?地址长度?它甚至具有相同的寻址模式吗?同样,您不能只是“查找并替换”说明。程序的每个段都有一个专门定义的地址。汇编程序时,跳转到其他标签的内容将用文字或偏移量内存地址替换。
因为所有机器都是图灵完备的,所以没有直接映射的任何内容都可以映射到其他指令集。这样做会太复杂吗?由于我不熟悉的某些原因,它根本无法工作吗?它可以工作,但没有比使用模拟器更好的结果吗?
您100%正确地认为这两者都有可能,而且速度会快很多。但是,编写程序来完成此任务非常困难且极不可能,除非除了我上面概述的问题以外,什么都不做。
如果您有实际的汇编源代码,那么将机器代码转换为另一种指令集体系结构将是微不足道的。但是,机器代码本身是经过汇编的,因此如果没有汇编源(其中包含用于计算内存地址的各种标签),它将变得异常困难。同样,更改一条指令可能会更改整个程序中的内存偏移,并需要进行数百次传递才能重新计算地址。
对于具有几千个指令的程序执行此操作将需要数万甚至数十万次的传递。对于相对较小的程序,这是可能的,但是请记住,通过次数将随着程序中机器指令的数量成倍增加。对于足够大的程序,几乎是不可能的。