int 0x21 和 int 0x80 有什么区别?

What is the difference between int 0x21 and int 0x80?

我最近开始接触低级编程并了解了系统中断。据我了解,这两个中断都负责系统调用,但是我不明白两者之间的区别,以及何时使用哪个。希望得到解释。

int 21h(拼写为 MASM/TASM 语法,因为这是最广泛使用的 DOS 汇编程序)是 DOS 的系统调用中断。您可以在 Internet 上轻松找到可用服务的文档。您可以从 DOS 程序获得的最重要的 DOS 服务的简短列表位于 http://spike.scu.edu.au/~barry/interrupts.html.

另一方面,int 0x80(用 gas 语法拼写,因为这是 Linux 的“本地”汇编器)是 Linux 在 32- 上的系统调用中断位英特尔处理器。您不会像在 DOS 中那样了解如何使用它 tables,因为您通常不直接调用它。如果想直接调用,看the manpage for syscall, to find out what registers you need to set, and where you will find the result. You can find the number for the syscalls for example at https://fedora.juszkiewicz.com.pl/syscalls.html .

您的程序在调用 int 21hint 0x80 时的行为 不是 由 Intel 或 80386 处理器架构定义的。相反,int 指令要求处理器在入口点 table(“中断描述符 table”)中查找入口点,然后跳转到该入口点。此跳转可能包括从用户 space 切换到内核 space(如果处理器运行在支持不同特权级别的模式下)。 DOS 设置入口点编号 21h 以指向提供大多数 DOS 服务的调度函数。另一方面,Linux/i386 设置入口点编号 0x80 以指向提供所有 linux 内核服务的调度函数。这意味着使用 int 0x80 的程序只有在 Linux(或兼容的,如 Linux 的 windows 子系统,版本 1)环境中执行时才会工作,而使用 int 21h 的程序只有在 DOS(或 DOSBox 或 OS/2 DOS window 等兼容环境)下执行时才能运行。