`
lobin
  • 浏览: 430870 次
  • 性别: 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 最近读内核 有些地方还是弄本...

    操作系统实战视频课程.zip

    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 非连续内存分配的...

    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. **内存管理**:讨论地址空间、段和页表的概念,以及如何通过汇编...

    modern_x86_assembly_language_programming_x86_Asm_

    6. **中断和异常处理**:理解中断和异常的概念,以及如何使用INT指令触发中断,处理系统服务和错误情况。 7. **I/O操作**:学习如何通过IN和OUT指令与硬件设备进行通信,如键盘、显示器和串行端口。 8. **汇编与...

Global site tag (gtag.js) - Google Analytics