3

我一直在阅读组装。从我对编程语言的理解来看,编译器(汇编器......我知道在其他地方争论的两者之间存在细微的差异),生成目标代码。大量没有指令的不友好的机器语言。该目标代码由处理器解释,然后链接器使其成为可执行文件。我知道每个处理器都必须在其正确的组装中进行交谈。IE。.386, .486, .586 令我困惑的是通过 MASM 运行 DOS 程序和通过没有 NASM 或 GAS 的 Linux 运行相同程序之间的差异。如果源代码编译成目标代码,此时不是跨平台吗?我可以像 Linux 一样简单地从我的戴尔双启动 Windows。我在这里想念什么?

另外我一直在寻找一种查看目标代码的方法,这样我就不必通过 Immunity Debugger 来破译执行。只是我编写的源代码的指令机器代码指令。有没有办法在 Linux 中产生像 objdump 这样的结果?

4

1 回答 1

10

现代“x86”芯片至少可以理解三种不同的指令集——DOS 使用的 16 位指令集,以及各种 windows 和 linux 使用的 32 位和 64 位指令集。

即使芯片是相同的,并且可能运行在相同的模式下,程序与主机操作系统交互以获取服务(例如输入/输出)的方式是完全不同的。

除了最琐碎的程序外,所有程序都倾向于使用附加目标代码的外部库,这些库为常见操作(字符串操作、格式化输入和输出、数学、非平凡网络等)提供帮助,因此它们不必是从头开始写。但是可用的此类库的精确集合,以及请求和与它们交互的重要方式,因主机操作系统而异。您也许可以将库与您的应用程序一起打包(静态链接),而不是使用已经在系统上的 .DLL/.so (动态链接),但是仍然需要适应请求底层原始操作系统服务的差异.

此外,一些方案(如 java 和 .net)创建在虚拟机或模拟处理器上运行的目标代码,而不是直接在物理处理器上运行。如果虚拟机引擎和支持库以兼容的形式提供,那么它们在某种程度上是可移植的。

objdump 的 mingw 版本在 windows 上运行并处理 windows 可执行文件,并且是用于构建具有类 linux 语义的 windows 程序的工具套件的一部分。它还有一个交叉版本,可以在 linux 上运行并处理 windows 文件。反过来说,WINE 兼容层可以在 linux 上运行许多 Windows 可执行文件——你可以明确地对此进行测试。但是,如果您愿意针对 posix 接口用 C 语言编写(或在带有汇编的 OS 函数上使用大量包装器),您应该能够拥有一个代码库,该代码库可以同时使用 linux 和交叉或 mingw 版本的 gnu 工具构建,这样您可以相对有效地为两个操作系统生成二进制文件。

于 2012-05-10T12:40:40.193 回答