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