编译 C/C++ 代码时,它会生成汇编代码。如果我有 Windows 和 Linux 双启动(即完全相同的处理器)并且我在 Windows 和 Linux 上都用 C++ 编写了一个程序,那么
编译后(链接前)的汇编代码是否相同?
我的意思是可执行文件之间的区别是链接器,写?但我不是在谈论可执行文件......我在谈论链接之前的汇编代码。
如果两个汇编代码不同,那么它们为什么以及如何不同?
库是预编译的,所以我认为这可能是不同的(如果不是,请纠正我)。但是如果我不使用库怎么办?
编译 C/C++ 代码时,它会生成汇编代码。如果我有 Windows 和 Linux 双启动(即完全相同的处理器)并且我在 Windows 和 Linux 上都用 C++ 编写了一个程序,那么
编译后(链接前)的汇编代码是否相同?
我的意思是可执行文件之间的区别是链接器,写?但我不是在谈论可执行文件......我在谈论链接之前的汇编代码。
如果两个汇编代码不同,那么它们为什么以及如何不同?
库是预编译的,所以我认为这可能是不同的(如果不是,请纠正我)。但是如果我不使用库怎么办?
不同的操作系统使用不同的可执行文件格式。
它们还通过不同的 API(fopen()
最终将在 32 位 Windows 上调用CreateFileA()
或在 32位int 0x2E
Linux上调用)提供其功能,这些 API在内部以不同的方式运行。因此,在您的Windows 和 Linux程序中会有不同的代码。sysenter
open()
int 0x80
fopen()
不同的编译器可能使用不同的默认调用约定,或者同一个编译器可以对不同的目标操作系统使用不同的调用约定。即使在同一个编译器上,不同的优化和调试选项也会影响代码生成。
最后,即使您不使用任何库,即使其他一切都相同,不同的编译器也可以生成截然不同的代码(这通常是没有意义的事情)。这仅仅是因为它们没有使用完全相同的算法,也不是由同一个人编写的,而且没有人要求所有编译器的行为都相同。
无论如何,你的问题有什么意义?
只要您不必使用系统调用,汇编代码将是相同的——这意味着您不能读取输入,也不能执行输出,甚至不能结束程序——什么都没有。
所以,除了一个完全无用的程序,它不能进行输入和输出并且你必须手动杀死之外,你不能创建一个在多个操作系统上通过相同代码的二进制文件,在任何地方都做同样的事情。