4

基本上,我想知道我是否可以使用机器或汇编语言编写一个可以在任何具有 x86 处理器的计算机上运行的程序,尽管操作系统存在差异。例如,您运行一个程序,无论它在哪台计算机上,它都会显示“Hello, World!” 我知道想知道这两种语言有点疯狂,但我认为这是一件不可思议的事情,为什么不呢?

4

6 回答 6

2

不,程序高度依赖于操作系统。要编写输出,例如“Hello, world!”,程序通常会向操作系统发出请求。通常,程序会将请求的参数放在操作系统指定的位置(例如,EAX寄存器),然后执行向操作系统请求服务的指令。

操作系统请求通常由数字或一些类似的方案编码。因此,要请求将字符写入输出流,您需要在EAX. 要打开文件,您可以使用另一个数字,等等。显然,代码因操作系统而异。(这些请求通常包含在库调用中。当您调用像“write”这样的库时,它包含执行类似于我上面描述的操作的指令。)

即使你想“自己做”并通过操纵硬件写入屏幕,也存在一些问题。一,操作系统必须允许你访问硬件。如今,大多数系统都阻止用户模式程序直接访问硬件。第二,您的程序必须针对特定硬件进行设计。也许有一个老式的 BIOS 可以发送字符,或者系统中有一些现代固件。您需要不同的方法来处理不同的固件或 CPU 之外的任何不同组件。

也就是说,编写一个在多个不同操作系统上运行的汇编语言程序可能并非不可能。有一些程序(称为polyglots)同时用多种高级语言编写,例如 FORTRAN 和 C。例如,一个程序可能在列中以“C”开头,表示它是 FORTRAN 中的注释,但第一个行是有效的 C 代码。并且该 C 代码可以开始注释。然后排列后续行,使它们要么是 FORTRAN 代码和 C 注释,要么是 FORTRAN 注释和 C 代码。可以对可执行文件执行类似的操作,以便两个不同的操作系统将其作为可执行文件接受,并打印“Hello, world!” 在每个(或者,更好的是,在每个上做不同的事情)。

DOS .COM 格式可能适用于此,因为它是原始二进制文件。如果另一个系统的可执行文件的前几个字节可以是代表跳转指令的字节,那么 .COM 文件可能会导致跳转到文件中的其他位置,您可以在那里安排您喜欢的任何字节,而该文件是其他系统的可执行文件。

当然,这不是设计可执行文件的预期方式,也不是一件容易的事。

对于除 .COM 以外的大多数文件格式来说,这可能是不可能的,因为大多数对象或可执行文件格式要求文件的前两个或四个字节是标识文件格式的幻数。如果您可以找到一种方法让不同的平台看到 ELF 文件中标识其用于哪个平台的字段的不同值,那么具有广泛使用的 ELF 格式的多平台可执行文件可能是可能的。

于 2011-06-25T01:03:55.303 回答
2

一般来说,没有。

不同的操作系统对API函数的支持不同,在不同的地址支持不同的硬件。

如果您想覆盖最大数量的平台,那么 java 可能是要走的路。

于 2011-06-25T00:41:21.073 回答
1

“这取决于”

如果您想要一个实际的独立可执行二进制文件,那么答案是否定的。但是,如果您只是想编写一段程序集,然后将其嵌入到更大的可执行文件中,答案是“是”;但是,不允许您在该汇编代码块中调用任何特定于操作系统的功能。因此,您可能无法实现创建一个在多个操作系统上打印出“Hello world”的单一汇编程序的梦想。

于 2011-06-25T00:47:59.937 回答
1

胡扯。x86 计算机的机器语言不会因机器而异。他们所做的是添加指令等。如果您希望程序做一些比“hello world”更复杂的事情,那么实现这一点的方式会有所不同,具体取决于硬件如何处理分页等。没有在 ram 中跳转的小程序对于每个程序来说几乎都是一样的。

于 2014-01-04T00:08:07.120 回答
0

简而言之,没有。

操作系统通常不会开始执行二进制程序的第一个字节。相反,他们所做的是为应用程序设置地址空间,其中包括它希望调用堆栈有多大、希望为常量预分配什么值以及二进制文件的哪些部分应该作为可执行文件加载代码,而不是可写数据。

二进制程序指示操作系统如何配置其地址空间的方式因操作系统而异。

于 2011-06-25T00:42:17.473 回答
0

是和否是你的答案。例如,你可以编写 x86 程序集,它会在 Linux、Mac OS X 和 MS Windows 上做同样的事情……但是做同样的事情,我的意思是字面上它会从同一个地方获取数据,执行同样的操作操作并将其存储回内存中的某个位置。

因此,通过这种方式,您可以在所有平台上以相同的方式进行快速 3d 数学运算或其他操作,但是在所有平台上,您将数据输入和输出的方式以及使用它的方式都会有所不同。因此,您不能在任何操作系统上“显示”hello world,但您当然可以将字符“hello world”(或一组转换的顶点)放入内存中的某个位置,以便您的操作系统特定代码可以将其拉出并使用它。

于 2011-06-25T00:45:19.763 回答