由于汇编语言实现了独立于操作系统的CPU指令的符号表示,而汇编程序总是在某些操作系统下运行,我想知道汇编语言如何依赖于操作系统?例如,对于具有不同操作系统的相同CPU,汇编语言是否相同?谢谢!
答案 0 :(得分:12)
正如其他人所指出的那样,系统调用和中断是不同的。我可以想到另外一些差异。
指令集在给定处理器上的所有操作系统上都是相同的,但可执行文件格式可能不是。例如,在x86上,Windows使用PE格式,Linux使用ELF,MacOS使用Mach-O。这意味着这些平台上的汇编程序必须以这些格式生成输出,这是不同的。
相关地,调用约定在不同的操作系统之间也可能不同。这可能只是你编写调用汇编代码或编译代码例程调用的汇编代码,或者你在某些编译代码中编写内联汇编程序的地方。调用约定控制在函数调用期间将哪些寄存器用于什么目的,因此不同的约定要求通过调用和调用代码来不同地使用寄存器。它们还对堆栈指针的位置以及其他各种事物施加约束。实际上,在许多情况下,调用约定历来是跨操作系统一致性的罕见示例:我相信x86上的Windows和UNIX调用约定是相同的(并且都基于古老的UNIX System V ABI规范),并且在大多数其他架构上,操作系统是一致的。但是,x86_64上的Windows和UNIX之间的约定现在不同。
此外,汇编语言使用的语法可能有所不同。同样在x86上,Windows和Linux汇编器过去常常使用不同的语法,Windows汇编程序使用Intel发明的语法,Linux汇编程序(实际上是GNU汇编程序)使用AT& T发明的传统UNIX语法。这些语法描述了相同的指令集,但编写的方式不同。如今,GNU汇编程序也可以理解Intel语法,因此差别较小。
答案 1 :(得分:4)
汇编语言不依赖于OS,而是依赖于CPU的指令集。
仅当您调用API函数(例如,MSVC中的内联汇编程序代码中的Windows API函数)时,才会获得操作系统依赖性。
答案 2 :(得分:4)
可用的指令(当然,每个指令的语义)取决于CPU,而不是操作系统 - 所以在某种程度上,你是对的。
对于大多数感兴趣的任务(例如I / O), 但,您必须与操作系统(进行系统调用)进行通信。这些事情的跨平台抽象在那个层面上不存在(例如,你可能尝试使用libc
,但即使这样你也需要知道所使用的调用约定,平台之间可能有所不同等等 - 最后,你必须自己投入相当多的工作来构建这样的抽象,所以AFAIK很少有人在组装中编程的人很少尝试),做一些不可能的事情(与OS无关的)CPU指令,您必须知道您正在编程的操作系统以及如何告诉操作系统执行此操作。
这不适用于例如内联汇编代码。 C代码,因为它主要用于以比编译器预期的更智能/更快的方式进行纯粹的CPU绑定计算。
答案 3 :(得分:2)
汇编语言应该是一样的;正如您所指出的,指令集仅取决于CPU及其架构设计。我相信,当你开始调用不同的操作系统时,你会遇到麻烦中断(通常用于I / O),这绝对意味着为例如写入的程序。 MSDOS不适用于例如Solaris(可能是个坏例子)。
答案 4 :(得分:2)
汇编程序将助记符(例如jump
,mov
,add
等)从汇编语言转换为机器指令。机器指令完全取决于硬件(它们代表硬件/ CPU指令集)。
如果你想要提出汇编语言,你还需要设计/编写一个汇编程序,它可以映射到机器指令。从这个意义上讲,如果您针对给定的机器架构,汇编器应该生成机器特定的代码,而不是特定于操作系统的代码。但是,汇编程序实现可能(并且通常是)特定于操作系统,因为它产生的输出程序(Unix可执行文件与Windows可执行文件不同,甚至虽然基础机器指令集是x86,例如)。
请参阅here我的意思。
答案 5 :(得分:2)
汇编语言与它无关,你可以提出你的问题(xyz语言如何依赖于操作系统),并使用C,pascal,ada,fortran和一长串其他语言,并提出相同的问题同样的答案,语言与它无关。使用操作系统的调用约定系统调用操作系统是重要的, IF 您使用相同的语言或具有与操作系统定义相同的调用约定的语言,这使得生活更容易,但不会锁定任何东西。几乎任何语言都可以使用,因为你可能知道,标准C,C ++等以及虚拟或运行时解释等java,perl,python,shell脚本,javascript等等。它们似乎都运行在我的身上电脑至少。某处(特定于语言)是一种垫片,使系统以操作系统定义的方式调用操作系统。 Asm使这些语言的生活变得简单,因为你不受任何规则的约束,你可以使用asm在语言调用约定和所需的操作系统调用之间进行填充。同样地,使用asm可以轻松地与任何调用约定接口,无论是语言定义还是操作系统定义。
另外,已经回答的汇编语言独立于操作系统或cpu上运行的任何其他软件。它直接绑定到cpu的指令集。现在有机器代码,处理器执行的实际位,那些不会改变,但用于表示那些指令的ascii文件,该语言可以改变而不是因为cpu和操作系统,这些差异必须要做用工具链。例如x86 att语法vs intel语法。相同的指令集,相同的机器代码,不同的汇编语言。如果你看看足够的tasm,masm等,x86有很多汇编程序,每个汇编程序都有自己的指令和其他工具链特有的细微差别。
答案 6 :(得分:1)
操作系统并不重要。你可以在不同的操作系统上使用相同的汇编程序,你可以在同一个操作系统上使用不同的编译器,嘿,你甚至可以交叉编译,针对不同的系统。