我编写了一些代码来制作自己的操作系统,并学习x86汇编语言。在学习x86汇编语言时,我开始思考中断的问题。请看下面的程序集代码:
mov ah, 2
mov dl, 'A'
int 0x21这段代码把'A‘打印到屏幕上。这是给的。
mov eax, 1
mov ebx, 0
int 0x80这段代码使程序退出。它适用于Linux。最后一个:
mov ah, 2
mov al, 1
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, 0
int 0x13我编写这段代码是为了从磁盘复制内核代码。此代码包含在MBR扇区中。因此,在执行此代码时,不存在操作系统。我有一个问题要问。
假设有人执行“int”指令来调用中断,如果在MBR扇区上执行“int”指令,则调用BIOS例程。但是我不知道这个“int”指令是在Linux还是Windows上执行的,会发生什么呢?它所指的Linux/Windows中断向量或BIOS例程是否与MBR扇区的情况相同?
坦率地说,我测试了在Linux上执行第一段代码的尝试,但没有成功。我认为“int”指令的结果取决于操作系统。如果不是事实,有没有人能告诉我真相或任何想法?
发布于 2017-02-24 13:41:58
int指令引发一个软件中断。这导致CPU从中断描述表(IDT)执行中断处理程序。在启动时,BIOS使用许多执行一些基本服务的中断处理程序来设置IDT。DOS将自己的中断处理程序添加到此表中,以提供特定于DOS的功能。
现代操作系统以保护模式运行。在这种模式下,BIOS服务不起作用,因为BIOS服务是写在实模式下执行的。现代操作系统通常将标准中断描述表替换为自定义表。因此,DOS和BIOS服务都不可用。
发布于 2017-02-25 02:04:40
INT指令触发异常,几乎就像除以零导致异常一样。区别在于INT允许您指定要触发的异常。
操作系统必须定义一个异常和中断处理程序表。表的位置和大小由硬件寄存器IDTR定义。各种异常(如除以零)都有指定的异常号。(INT允许指定任何异常号。)
请参阅table
当出现异常(或中断)时,CPU使用异常/中断号作为表中的索引,并调用特定的处理程序。
操作系统定义了中断和异常的表和处理程序,因此它们是不同数量的操作系统。
https://stackoverflow.com/questions/42439538
复制相似问题