受此问题的启发
How can I force GDB to disassemble?
我想知道INT 21h是一个概念。现在,我对内部有一些非常生疏的知识,但没有那么多细节。我记得在C64中你有定期中断和不可屏蔽中断,但我的知识在这里停止。你能告诉我一些线索吗?这是DOS相关策略吗?
答案 0 :(得分:12)
来自here: 多用途DOS中断,用于各种功能,包括读取键盘和写入控制台和打印机。它还用于使用早期的文件控制块(FCB)方法读取和写入磁盘。
答案 1 :(得分:9)
int 21h
是一个简单的硬件“技巧”,可以轻松地从此库中调用代码,而无需事先知道它将在内存中的位置。或者,您可以将其视为使用DOS API的方法。
现在,软件中断的主题很复杂,部分原因是随着时间的推移,随着英特尔为x86系列添加功能,同时尝试与旧软件保持兼容,这些概念也在不断发展。一个正确的解释需要几页,但我会尽量简短。
主要问题是您是处于实模式还是受保护模式。
实模式是x86处理器的简单“原始”操作模式。这是DOS运行的模式(当您在Windows下运行DOS程序时,实模式处理器是虚拟化的,因此在其中适用相同的规则)。当前运行的程序可以完全控制处理器。
在实模式下,有一个向量表告诉处理器从0到255的每个中断跳转到哪个地址。这个表由BIOS和DOS以及设备驱动程序填充,有时还有特殊的程序需要。这些中断中的一些可以由硬件生成(例如通过按键)。其他由某些软件条件生成(例如除以0)。 可以通过执行 int n
指令生成中的任何。
程序可以设置/清除“启用中断”标志;此标志仅影响硬件中断,不会影响 int
指令。
DOS设计人员选择使用中断号码21h来处理DOS请求 - 这个数字没有实际意义:它当时只是一个未使用的条目。还有很多其他的(例如,10h是BIOS安装的中断例程,用于处理图形)。另请注意,所有这些仅适用于IBM PC兼容机。嵌入式系统中的x86处理器的软件和中断表排列方式可能完全不同!
保护模式是一种复杂的“安全感知”模式,它在286处理器中引入,并在386上进行了大量扩展。它提供了多个权限级别。操作系统必须配置所有这些(如果操作系统出错,则可能存在安全漏洞)。用户程序通常局限于“最小权限”操作模式,其中尝试访问硬件端口,或更改中断标志,或访问某些内存区域,停止程序并允许操作系统决定做什么(终止程序或给程序看起来想要的东西。)
中断处理变得更加复杂。可以说,通常情况下,如果用户程序执行软件中断,则中断号不用作中断表的向量。而是生成一般保护异常,并且所述异常的OS处理程序(如果OS是以这种方式设计的)可以计算出该过程想要的内容并为该请求提供服务。我非常确定Linux和Windows过去(如果不是当前)使用这种机制进行系统调用。但是还有其他方法可以实现这一点,例如SYSENTER指令。
答案 2 :(得分:7)
Ralph Brown's interrupt list包含很多关于哪个中断做什么的信息。与所有其他人一样,int 21支持各种功能,具体取决于寄存器值。
答案 3 :(得分:3)
INT指令是软件中断。它会跳转到中断向量所指向的例程,该中断向量是内存中的固定位置。 INT指令的优点是只有2个字节长,对于JMP可能只有6个字节,并且可以通过修改中断向量的内容轻松地重定向。
答案 4 :(得分:2)
这是关于中断的伟大The Art of Assembly Language Programming:
在80x86上,通常有三种类型的事件 中断:陷阱,异常和中断(硬件中断)。 本章将描述每种形式并讨论它们 支持80x86 CPU和PC兼容机。
虽然术语陷阱和异常通常是同义词,但我们 将使用术语陷阱来表示已启动和预期的程序员 将控制转移到特殊处理程序例程。在许多方面,a 陷阱只不过是一个专门的子程序调用。很多文字 将陷阱称为软件中断。 80x86 int指令是 执行陷阱的主要工具。请注意,陷阱通常是 无条件的;也就是说,当你执行一个int指令时,控制 始终转移到与陷阱关联的过程。以来 陷阱通过显式指令执行,很容易确定 程序中的哪些指令将调用陷阱处理 例程。
Chapter 17 - Interrupt Structure and Interrupt Service Routines
答案 5 :(得分:2)
Int 0x21是一个x86软件中断 - 基本上这意味着在内存中的一个固定点有一个中断表,列出软件中断函数的地址。当x86 CPU收到中断操作码(或以其他方式决定应该执行特定的软件中断)时,它会引用该表来执行对该点的调用(此时的函数必须使用iret
而不是{{ 1}}返回)。
可以重新映射Int 0x21和其他软件中断(即使在DOS内也可能有负面影响)。一个有趣的映射或链的软件中断是Int 0x1C(如果你小心,则为0x08),这是系统节拍中断,每秒调用18.2次。这可用于创建“后台”进程,即使在单线程实模式下(实模式进程将被中断18.2次,以调用您的中断函数)。
在DOS操作系统(或提供某些DOS仿真的系统,如Windows控制台)上,Int 0x21映射到DOS操作系统的主要“API”。通过为AH寄存器提供不同的值,可以执行不同的DOS功能,例如打开文件(AH = 0x3D)或打印到屏幕(AH = 0x09)。
答案 6 :(得分:1)
(几乎)整个DOS接口可用作INT21h命令,各种寄存器中有参数。这是一个小技巧,使用内置硬件表跳转到正确的代码。 INT 33h也适用于鼠标。
答案 7 :(得分:1)
这是一个“软件中断”;所以根本不是硬件中断。
当应用程序调用软件中断时,它与进行子程序调用基本相同,除了(与子程序调用不同)之外,不需要知道它调用的代码的确切内存地址。
系统软件(例如DOS和BIOS)将其API作为软件中断公开给应用程序。
因此软件中断是一种动态链接。
答案 8 :(得分:0)
准确地说,这里是R. Brown的INT 21H命令列表的直接链接:http://www.ctyme.com/intr/int-21.htm
答案 9 :(得分:0)
实际上,这里有很多概念。让我们从基础开始。
中断是要求CPU注意,中断当前程序流,跳转到中断处理程序(ISR - 中断服务程序),做一些工作(通常由OS)内核或设备驱动程序)然后返回。
中断有哪些典型用途?
CPU决定跳转到查看表的位置(异常向量,中断向量,x86实模式下的IVT,x86保护模式下的IDT,......)。有些CPU有一个用于硬件中断的向量,另一个用于异常等等,ISR必须做一些工作来识别中断的发起者。其他人有很多向量,并直接跳到非常具体的ISR。
x86有256个中断向量。在原始PC上,这些被分成几组:
00-04
CPU异常,包括NMI。对于后来的CPU(80186,286,...),此范围扩展,与以下范围重叠。08-0F
这些是硬件中断,通常称为IRQ0-7。 PC-AT添加了IRQ8-15 10-1F
BIOS调用。从概念上讲,这些可以被视为系统调用,因为BIOS是DOS的一部分,它取决于具体的机器(这就是它在CP / M中的定义)。20-2F
DOS调用。其中一些是多路复用的,并提供多种功能。主要的是INT 21h,它提供大多数DOS服务。30-FF
其余的,供外部驱动程序和用户程序使用。