assembly - 为什么我无法转换应用程序中的架构?

标签 assembly architecture

在 x32 计算机上运行的应用程序具有仅在 x32 计算机上运行的汇编器命令。 ARM 机器还有其他命令。为什么我不能转换应用程序中的“汇编器命令”以使其在其他体系结构上运行?

最佳答案

理论上,这很简单:任何 Turing-complete系统可以计算任何其他图灵完备系统可以计算的任何东西。实际上,情况要复杂得多。

最重要的是软件环境。几乎每个程序都假设它将与提供广泛功能的操作系统进行交互:抽象出硬件访问的细节,将程序与同一台机器上运行的其他程序隔离,提供通用代码库,等等在。将程序翻译成新的指令集后,您仍然需要提供支持软件。

另一个主要问题是硬件。计算机不仅仅是 CPU,程序还会对其他部分做出某些显式或隐式的假设。例如,the order in which bytes are put together into larger datatypes变化,并且执行位级操作的程序如果从大端机器转到小端机器,就会遇到麻烦,反之亦然。内存访问也可能受到限制,例如。目标系统可能需要内存读取为 aligned on a multiple of four bytes ,而原来的系统没有这样的要求。还可能存在更微妙的问题,例如,x86 FPU 对所有浮点计算使用 80 位精度,即使是较低精度的数字。依赖于额外内部精度的程序在具有 64 位 FPU 的系统上将会失败。

x86 架构尤其具有一个使程序转换变得困难的功能:指令的大小和对齐方式各不相同。这意味着在一般情况下,您无法查看程序并立即说出它由哪些指令组成。假定的指令对齐与实际的指令对齐之间的一个字节的偏移(例如您可能在反盗版陷阱或紧凑编码演示中发现的情况)可能意味着程序的功能发生了巨大的变化。

有些程序可以让您将程序从一种体系结构转换为另一种体系结构,但它们通常使用 dynamic recompilation在程序运行时重新编写程序,或者完全模拟原始系统,在每条指令执行时重新解释它。无论哪种情况,用户都需要提供程序运行的软件环境。

关于assembly - 为什么我无法转换应用程序中的架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818691/

相关文章:

assembly - ASM - 推/弹出

assembly - 先读后条件写 vs. 写

delphi - 什么是相对跳跃?

gcc - Gdb 在调试 ARM7 微 Controller 的汇编程序时跳过源代码行

c# - 可插拔数据库层的建议

design-patterns - 在状态之间切换或循环的设计模式

c - 如何解释 C 中的缓冲区溢出漏洞

database - 管理将破坏性数据库更改迁移到由同一应用程序的旧版本共享的数据库

javascript - 用于广播流视频的 WebRTC 或 WebSockets?

c# - 哪一层做类似: caching and logging belong?的功能