为什么Windows,Linux等汇编语言之间存在差异?

cal*_*tas 19 x86 assembly operating-system

我对所有这些低级别的东西,汇编语言相对较新.并且想要了解更多细节.为什么Linux,Windows汇编语言之间存在差异?

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

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

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

Sto*_*ica 22

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

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

  • @mcaaltuntas:没有.有x86程序集,x86_64程序集,mips程序集,m68k程序集......不是linux程序集或windows程序集 (5认同)

Mic*_*man 7

好吧,你没有直接组装.代码必须采用某种可执行格式:windows使用PE,大多数Unices现在都使用ELF(尽管还有其他的,比如a.out).

基本组装说明是相同的,您使用它们创建的功能是相同的.

问题在于访问其他资源.处理器非常擅长计算,但无法访问硬盘,或者无法在屏幕上打印字符或连接到蓝牙手机.这些元素总是以某种方式依赖于操作系统.它们是根据系统调用实现的,其中处理器通知操作系统执行某项任务.linux上的任务号17不一定是Windows上的任务17; 他们甚至可能没有等价物.

由于大多数库都有一些最低级别的系统调用,这就是为什么不能在每种情况下重新编译代码的原因.


Nik*_*sov 5

除了其他答案.

OS指示其应用程序二进制接口(ABI),其包括可执行对象的格式.这些是Linux(以及许多其他类Unix系统)的可执行和可链接格式(ELF),以及Windows上的可移植可执行文件(PE).有关其他格式,请参阅此表.