中断分为硬件中断和软件中断,其中软件中断不可屏蔽,软件中断分为BIOS中断(10H ~ 1FH),DOS中断(20H ~ 3FH),以及 由系统或应用程序设置开发的自由中断(40H ~ FFH)。硬件中断又分外部中断和内部中断,其中内部中断不可屏蔽,外部中断可屏蔽。
按照中断是否可屏蔽,中断可分为可屏蔽中断和不可屏蔽中断(NMI, Non Maskable Interrupt)。
中断向量
中断向量表
在实模式(实地址模式)下,中断处理程序在中断向量表中设置。
中断向量表存放在0x00000~0x00400的位置,总共1024字节(1k),中断向量表钟最多256个中断向量,每个中断向量占4个字节。其中低2个字节存放中断处理程序所在段的偏移位置,高2个字节存放中断处理程序所在段的段基地址。
在x86体系中允许有256个中断, 中断号从0x00~0xff, 共256个中断.
依据:
INT imm8
imm8为1字节的立即数,0x00~0xff(即0~255),共256个中断号,这里的中断号就是中断向量。
查看中断向量表存放位置
中断向量表默认存放在0x00000开始(0x00000~0x00400)的位置,如果我们改变了中断向量表的存放位置,可以通过SIDT指令查看中断向量表的存放位置。
SIDT m
改变中断向量表存放位置
中断向量表默认存放在0x00000开始(0x00000~0x00400)的位置,我们可以通过LIDT指令修改中断向量表的存放位置。
LIDT m16&32
LIDT m16&64
中断描述表
在保护模式下,中断处理程序在中断描述表(Interrupt Descriptor Table)中设置。
中断服务程序
中断请求
IRQ(Interupt ReQuest,中断请求)
中断请求
INTR(Interupt ReQuest,中断请求),这里指的是CPU处理器芯片上的一个引脚,
中断请求信号输入引脚。该中断请求信号是可屏蔽中断信号。
NMI(Non-Maskable Interrupt),这里指的也是中断请求,也是CPU处理器上的引脚,中断请求信号输入引脚。该中断请求信号是不可屏蔽中断信号。
中断响应
INTA(Interupt Acknowledge, 中断响应),和INTR类似,指的是CPU处理器芯片上的一个引脚,中断响应信号输出引脚。
中断调用
通过INT指令调用中断,调用时指定中断向量(中断号)。下面有一个例子。
中断调用例子
在32位windows下(保护模式)
dosbox:
安装
DOSBox0.74-2-win32-installer.exe
MASM Link16
DOS中断21H调用例子
以下例子,调用了3次中断:
_TEXT SEGMENT ; 键盘输入一个字符(AH=1) ; 输出显示一个字符(输入的字符) _main PROC NEAR ; 键盘输入一个字符(AH=1) MOV AH,1 INT 21H ; 输出显示一个字符(输入的字符) MOV DL, AL MOV AH, 02H INT 21H ; RETURN DOS MOV AH,4CH INT 21H _main ENDP _TEXT ENDS END
编译:
>ml /c inttest3.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: inttest3.asm
链接:
>link16 /ENTRY:main inttest3.obj
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
LINK : warning L4017: /ENTRY : unrecognized option name; option ignored
Run File [inttest3.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment
LINK : warning L4038: program has no starting address
运行:
>.\inttest3.exe
运行后,这里打印的不是'QQ', 而是提示输入,输入'Q'后,又打印了一个'Q'。
BIOS中断10H和键盘I/O中断16H调用例子
.model small ;.model flat OPTION CaseMap:None d=0 .data message db 'Welcome!', 0dh, 0ah db 'X2', 0dh, 0ah db 'version: 1.0.0 2010-02-14 Express Edition', 0dh, 0ah db '(c) Next G', 0dh, 0ah end1 db '$' ; command line mode _ip db 0dh, 0ah, '>' end2 db '$' _es DB 30 DUP(0), '$' .code _proc ; proc ascii ascii proc far mov si, 10 next: xor dx, dx div si add dx, '0' dec bx mov [bx], dl or ax, ax jnz next ret ascii endp ; proc sprint _sprint proc far next: mov ah, 0eh mov al, [bx] int 10h inc bx loop next ret _sprint endp .code start: mov ax, _DATA mov ds, ax mov dx, offset message ; mov dx, offset FLAT:message mov cx, offset end1 ; mov cx, offset FLAT:end1 sub cx, dx; the bytes of message in register cx .if d ; the offset of string in register dx ; 输出字符串,直到结束符'$' mov ah, 9 ; print s int 21h ; 21h .endif ; proc ascii call requires registers ax and bx ;mov ax, cx ;mov bx, offset _es + 29 ;call far ptr ascii mov bx, dx call far ptr _sprint next: mov bx, offset _ip mov cx, offset end2 sub cx, bx; the bytes of message in register cx call far ptr _sprint ; wait std input, input a character, and the character in register al mov ah, 0 int 16h mov dl, al ; 回车 mov ah, 0eh mov al, 0dh int 10h ; 换行 mov ah, 0eh mov al, 0ah int 10h ; 输出键入的字符 mov ah, 0eh mov al, dl int 10h ;如果键入回车就退出不再提示输入。这里键入回车时实际上包含回车、换行两个操 ;作,对应0dh(回车)和0ah(换行).这里判断是否为0dh(回车),是的话就退出。 cmp al, 0dh jne next mov ah,4ch int 21h end start
编译
>ml /c int10_0e_test.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: int10_0e_test.asm
链接
>link16 int10_0e_test.obj
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
Run File [int10_0e_test.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment
运行
>.\int10_0e_test
Welcome!
X2
version: 1.0.0 2010-02-14 Express Edition
(c) Next G
>
a
>
b
>
c
>
d
>
e
>
0
>
1
>
2
>
3
>
4
>
5
>
中断处理程序
中断处理程序样例
h_int32h PROC ... ... IRET h_int32h ENDP
获取中断
设置中断
编写中断处理程序
1、需要编写一个对应中断号的中断处理程序
实地址模式下编写中断处理程序
; Intel 8086, Real-Mode ;.8086 .MODEL SMALL OPTION CaseMap:None .DATA h_interrupt_process DB 0DH,0AH,'Handler for 32H interrupt process',0DH,0AH,'$' .CODE _H_INT_32H h_int32h PROC FAR MOV AX,_DATA MOV DS,AX MOV DX,OFFSET h_interrupt_process ; 字符串首偏移地址放到DX中 MOV AH,9 INT 21H ;输出字符串 IRET h_int32h ENDP ; 代码段, 简化的段定义书写形式.CODE 默认段名:_TEXT .CODE START: MOV AX,_DATA MOV DS,AX ; CALL FAR PTR h_int32h ; 设置32H号中断 CLI MOV AX, WORD PTR _H_INT_32H ;MOV AX, SEG _H_INT_32H ;MOV AX, SEG h_int32h MOV DS, AX MOV DX, FAR PTR h_int32h ;MOV DX, OFFSET h_int32h MOV AL, 32H MOV AH, 25H INT 21H STI ; 结束(设置32H号中断) ; 调用32H号中断 INT 32H MOV AH, 4CH INT 21H END START直接访问中断向量表的存储单元
; Intel 8086, Real-Mode ;.8086 .MODEL SMALL OPTION CaseMap:None .DATA h_interrupt_process DB 0DH,0AH,'Handler for 33H interrupt process',0DH,0AH,'$' .CODE _H_INT_33H h_int33h PROC FAR MOV AX, _DATA MOV DS, AX MOV DX, OFFSET h_interrupt_process ; 字符串首偏移地址放到DX中 MOV AH, 9 INT 21H ;输出字符串 IRET h_int33h ENDP ; 代码段, 简化的段定义书写形式.CODE 默认段名:_TEXT .CODE START: MOV AX,_DATA MOV DS,AX CALL FAR PTR h_int33h MOV AX, 33H MOV DX, 4 MUL DX ; result in register AX ; CCH(0xCC, 204, 33H*4, 0x33*4, 51*4) ;MOV BX, AX MOV BX, 33H*4 ;MOV BX, 204 ;MOV BX, 51*4 MOV AX, 0H MOV DS, AX MOV WORD PTR [BX], FAR PTR h_int33h ;MOV WORD PTR [BX], OFFSET h_int33h MOV WORD PTR [BX + 2], WORD PTR _H_INT_33H ;MOV WORD PTR [BX + 2], SEG h_int33h INT 33H MOV AH, 4CH INT 21H END START
void set_ir(u2 no, u2 base, u2 offset) { /* if (no < 0 || no > 255) { return; } */ asm("mov $0, %ax"); asm("mov %ax, %es"); asm("mov %0, %%ax" : : "m" (no)); asm("mov $4, %dx"); asm("mul %dx"); asm("mov %ax, %bx"); asm("movw %0, %%dx" : : "m" (offset)); asm("movw %dx, %es:(%bx)"); asm("movw %0, %%dx" : : "m" (base)); asm("movw %dx, %es:2(%bx)"); }
# ir #32 in ivt. int 0x20 _k_iroutine_32: pusha pushl $'0' calll _outb popl %ebx popa iret
pushl $_k_iroutine_32 pushl %cs pushl $32 calll _set_ir popl %ebx popl %ebx popl %ebx int $0x20 # call #32 ir int $0x20 # call #32 ir int $0x20 # call #32 ir
保护模式下编写中断处理程序
异常和中断
Vector Mnemonic Description Source
0 #DE Divide Error DIV and IDIV instructions.
1 #DB Debug Any code or data reference.
2 NMI Interrupt Non-maskable external interrupt.
3 #BP Breakpoint INT3 instruction.
4 #OF Overflow INTO instruction.
5 #BR BOUND Range Exceeded BOUND instruction.
6 #UD Invalid Opcode (UnDefined Opcode) UD instruction or reserved opcode.
7 #NM Device Not Available (No Math Coprocessor) Floating-point or WAIT/FWAIT instruction.
8 #DF Double Fault Any instruction that can generate an exception, an NMI, or an INTR.
9 #MF CoProcessor Segment Overrun (reserved) Floating-point instruction.1
10 #TS Invalid TSS Task switch or TSS access.
11 #NP Segment Not Present Loading segment registers or accessing system segments.
12 #SS Stack Segment Fault Stack operations and SS register loads.
13 #GP General Protection Any memory reference and other protection checks.
14 #PF Page Fault Any memory reference.
15 Reserved
16 #MF Floating-Point Error (Math Fault) Floating-point or WAIT/FWAIT instruction.
17 #AC Alignment Check Any data reference in memory.2
18 #MC Machine Check Error codes (if any) and source are model dependent.3
19 #XM SIMD Floating-Point Exception SIMD Floating-Point Instruction4
20 #VE Virtualization Exception EPT violations5
21-31 Reserved
32-255 Maskable Interrupts External interrupt from INTR pin or INT n instruction.
软件中断
int
硬件中断
PIC
PIC即Programmable Interrupt Controller,可编程中断控制器
8259/8259A
8259/8259A是一种可编程中断控制器。8259/8259A芯片可以是单片方式,也可以是多片级联方式。使用两块8259/8259A芯片级联的话,其中一块是主片,一块是从片。
8259
寄存器
Command Register即命令寄存器
该寄存器只能写
Status register即状态寄存器
该寄存器只能读
IRR即Interrupt Request Register,中断请求寄存器
该寄存器是内部寄存器,不能直接访问。
ISR即In-Sevice Register,In-Sevice寄存器
该寄存器是内部寄存器,不能直接访问。
IMR即Interrupt Mask Register,中断屏蔽寄存器
端口
两个端口:命令端口和数据端口,可以通过这两个接口来访问8259内部的寄存器。
如果是主片
命令端口:0x0020
数据端口:0x0021
从片的话
命令端口:0x00A0
数据端口:0x00A1
命令
ICW和OCW
ICW即Initialization Command Words,初始化命令字
有些资料上叫Initialization Control Words
OCW即Operation Command Words,操作命令字.
有些资料上叫Operation Control Words
ICW包括ICW1~ICW4,即ICW1,ICW2,ICW3和ICW4
OCW包括OCW1~OCW3,即OCW1,OCW2和OCW3
ICW
ICW1
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
|0|0|0|1|L|A|S|I|
| | | | |T|D|N|C|
| | | | |I|I|G|4|
| | | | |M| |L| |
+-+-+-+-+-+-+-+-+
ICW2
76543 210
+-----+---+
| | |
+-----+---+
^ ^
| |
|A8/A9/A10
|
A11(T3)/A12(T4)/A13(T5)/A14(T6)/A15(T7)
ICW3
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
|S|S|S|S|S|S|S|S|
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
76543 210
+-----+---+
|00000|ID0|
+-----+---+
ICW4
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
|0|0|0|S|B|M|A|u|
| | | |F|U|/|E|P|
| | | |N|F|S|O|M|
| | | |M| | |I| |
+-+-+-+-+-+-+-+-+
8259A
8259/8259A中断处理程序
x86中断
https://www.iteye.com/blog/lobin-1576159
相关推荐
自己整理的x86汇编常用中断
关于x86中断的一些资料 直接系统服务中断:Other 直接系统服务(Direct System Service) INT 00H —“0”作除数 INT 01H —单步中断 INT 02H —非屏蔽中断(NMI) INT 03H —断点中断 INT 04H —算术溢出错误 ...
1. x86中断向量:x86处理器为各种异常和中断定义了固定的中断向量表。当中断或异常发生时,CPU使用中断向量号来找到对应的中断服务例程(ISR)地址,然后转到该地址执行相应的处理。 2. 硬件中断与可编程中断控制器...
本程序是在tc下的X86中断测试响应代码。当总线上产生中断的时候本程序会响应中断,会打出中断次数。
有了中断功能,就可以使CPU和外设同时工作。CPU在启动外设工作后,继续执行主程序,同时外设也在工作。当外设把数据准备好后,发出中断申请,请求CPU暂时终止主程序,执行输入或输出(中断处理),处理完后,CPU恢复...
你不知道的故事x86 系类处理器上电后直接进入实模式硬件设计将 ROM 中的 BIOS 拷贝到内存中BIOS 代码的入口地址为 0xFFFF0硬件设计将 cs
需要注意的是,在x86中断处理中,通过门只能提升运行级别,中断处理通常使用最高特权级的段选择符。此外,TSS在特权级切换时起到了关键作用,保存和恢复ss和esp的值。中断处理程序在完成工作后,通过iret指令返回,...
#### 与X86中断向量表的比较 X86体系结构下的中断向量表设计得更加灵活,允许在运行时动态随机地设置或修改中断向量表。这一优点主要得益于两个关键因素:中断向量表与程序代码的分离,以及程序数据可以在运行时...
#### X86中断的硬件支持 在x86架构下,中断处理主要依赖于硬件的支持。8259A中断控制器扮演着重要角色,它是硬件设备与CPU之间的桥梁,用于向CPU发送中断请求。中断向量表寄存器IDTR则用于存储中断向量表IDT的基...
X86架构是个人计算机领域最广泛使用的处理器架构之一,因此,在WinCE运行于X86平台时,理解和编写中断驱动显得尤为重要。本文将深入探讨“wince 中断驱动 X86”的相关知识点。 1. **中断基础知识**: - 中断是硬件...
x86机器dos模式下中断查询字典,供有需要的收藏
内容如题 网页文件 linux下不能看chm文件的朋友可能有用 <br>包裹名:x86保护模式教程和bios中断手册.rar 构成:80x86保护模式系列教程.tar.bz2 bios中断手册.tar.bz2 最近读内核 有些地方还是弄本...
4.4 X86中断处理过程 4.5 练习一 4.6 练习二 4.7 练习三 4.8 练习四 练习五 4.9 练习六 5.1 计算机体系结构和内存层次 5.2 地址空间和地址生成 5.3 连续内存分配 5.4 碎片整理 5.5 伙伴系统 6.1 非连续内存分配的...
#### x86中断处理机制 为了深入理解ELI的工作原理,我们有必要先了解x86架构下中断处理的基本机制。在裸金属环境中,x86处理器使用中断和异常来通知系统软件有关的事件。中断是由外部实体(如I/O设备)产生的异步...
理解如何设计具备类似X86中断功能的系统总线。 - **实验环境**: - TD-CMA教学实验系统(通过USB串行接口与PC微机相连) - PC微机 - **实验原理**: - 为了实现中断控制,CPU需要有一个**中断使能寄存器**。该...
### DOS与x86中断(IRQ) DOS系统在x86架构下运行,利用中断请求(Interrupt Request,IRQ)机制来处理外部设备的信号。IRQ是硬件设备向处理器发送的一种特殊信号,用于通知CPU有紧急事件需要处理。在DOS环境下,...
实模式下的中断处理是x86处理器的重要特性,包括软中断(软件触发)和硬中断(硬件事件触发)。模拟器需要实现中断向量表,处理中断调用,并模拟中断处理后的恢复过程。 三、x86 模拟器的基本原理 3.1 模拟器的...
5. **中断处理**:学习如何利用中断机制来调用操作系统服务,如I/O操作和错误处理。 6. **汇编与高级语言的混合编程**:汇编语言常被用来编写C/C++等高级语言的库函数,尤其是需要高性能计算的部分。 7. **性能...
3. **编程模型**:解释X86汇编语言的编程模型,如栈操作、调用和返回过程、中断处理,以及如何在汇编语言中实现高级语言的结构,如循环和函数。 4. **内存管理**:讨论地址空间、段和页表的概念,以及如何通过汇编...
6. **中断和异常处理**:理解中断和异常的概念,以及如何使用INT指令触发中断,处理系统服务和错误情况。 7. **I/O操作**:学习如何通过IN和OUT指令与硬件设备进行通信,如键盘、显示器和串行端口。 8. **汇编与...