为什么像Windows,Linux这样的汇编语言有区别?
我对所有这些低级别的东西,汇编语言都比较陌生,并且想了解更多细节。 为什么Linux,Windows汇编语言有区别?
据我了解当我编译C代码操作系统并不真正产生纯粹的机器或汇编代码,它会产生操作系统相关的二进制代码。但为什么?
例如,当我使用x86系统时,CPU只能理解x86 ASM,对吗?因此,我们为什么不写纯x86汇编代码,以及为什么基于操作系统有不同的汇编变体? 如果我们编写纯ASM或OS来生成纯ASM,那么在操作系统之间不会有二进制兼容性问题,或者不是?
我真的很想知道背后的所有原因。 任何详细的答案,文章,书会很好。 谢谢。
没有区别。 如果处理器是相同的,汇编代码是相同的。 在Windows上编译的x86代码与Linux上的x86代码二进制兼容。 编译器不会生成操作系统相关的二进制代码,但它可能会以不同的格式打包代码(例如,PE与ELF)。
不同之处在于使用了哪些库。 为了使用操作系统的东西(例如I / O),您必须链接到操作系统的库。 毫不奇怪,Windows系统库在Linux机器上不可用(除非你有Wine),反之亦然。
除了其他答案。
OS指定其应用程序二进制接口(ABI),其中包含可执行对象的格式。 这些是适用于Linux(以及许多其他类Unix系统)的可执行文件和可链接格式(ELF),以及Windows上的可移植可执行文件(PE)。 有关其他格式,请参阅此表格。
那么,你不直接组装。 代码必须采用某种可执行格式:windows使用PE,大多数Unices现在使用ELF(尽管还有其他的,如a.out)。
基本汇编指令是相同的,您使用它们创建的功能是相同的。
访问其他资源会带来问题。 处理器非常擅长计算,但不能访问硬盘,或者在屏幕上打印字符,或者连接到蓝牙手机。 这些元素总是以某种方式依赖于操作系统。 它们是以系统调用的形式实现的,处理器向操作系统发出信号以执行特定的任务。 Linux上的任务编号17不一定是windows上的任务17; 他们甚至可能没有等值。
由于大多数库都有一些最低级的系统调用,这就是为什么代码不能在任何情况下都被重新编译的原因。
链接地址: http://www.djcxy.com/p/82361.html上一篇: Why There is a difference between assembly languages like Windows, Linux?