`
lobin
  • 浏览: 417633 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

 

中断分为硬件中断和软件中断,其中软件中断不可屏蔽,软件中断分为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

运行后,这里打印的不是'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、需要编写一个对应中断号的中断处理程序

2、在中断向量表(实地址模式)或中断描述表(保护模式)中设置中断向量(中断号以及对应的中断处理程序
 

实地址模式下编写中断处理程序

实地址模式下编写中断处理程序可以通过21H号中断的25H号功能号设置中断向量,还可以通过直接访问中断向量表的存储单元来设置中断向量
以编写32H号中断处理程序为例
21H号中断的25H号功能
	; 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
 
C程序如下:
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

写道
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

写道
ICW2
76543 210
+-----+---+
| | |
+-----+---+
^ ^
| |
|A8/A9/A10
|
A11(T3)/A12(T4)/A13(T5)/A14(T6)/A15(T7)

 

ICW3

写道
ICW3 - Primary PIC
7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+
|S|S|S|S|S|S|S|S|
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+

 

写道
ICW3 - Secondary PIC
76543 210
+-----+---+
|00000|ID0|
+-----+---+

 

ICW4

写道
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汇编常用中断

    x86中断手册等资料

    关于x86中断的一些资料 直接系统服务中断:Other 直接系统服务(Direct System Service) INT 00H —“0”作除数 INT 01H —单步中断 INT 02H —非屏蔽中断(NMI) INT 03H —断点中断 INT 04H —算术溢出错误 ...

    x86中断和异常处理.pdf

    1. x86中断向量:x86处理器为各种异常和中断定义了固定的中断向量表。当中断或异常发生时,CPU使用中断向量号来找到对应的中断服务例程(ISR)地址,然后转到该地址执行相应的处理。 2. 硬件中断与可编程中断控制器...

    x86中断测试

    本程序是在tc下的X86中断测试响应代码。当总线上产生中断的时候本程序会响应中断,会打出中断次数。

    x86中断系统.pdf

    有了中断功能,就可以使CPU和外设同时工作。CPU在启动外设工作后,继续执行主程序,同时外设也在工作。当外设把数据准备好后,发出中断申请,请求CPU暂时终止主程序,执行输入或输出(中断处理),处理完后,CPU恢复...

    Tomosom#operating_system_note#034_深入浅出x86中断机制_下1

    你不知道的故事x86 系类处理器上电后直接进入实模式硬件设计将 ROM 中的 BIOS 拷贝到内存中BIOS 代码的入口地址为 0xFFFF0硬件设计将 cs

    嵌入式系统/ARM技术中的Linux在x86上的中断处理过程

    需要注意的是,在x86中断处理中,通过门只能提升运行级别,中断处理通常使用最高特权级的段选择符。此外,TSS在特权级切换时起到了关键作用,保存和恢复ss和esp的值。中断处理程序在完成工作后,通过iret指令返回,...

    ARM嵌入式系统中断向量表的动态配置

    #### 与X86中断向量表的比较 X86体系结构下的中断向量表设计得更加灵活,允许在运行时动态随机地设置或修改中断向量表。这一优点主要得益于两个关键因素:中断向量表与程序代码的分离,以及程序数据可以在运行时...

    Linux中断处理说明

    #### X86中断的硬件支持 在x86架构下,中断处理主要依赖于硬件的支持。8259A中断控制器扮演着重要角色,它是硬件设备与CPU之间的桥梁,用于向CPU发送中断请求。中断向量表寄存器IDTR则用于存储中断向量表IDT的基...

    wince 中断驱动 X86

    X86架构是个人计算机领域最广泛使用的处理器架构之一,因此,在WinCE运行于X86平台时,理解和编写中断驱动显得尤为重要。本文将深入探讨“wince 中断驱动 X86”的相关知识点。 1. **中断基础知识**: - 中断是硬件...

    X86机dos中断查询字典

    x86机器dos模式下中断查询字典,供有需要的收藏

    x86保护模式教程和bios中断手册.rar

    内容如题 网页文件 linux下不能看chm文件的朋友可能有用 &lt;br&gt;包裹名:x86保护模式教程和bios中断手册.rar 构成:80x86保护模式系列教程.tar.bz2 bios中断手册.tar.bz2 最近读内核 有些地方还是弄本...

    ELI Bare-Metal Performance for IO Virtualization

    #### x86中断处理机制 为了深入理解ELI的工作原理,我们有必要先了解x86架构下中断处理的基本机制。在裸金属环境中,x86处理器使用中断和异常来通知系统软件有关的事件。中断是由外部实体(如I/O设备)产生的异步...

    计算机组成原理实验4.2_实验报告

    理解如何设计具备类似X86中断功能的系统总线。 - **实验环境**: - TD-CMA教学实验系统(通过USB串行接口与PC微机相连) - PC微机 - **实验原理**: - 为了实现中断控制,CPU需要有一个**中断使能寄存器**。该...

    IBMx86体系的资料IBM的内部资料哦

    ### DOS与x86中断(IRQ) DOS系统在x86架构下运行,利用中断请求(Interrupt Request,IRQ)机制来处理外部设备的信号。IRQ是硬件设备向处理器发送的一种特殊信号,用于通知CPU有紧急事件需要处理。在DOS环境下,...

    PMON 下的 x86vga模拟器工作机制.docx

    实模式下的中断处理是x86处理器的重要特性,包括软中断(软件触发)和硬中断(硬件事件触发)。模拟器需要实现中断向量表,处理中断调用,并模拟中断处理后的恢复过程。 三、x86 模拟器的基本原理 3.1 模拟器的...

    现代X86汇编语言程序设计Modern X86 Assembly Language Programming

    5. **中断处理**:学习如何利用中断机制来调用操作系统服务,如I/O操作和错误处理。 6. **汇编与高级语言的混合编程**:汇编语言常被用来编写C/C++等高级语言的库函数,尤其是需要高性能计算的部分。 7. **性能...

    X86汇编语言原版图书

    3. **编程模型**:解释X86汇编语言的编程模型,如栈操作、调用和返回过程、中断处理,以及如何在汇编语言中实现高级语言的结构,如循环和函数。 4. **内存管理**:讨论地址空间、段和页表的概念,以及如何通过汇编...

    操作系统源码 x86

    2. 中断处理:x86处理器支持中断,操作系统需要设置中断向量表,以处理硬件和软件中断事件。 3. 进程管理:创建、调度和销毁进程,通过上下文切换实现多任务并行。 四、内存管理 1. 分区与分段:早期的x86操作系统...

Global site tag (gtag.js) - Google Analytics