Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 不同操作系统的汇编程序输出是否不同?_Compiler Construction_Assembly - Fatal编程技术网

Compiler construction 不同操作系统的汇编程序输出是否不同?

Compiler construction 不同操作系统的汇编程序输出是否不同?,compiler-construction,assembly,Compiler Construction,Assembly,汇编程序从C源代码生成的汇编代码取决于其底层的CPU体系结构,例如x-86 那么,简单C源代码(包含windows和linux的通用函数调用)的汇编程序输出是否在操作系统之间有所不同?汇编代码可能在具有相同机器操作码的平台之间不会有所不同,但在汇编程序之间会有所不同gas(GNU汇编程序)输出应该可以在任何支持它的平台下进行汇编,但不能在nasm(Netwide汇编程序)下进行编译。汇编代码在具有相同机器操作码的平台之间不能变化,但在汇编程序之间确实会变化gas(GNU汇编程序)输出应该可以在任

汇编程序从C源代码生成的汇编代码取决于其底层的CPU体系结构,例如x-86


那么,简单C源代码(包含windows和linux的通用函数调用)的汇编程序输出是否在操作系统之间有所不同?

汇编代码可能在具有相同机器操作码的平台之间不会有所不同,但在汇编程序之间会有所不同
gas(GNU汇编程序)输出应该可以在任何支持它的平台下进行汇编,但不能在
nasm(Netwide汇编程序)下进行编译。

汇编代码在具有相同机器操作码的平台之间不能变化,但在汇编程序之间确实会变化
gas(GNU汇编程序)输出应该可以在任何支持它的平台下进行汇编,但不能在nasm(Netwide汇编程序)下进行编译。

这是一个很难回答的问题。如果我编译以下代码:

void f() {
  int x = 0;
  x = x + 1;
}
对于两个平台上的.o文件(即未链接),我是否会认为x86输出是相同的


答:可能。但如果不是,我也不会感到惊讶。

这是一个很难回答的问题。如果我编译以下代码:

void f() {
  int x = 0;
  x = x + 1;
}
对于两个平台上的.o文件(即未链接),我是否会认为x86输出是相同的


答:可能。但如果不是这样,我也不会感到惊讶。

汇编程序实际上取决于底层架构,而不是操作系统本身。因此,汇编生成的代码在整个OSs中应该是相同的

但是,也有一些凸点:

  • OSs通常有不同的调用约定,这些约定可能会暴露给用户应用程序。但这会在程序集中体现出来,因此程序集本身可能需要有所不同

  • OSs也会有不同的链接约定(例如静态链接与动态链接等)。因此,最终的可执行文件可能会有所不同

  • 仅仅因为生成的文件是相同的,并不意味着生成的对象文件是可移植的。对于系统调用,中断处理程序id因操作系统而异。因此,如果在ASM中硬编码系统调用所需的中断,则该代码可能不会在不同的OS中运行


  • 汇编程序实际上依赖于底层架构,而不是操作系统本身。因此,汇编生成的代码在整个OSs中应该是相同的

    但是,也有一些凸点:

  • OSs通常有不同的调用约定,这些约定可能会暴露给用户应用程序。但这会在程序集中体现出来,因此程序集本身可能需要有所不同

  • OSs也会有不同的链接约定(例如静态链接与动态链接等)。因此,最终的可执行文件可能会有所不同

  • 仅仅因为生成的文件是相同的,并不意味着生成的对象文件是可移植的。对于系统调用,中断处理程序id因操作系统而异。因此,如果在ASM中硬编码系统调用所需的中断,则该代码可能不会在不同的OS中运行


  • 如果使用不同的编译器、同一编译器的不同版本或编译器的不同标志,则所有赌注都是无效的。需要不同的汇编代码。如果您正在组装一个实际的.asm文件,那么生成的代码应该是相同的,但打包到可执行文件中的方式不同。在共享对象或DLL中调用函数显然取决于所使用的操作系统。

    如果您使用不同的编译器、同一编译器的不同版本或编译器的不同标志,则所有赌注都是无效的。需要不同的汇编代码。如果您正在组装一个实际的.asm文件,那么生成的代码应该是相同的,但打包到可执行文件中的方式不同。在共享对象或DLL中调用函数显然取决于所使用的操作系统。

    不同编译器的输出会有所不同,包括从一个gcc版本到另一个gcc版本,从一个发行版到另一个发行版,或在同一台机器上。基本上答案是肯定的,产出可以而且将有很大的变化。一开始,你可能会根据代码和编译器选项发现差异,但你尝试的不同机器越多,32位机器和64位机器,同一发行版中的细微更新差异等等。一个常见的误解是C源代码到此结束,程序完成,性能完成,事实上,即使在使用同一个编译器的同一台机器上,从C到二进制还有大量的变体,每个变体都有特性和问题,是否可调试,性能与否,编译器的错误与否。对于足够大的程序,通过在编译器上使用不同的开关或使用更好的编译器,可以很容易地证明性能提高了几倍。
    无论您是编译到asm还是对象(取决于编译器可以并且将在汇编的临时asm文件处停止,然后丢弃中间文件),指令的顺序和选择都会有所不同。即使是一个稍微简单的程序,也可以尝试使用或不使用调试工具(-g,我想是的,我从来没有使用过),以及各种优化级别-O0,-O1,-O2,-O3。8个组合,您应该会得到一些不同的结果,特别是从没有优化到某些优化。

    不同的编译器的输出会有所不同,包括从一个gcc版本到另一个gcc版本,从一个发行版到另一个发行版,或在同一台机器上。基本上答案是肯定的,产出可以而且将有很大的变化。说你可能一开始并没有发现差异,这取决于代码和编译器选项,但是你尝试的不同机器越多,32位机器和64位机器,更新的差异就越小