1

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

编译后(链接前)的汇编代码是否相同?

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

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

库是预编译的,所以我认为这可能是不同的(如果不是,请纠正我)。但是如果我不使用库怎么办?

4

2 回答 2

4

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

它们还通过不同的 API(fopen()最终将在 32 位 Windows 上调用CreateFileA()或在 32位int 0x2ELinux上调用)提供其功能,这些 API在内部以不同的方式运行。因此,在您的Windows 和 Linux程序中会有不同的代码。sysenteropen()int 0x80fopen()

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

最后,即使您不使用任何库,即使其他一切都相同,不同的编译器也可以生成截然不同的代码(这通常是没有意义的事情)。这仅仅是因为它们没有使用完全相同的算法,也不是由同一个人编写的,而且没有人要求所有编译器的行为都相同。

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

于 2013-02-24T10:45:12.440 回答
1

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

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

于 2013-02-24T10:18:24.850 回答