Linux int 0x21和int 0x80之间的区别是什么?

Linux int 0x21和int 0x80之间的区别是什么?,linux,assembly,x86,system-calls,dos,Linux,Assembly,X86,System Calls,Dos,我最近进入了低级编程,学习了系统中断。据我所知,这两种中断都负责系统调用,但我不明白两者之间的区别,以及何时使用哪种中断。需要一个解释。int21h(用MASM/TASM语法拼写,因为这是最广泛使用的DOS汇编程序)是DOS的系统调用中断。您可以在internet上轻松找到可用服务的文档。您可以通过DOS程序访问的最重要的DOS服务的简短列表位于 另一方面,int0x80(用gas语法拼写,因为这是Linux的“本机”汇编程序)是32位intel处理器上Linux的系统调用中断。在如何使用它方面

我最近进入了低级编程,学习了系统中断。据我所知,这两种中断都负责系统调用,但我不明白两者之间的区别,以及何时使用哪种中断。需要一个解释。

int21h
(用MASM/TASM语法拼写,因为这是最广泛使用的DOS汇编程序)是DOS的系统调用中断。您可以在internet上轻松找到可用服务的文档。您可以通过DOS程序访问的最重要的DOS服务的简短列表位于

另一方面,
int0x80
(用gas语法拼写,因为这是Linux的“本机”汇编程序)是32位intel处理器上Linux的系统调用中断。在如何使用它方面,您并没有像在DOS中那样得到很好的表格,因为您通常不会直接调用它。如果您想直接调用它,请查看,找出需要设置哪些寄存器,以及在哪里可以找到结果。例如,您可以在中找到系统调用的编号

英特尔或80386处理器体系结构未定义程序调用
int 21h
int 0x80
时的行为。相反,
int
指令要求处理器在入口点表(“中断描述符表”)中查找入口点,并跳到该入口点。此跳转可能包括从用户空间切换到内核空间(如果处理器在支持不同特权级别的模式下运行)。DOS设置入口点编号21h,以指向提供大多数DOS服务的分派功能。另一方面,Linux/i386设置入口点编号0x80,以指向提供所有Linux内核服务的分派函数。这意味着使用
int 0x80
的程序只有在Linux(或兼容的windows subsystem for Linux,version 1)环境中执行时才能工作,而使用
int 21h
的程序只有在DOS(或兼容的环境,如DOSBox或OS/2 DOS窗口)下执行时才能工作.

不同操作系统的ABI(系统调用约定)基本不同。DOS和Linux(以及BSD/MacOS)也有不同的API、不同的函数集/系统调用,因此不一定存在等同于某些DOS东西的Linux系统调用,反之亦然。(尤其是对于BIOS int 0x10控制台屏幕的东西:在Linux中,您不需要为控制台屏幕和键盘进行特殊的系统调用,除非您打开原始键盘或USB HID或PS/2事件驱动程序,否则您总是在处理TTY层)这就像在问“DIR和ls之间有什么区别”。它们是两种不同的机制,通过这两种机制,两个不同的系统可以完成类似的任务。
int 21h
int 0x80
的处理程序的行为不由英特尔定义。另一方面,
int21h
int0x80
的行为完全是由Intel定义的。(这就是您详细解释的内容)Linux系统调用的“好表”如下所示。但是您不需要它们,因为了解调用约定可以让您知道从手册页中的C原型中哪个arg到了哪里。i、 e.ABI规则只记录一次,而不是针对每个系统调用单独记录,包括表示-errno(
-4095
-1
的值范围)