Tim*_*Tim 10 assembly operating-system
由于汇编语言实现了独立于操作系统的CPU指令的符号表示,而汇编程序总是在某些操作系统下运行,我想知道汇编语言如何依赖于操作系统?例如,对于具有不同操作系统的相同CPU,汇编语言是否相同?谢谢!
Tom*_*son 12
正如其他人所指出的那样,系统调用和中断是不同的.我可以想到另外一些差异.
指令集在给定处理器上的所有操作系统上是相同的,但可执行文件格式可能不是.例如,在x86上,Windows使用PE格式,Linux使用ELF,MacOS使用Mach-O.这意味着这些平台上的汇编程序必须以这些格式生成输出,这是不同的.
相关地,调用约定在不同的OS之间也可以是不同的.这可能只是你编写调用汇编代码或编译代码例程调用的汇编代码,或者你在某些编译代码中编写内联汇编程序的地方.调用约定控制在函数调用期间将哪些寄存器用于什么目的,因此不同的约定要求通过调用和调用代码来不同地使用寄存器.它们还对堆栈指针的位置以及其他各种事物施加约束.实际上,在许多情况下,调用约定历来是跨操作系统一致性的罕见示例:我相信x86上的Windows和UNIX调用约定是相同的(并且都基于古老的UNIX System V ABI规范),并且在大多数其他架构上,操作系统是一致的.但是,x86_64上的Windows和UNIX之间的约定现在不同.
此外,汇编语言使用的语法可能存在差异.同样在x86上,Windows和Linux汇编器过去常常使用不同的语法,Windows汇编程序使用英特尔发明的语法,Linux汇编程序(实际上是GNU汇编程序)使用AT&T发明的传统UNIX语法.这些语法描述了相同的指令集,但编写的方式不同.如今,GNU汇编程序也可以理解Intel语法,因此差别较小.
小智 5
可用的指令(当然还有每条指令的语义)取决于 CPU,而不是操作系统 - 所以在某种程度上,你是对的。
但是对于大多数感兴趣的任务(例如 I/O),您必须与操作系统对话(进行系统调用)。在该级别上不存在对这些事物的跨平台抽象(好吧,您可以尝试使用libc例如,但即便如此,您仍需要知道所使用的调用约定,这可能因平台而异,等等 - 最后,您必须自己投入大量工作来构建这样的抽象,因此 AFAIK 为数不多的在汇编中编程的人中很少有人费心去尝试),要使用(独立于操作系统的)CPU 指令做一些不可能的事情,您必须知道您正在为什么操作系统编程以及如何告诉该操作系统执行此操作。
这不适用于例如 C 代码中的内联汇编代码,因为它主要用于以比编译器预期的更智能/更快的方式进行纯粹的 CPU 绑定计算)。