【问题标题】:Why is Linux assembly code different from Windows for the same x86 architecture?为什么相同 x86 架构的 Linux 汇编代码与 Windows 不同?
【发布时间】:2021-09-16 13:54:30
【问题描述】:

我从事微处理器组装编程已经有一段时间了,我想进入 PC 操作系统。我对在相同架构下运行的两个操作系统具有相同程序的不同汇编代码感到困惑。指令集不一样吗?

我肯定会混淆概念。

有人能解释一下吗?

谢谢

【问题讨论】:

  • 指令集是一样的,调用约定、系统调用和其他操作系统的具体细节不一样。此外,根据您所查看的内容,您的代码可能适用于具有不同语法的不同汇编程序。
  • 这也取决于用于将程序从高级语言转换为汇编语言的编译器。即使对于 same 操作系统,也有两个编译器,例如gcc 和 clang 会生成不同的代码。 same 编译器将根据选择的编译器选项生成不同的代码。
  • 为什么它们应该是一样的?如果他们是相同的,那么哪一方将负责为其他所有人做出决定?
  • 你应该用具体的例子来编辑你的问题,让人们不必猜测。

标签: linux windows assembly operating-system


【解决方案1】:

有人能解释一下吗?

您可能会看到的差异:

  1. 有多种组装方言。 2 种主要方言是 MASM(由 Microsoft 发明并被他们的工具首选)和 AT&T(为 *nix 克隆设计的工具的默认设置)。这些是非常不同的方言 - 不同的操作数顺序,AT&T 在指令上使用大小后缀(例如 movl 表示您正在移动 long 而不是 mov,其大小从操作数推断),不同的操作数格式(例如 @ MASM/Intel 语法中的 987654326@ 变得不直观,就像 AT&T 中的 1234(%rax,%rbx,4)) 等。

  2. 对于 64 位代码;有不同的调用约定 - Microsoft x64 calling convention (used for everything in Windows)System V AMD64 ABI (used by *nix clones)。这会导致寄存器使用和堆栈管理的差异。

  3. 底层接口不同(例如VirtualAlloc()mmap()WaitForSingleObject()pthread_mutex_lock() 等)。请注意,这与内核系统调用无关(始终涉及用户空间库,并且不应直接使用内核系统调用)-这是关于系统库提供的“Win32 API”与“POSIX API”。即使使用兼容性包装器(例如 Windows 上的 Cygwin 的 POSIX 库),这些差异仍然可以进入汇编代码(通过头文件中的宏等)。

【讨论】:

  • 希望您不介意我改进了您的列表格式并添加了两个源链接。
【解决方案2】:

应该与您从事的其他工作没有什么不同。如果问题是同一台机器/平台上的 linux vs windows,那么显然它是相同的指令集。

如您所知,汇编语言特定于工具、汇编器,而不是目标,对于 x86 来说,同一指令集有无数不同的不兼容的汇编语言(不仅仅是一些 at&t 与 intel 的东西,许多不兼容的 at&t 汇编同一处理器的语言)。因此,例如,您可以走 gnu 和/或 llvm 路线,就汇编语言而言,体验可以/将是相同的。

但是当你进入操作系统时,没有理由假设具有不同操作系统的相同处理器具有相同的系统调用,它们可能使用相同的指令来执行系统调用,但总是假设操作系统之间的调用不同并且不时在同一个操作系统系列中。

所以 C 库连接到系统的方式预计会有所不同,但这就是为什么会有这些层的库是吗?

如果您坚持说同一平台上的操作系统之间的相同版本的 gnu 工具等,理想情况下的高级(C、C++)调用约定将是相同的。但这可能会有所不同,gnu 工具有选项,并且有人编译了编译器本身并且它有选项。

如果您不打算在汇编语言级别上工作,或者如果它是最小的(应该是)那么大部分都是无关紧要的,指令集就像法语、西班牙语或英语,而操作系统是生物学书籍或言情小说等。从程序员的角度来看(不包括性能调整),您使用某种高级语言进行编程,而低级目标是低级目标。就像纸、墨水和书中的字母一样,这只是传递信息的载体。

虽然假设 gcc、clang 等在该工具中是相同的 C 和 asm 编程语言,但这并不意味着,正如 cmets 中所指出的那样,每个平台上的编译器都会从相同的高度生成相同的确切代码级别代码(永远不要指望这一点)。工具的本机版本即使来自相同的原始代码库,对于每个目标也会有所不同,主要是在系统调用和链接器脚本中,但是工具的构建者可能已经选择了其他选项并且没有理由假设某些发行版的 linux 工具的构建器与某些预构建的 windows 二进制文件的相同工具的构建器相同...

如果你有微处理器和汇编语言以及所有这些方面的经验,你就会知道所有这些,所以这个问题很令人困惑

【讨论】:

  • Windows 上的 GNU 工具链以原生 Windows 调用约定为目标。 (包括 Cygwin)。铿锵声也一样。 Why does Windows64 use a different calling convention from all other OSes on x86-64?。可以为 Windows 构建或下载 i686-linux-elf 交叉编译器,或者甚至可以使用 x86-64 System V 在函数之间调用的编译器,但仍然是 MS-abi 用于调用所有其他函数(即 Windows DLL)。
  • 除非您的意思是“理想情况下”为“您希望他们完成的事情”。
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 2016-02-08
  • 2019-09-09
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2010-12-19
  • 2016-11-28
相关资源
最近更新 更多