汇编程序输出在操作系统之间有区别吗?

时间:2010-01-15 14:50:24

标签: compiler-construction assembly

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

然后,操作系统之间的简单C源代码(包含windows和linux的常见函数调用)的汇编器输出是否不同?

5 个答案:

答案 0 :(得分:3)

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

void f() {
  int x = 0;
  x = x + 1;
}

到两个平台上的.o文件(即没有链接),我会将x86输出视为相同吗?

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

答案 1 :(得分:2)

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

然而,有一些对话:

  1. 操作系统通常具有可能暴露给用户态应用程序的不同调用约定。这虽然体现在装配中,但装配本身可能需要不同。

  2. 操作系统也有不同的链接约定(例如静态链接与动态链接等)。所以最终的可执行文件可能会有所不同。

  3. 仅仅因为生成的文件是相同的,并不意味着生成的目标文件是可移植的。对于系统调用,OS之间的中断处理程序ID不同。因此,如果您在ASM中对系统调用所需的中断进行硬编码,则该代码可能无法在不同的操作系统中运行。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您使用不同的编译器,相同编译器的不同版本或编译器的不同标志,则所有投注都将关闭。期待不同的汇编代码。如果要组装实际的.asm文件,则生成的代码应该相同,但将以不同方式打包到可执行文件中。在共享对象或DLL中调用函数显然取决于使用的操作系统。

答案 4 :(得分:0)

输出将随编译器而变化,包括从一个gcc版本到另一个版本,从一个发行版上的一个gcc到另一个版本,或者在同一台机器上。基本上答案是肯定的,输出可以并且将会有很大差异。根据代码并且取决于你的编译器选项,你可能没有找到差异,但你尝试的机器越多,32位机器和64位,同一发行版中的微妙更新差异等。一个常见的误解是C源代码是它的结尾,程序完成,性能完成等等。实际上,即使在使用相同编译器的同一台机器上,仍然存在大量从C到二进制的变化,每个变体都有功能和问题,可调试与否,性能与否,编译器的错误与否。有了足够大的程序,通过在编译器上使用不同的开关或使用更好的编译器,可以很容易地演示几次性能提升。 如果你正在编译asm或一个对象(这取决于编译器可以并将停止在一个临时的asm文件组装然后丢弃中间文件)并不重要,指令的顺序和选择会有所不同。即使是一个有点简单的程序尝试使用或不使用调试内容(-g我认为是,我从不使用它),以及各种优化级别-O0,-O1,-O2,-O3。在那里有8种组合,你应该得到一些不同的结果,特别是从没有优化到一些优化。