首页 > 解决方案 > int 0x21 和 int 0x80 有什么区别?

问题描述

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

标签: linuxassemblyx86system-callsdos

解决方案


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

另一方面,int 0x80(用气体语法拼写,因为这是 Linux 的“本机”汇编程序)是 32 位英特尔处理器上 Linux 的系统调用中断。你没有得到关于如何使用它的漂亮表格,就像你在 DOS 中得到的那样,因为你通常不直接调用它。如果您想直接调用它,请查看syscall 的手册页,找出您需要设置哪些寄存器,以及在哪里可以找到结果。例如,您可以在https://fedora.juszkiewicz.com.pl/syscalls.html找到系统调用的编号。

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


推荐阅读