如果我用汇编语言或机器语言编写,程序是否可以在任何具有兼容处理器的计算机上运行?

时间:2011-06-25 00:36:57

标签: assembly machine-language

基本上,我想知道我是否可以使用机器或汇编语言来编写一个可以在任何带有x86处理器的计算机上运行的程序,尽管操作系统存在差异。例如,你运行一个程序,无论它在什么计算机上,它都会显示“Hello,World!” 我知道想知道这些语言中的任何一个都有点疯狂,但我认为这是一个令人难以置信的东西要学习,为什么不呢?

6 个答案:

答案 0 :(得分:2)

总的来说,没有。

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

如果你想覆盖最多的平台,那么java可能就是你的选择。

答案 1 :(得分: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之外的大多数文件格式可能是不可能的,因为大多数对象或可执行文件格式要求文件的前两个或四个字节为magic number that identifies the file format。如果您可以找到一种方法让不同的平台看到ELF文件中的字段的不同值来识别它所针对的平台,则可以使用具有广泛使用的ELF格式的多平台可执行文件。

答案 2 :(得分:1)

“这取决于”

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

答案 3 :(得分:0)

简而言之,没有。

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

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

答案 4 :(得分:0)

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

因此,通过这种方式,您可以在所有平台上以相同的方式进行快速3D数学运算,但是在所有平台上将数据导入程序集例程以及使用它的方式都会有所不同。所以你不能在任何操作系统上“显示”hello world,但你肯定可以将字符“hello world”(或一组变换的椎体)放到内存中,这样你的操作系统特定代码就可以将它拉出来并使用它。 / p>

答案 5 :(得分:0)

胡扯。 x86计算机的MACHINE LANGUAGE不会因机器而异。他们所做的是添加指令等,如果你想让程序做一些比'hello world'更多的事情,那么实现它的方式会有所不同,具体取决于h / w处理分页的方式等等。没有在ram中跳过的小程序,每个程序都差不多。