assembly - 为什么像 Windows、Linux 这样的汇编语言之间存在差异?

标签 assembly operating-system x86

我对所有这些低级的东西、汇编语言都比较陌生。我想了解更多细节。为什么 Linux 和 Windows 汇编语言之间存在差异?

据我了解,当我编译 C 代码时,操作系统并不会真正产生纯机器或汇编代码,它会产生依赖于操作系统的二进制代码。但为什么呢?

例如,当我使用 x86 系统时,CPU 只理解 x86 ASM,我对吗?那么为什么我们不编写纯 x86 汇编代码,为什么基于操作系统会有不同的汇编变体?如果我们编写纯 ASM 或操作系统生成纯 ASM,那么操作系统之间不会存在二进制兼容性问题吗?

我真的很想知道他们背后的所有原因。任何详细的答案、文章、书籍都会很棒。谢谢。

最佳答案

没有区别。如果处理器相同,则汇编代码相同。在 Windows 上编译的 x86 代码与 Linux 上的 x86 代码二进制兼容。编译器不会生成依赖于操作系统的二进制代码,但它可能会以不同的格式打包代码(例如 PE 与 ELF)。

不同之处在于使用的库。为了使用操作系统的东西(例如 I/O),您必须链接操作系统的库。不出所料,Windows 系统库在 Linux 机器上不可用(当然除非你有 Wine),反之亦然。

关于assembly - 为什么像 Windows、Linux 这样的汇编语言之间存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605341/

相关文章:

assembly - 为什么对非核心响应/非核心请求的需求过多?

assembly - x86 128 位原子操作

assembly - ldr 中相同的源和目标寄存器

c - 编写 ARM 机器指令并从 C 执行它们(在 Raspberry pi 上)

multithreading - 操作系统是否知道应用程序线程?

linux - 在 Unix 中列出已完成的进程

c - 如何在 gcc/mingw 内联汇编中添加简单的 float4

linux - 我可以通过X86_64机器码获取内存访问信息吗?

c - 修改并汇编.s文件

Golang - 为什么在相似的机器上编译会导致二进制文件大小明显不同?