不同O.S.s但相同处理器的汇编代码是相同还是不同?

时间:2013-02-24 10:08:20

标签: assembly compiler-construction linker cpu-architecture

编译C / C ++代码时,会生成汇编代码。 如果我有Windows和Linux双启动(即完全相同的处理器),我在Windows和Linux上用C ++编写程序,那么

编译后(汇总之前)的汇编代码对于不同的汇总代码是相同的吗?

我的意思是可执行文件之间的区别是链接器,写吗? 但我不是在讨论可执行文件......我在谈论汇编代码之前是链接。

如果两个汇编代码不同,那么它们为何以及如何不同?

图书馆是预编译的,这可能是我认为的差异(如果不是请纠正我)。 但是如果我不使用库呢?

2 个答案:

答案 0 :(得分:4)

不同的操作系统使用不同的可执行文件格式。

他们还通过不同的API提供功能(fopen()最终将使用CreateFileA()int 0x2E在32位Windows和sysenter上调用open()在32位Linux上使用int 0x80,以不同的方式在内部运行。因此,对于Windows和Linux,程序的fopen()中会有不同的代码。

不同的编译器可能使用不同的默认调用约定,或者相同的编译器可以对不同的目标操作系统使用不同的调用约定。不同的优化和调试选项也会影响代码生成,即使在同一个编译器上也是如此。

最后,不同的编译器也可以生成截然不同的代码,即使你没有使用任何库也是一样的(一般来说这是一件毫无意义的事情)。这仅仅是因为他们没有使用完全相同的算法,并且不是由同一个人编写的,并且没有人要求所有编译器的行为相同。

无论如何,你的问题有什么意义?

答案 1 :(得分:1)

汇编代码将是相同的,只要您不必使用系统调用 - 这意味着您无法读取输入,也无法执行输出,甚至无法结束程序 - 什么都没有。

所以,除了一个完全无用的程序,它不能做输入和输出,你必须手动杀死你不能创建一个在几个操作系统上通过相同代码的二进制文件,在任何地方都做同样的事情。< / p>