如果我用汇编语言或机器语言编写,程序会在任何有兼容处理器的计算机上运行吗



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

一般而言,编号

不同的操作系统将对API功能有不同的支持,并在不同的地址支持不同的硬件。

如果你想覆盖最大数量的平台,那么java可能是最好的选择。

否,程序高度依赖于操作系统。为了编写输出,例如"你好,世界!",程序通常会向操作系统发出请求。通常,程序会将请求的自变量放在操作系统指定的位置(例如,EAX寄存器),然后执行从操作系统请求服务的指令。

操作系统请求通常通过数字或某种类似的方案进行编码。因此,要请求向输出流写入字符,您需要在EAX中输入一个数字。若要打开文件,请使用其他数字等。显然,不同操作系统的代码不同。(这些请求通常被封装在库调用中。当你像"写"这样调用库时,它包含执行类似于我上面描述的操作的指令。)

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

也就是说,编写一个在几种不同操作系统上运行的汇编语言程序可能并非不可能。有些程序(称为多语言程序)同时用多种高级语言编写,如FORTRAN和C。例如,一个程序可能在一列中以"C"开头,表示它是FORTRAN中的注释,但第一行是有效的C代码。C代码可以开始注释。随后的行被排列成FORTRAN代码和C注释或者FORTRAN注释和C代码。可以对一个可执行文件执行类似的操作,这样两个不同的操作系统就可以将其作为可执行文件,并在每个操作系统上打印"Hello,world!"(或者,更好的是,对每个操作系统执行不同的操作)。

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

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

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

"取决于"

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

Baloney。x86计算机的机器语言不会因机器而异。它们所做的是添加指令等。如果你想让程序做一些比"helloworld"更复杂的事情,那么实现这一点的方式会有点不同,这取决于h/w如何处理分页等。对于一个没有在ram中跳来跳去的小程序来说,每个程序都差不多。

简而言之,没有

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

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

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

因此,通过这种方式,你可以在所有平台上以相同的方式进行快速三维数学或其他操作,但在所有平台上将数据输入和输出组装例程的方式以及使用它的目的都会有所不同。因此,您不能在任何操作系统上"显示"hello世界,但您可以将字符"hello世界"(或一组转换的顶点)放入内存中,这样您的操作系统特定代码就可以提取并使用它。

最新更新