在Linux和Windows上运行程序集

在Linux和Windows上运行程序集,windows,linux,assembly,masm,Windows,Linux,Assembly,Masm,我一直在读有关装配的书。从我对编程语言的理解来看,编译器(汇编器…我知道其他地方争论的两种语言之间有细微的区别)似乎产生了目标代码。一种缺乏指令的不友好的机器语言。此目标代码由处理器解释,之后链接器将其作为可执行文件。我知道每个处理器都必须在其正确的组件中进行对话。让我困惑的是,通过MASM运行DOS程序和在没有NASM或GAS的情况下通过Linux运行同一程序之间的区别。如果源代码被编译成目标代码,那么在这一点上它不是跨平台的吗?我可以像Linux一样轻松地从Dell上双启动Windows。我

我一直在读有关装配的书。从我对编程语言的理解来看,编译器(汇编器…我知道其他地方争论的两种语言之间有细微的区别)似乎产生了目标代码。一种缺乏指令的不友好的机器语言。此目标代码由处理器解释,之后链接器将其作为可执行文件。我知道每个处理器都必须在其正确的组件中进行对话。让我困惑的是,通过MASM运行DOS程序和在没有NASM或GAS的情况下通过Linux运行同一程序之间的区别。如果源代码被编译成目标代码,那么在这一点上它不是跨平台的吗?我可以像Linux一样轻松地从Dell上双启动Windows。我错过了什么

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

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

尽管芯片是相同的,并且可能以相同的模式运行,但程序与主机操作系统交互以获得服务(如输入/输出)的方式是完全不同的

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

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


objdump的mingw版本在windows上运行并处理windows可执行文件,是用于构建具有类似linux语义的windows程序的工具套件的一部分。它还有一个跨版本,在linux上运行并处理windows文件。另一方面,WINE兼容层可以在linux上运行许多windows可执行文件——您可以显式地进行测试。但是,如果您愿意使用C编写posix接口(或者在带有汇编的OS函数上使用大量包装器),那么您应该能够拥有一个使用linux和cross或mingw版本的gnu工具构建的代码库,这样您就可以相对高效地为这两个操作系统生成二进制文件

DOS是在(16位)实模式下执行的,这与32位Windows/Linux中使用的保护模式非常不同。它是如此的不同,以至于可以将其视为不同的体系结构(比如ARM与MIPS),因此它不再是跨平台的。Windows使用一种特殊的硬件兼容模式(虚拟模式)来执行DOS二进制文件,但在较新的(x86_64)系统上,即使这样也不可能了。问题的核心是,尽管程序集级别较低,但它仍必须与操作系统接口。由于它的级别很低,它必须使用最低级别的调用机制与操作系统进行交互,这在操作系统之间是完全不同的。此外,程序集通常直接访问内存以执行其自身的进程,根据操作系统的不同,其布局完全不同。你见过DOS和Linux上命令行参数所需的不同汇编源代码吗?可能是@Linuxios的副本吗?在windows Linux和mac的可执行文件中使用机器代码是可能的吗?哇,谢谢你提供的信息。这给了我研究的方向。对于一个完全没有依赖关系,只有机器代码的程序呢。有没有一种方法可以跨平台?@bluejayke没有平台依赖关系的程序没有任何价值。如文中所述,程序需要与宿主操作系统或硬件交互以完成输入和输出。否则,它正在运行的事实就无关紧要了。@ChrisStratton我说的不是一个有值的程序,我说的是一个返回值为2+2的程序,从理论上讲,有没有办法从3个操作系统中的任何一个从terminal/CMD运行它?你完全没有抓住要点-你所描述的是一个有值的程序,需要一个
main()
的调用和返回约定来指定参数的传递和返回方式,即使它没有其他I/O,不进行系统调用等。在调用约定中,它仍然具有平台依赖性。