让我们考虑在Windows中编译的简单C程序。
我可以在Intel CPU机器上编译程序并在AMD CPU(同一操作系统)上运行它。那么它是否意味着CPU的指令集是相同的?
为什么不同的程序在具有不同操作系统和相同CPU的计算机上运行?
答案 0 :(得分:2)
目标文件的二进制设置完全不同。还有哪些库可用或如何调用它们。
只需比较ELF或EXE文件的标题即可查看我的意思。
如果你编写一个简单的程序,比如“main(){printf(”Hello \ n“);返回0;}后面会有大量的事情发生在编译器覆盖的后面,以便打印这些行。在同一个CPU上没有用,因为它可以执行汇编指令,但只要调用第一个OS函数就会失败。
详细说明一下:
就像一个例子。让我们假设我们在带有Motorola 68000 CPU的Amiga OS上运行。
如果我没记错的话,调用系统库的调用会话包括将指针加载到CPU的地址寄存器中,然后调用OS函数。
现在假设我也使用Motorola 68000 CPU编写自己的操作系统。但是,当我设计我的操作系统时,我认为使用堆栈进行数据交换是一个好主意,所以当你在我自己的私有操作系统中调用类似的函数时,你不会在地址寄存器中传递地址,而是你把它推到堆栈上。 现在,当你的可执行文件将在我的操作系统中执行时(假设它可以加载,因为我使用相同的对象结构),你的可执行文件会将值放入寄存器中,我的操作系统会尝试从堆栈中弹出它们,因为它不知道它所寻找的价值应该是其他的。
我希望这一点更加详细,以便您能够理解它,但当然问题会更深入,因为这只是所涉及问题的一小部分。
答案 1 :(得分:2)
您的Intel和AMD都使用x86(或x86-64)架构。这就是为什么你可以在两者上运行相同的软件。但是,编译的程序不仅包含对体系结构的依赖性,还包含对底层操作系统的依赖性。例如,即使Linux可执行文件的二进制格式也不同于Windows。
然而,您可以使用一个简单的C程序,该程序使用C标准库并在不同的操作系统和处理器体系结构中进行编译。只要您的代码不包含与操作系统相关的代码,它就会跨操作系统移植。同样,如果您的代码不依赖于底层架构endianess,它将跨越架构。
约翰。