8086 汇编语言中断程序设计
- 格式:doc
- 大小:211.50 KB
- 文档页数:5
8086-6-中断中断(8086)中断就是打断处理器当前的执⾏流程,去执⾏⼀些和当前⼯作不相⼲的指令,执⾏完之后,还可以返回到原来的程序流程继续执⾏。
就好⽐你在打游戏突然⽼板来电话了,你不得不先停⽌打游戏然后来处理这件更为重要的事件,然后打完电话之后继续打游戏。
中断的⼀些概念:中断号:由于CPU需要通过对不同类型的中断进⾏不同处理,所以每种类型的中断都被统⼀编号,这称为中断类型号、中断向量或者中断号。
Intel处理器允许256 个中断,中断号的范围是0~255中断源:中断信号的来源,或者说产⽣中断的设备,被称为中断源。
中断嵌套:当⼀个中断事件正在处理时,如果来了⼀个优先级更⾼的中断事件时,允许暂时中⽌当前的中断处理,先为优先级较⾼的中断事件服务,这称为中断嵌套。
实模式下的中断向量表(Interrupt Vector Table,IVT):所谓中断处理,其实就是处理器要执⾏⼀段与该中断有关的程序(指令)你也可以将其当作⼀个函数。
处理器可以识别256 个中断,那么理论上就需要256 段代码。
这些代码实际存放的位置并不重要,重要的是,在实模式下,处理器要求将它们的⼊⼝点也就是起始地址集中存放到内存中从物理地址0x00000 开始,到0x003ff 结束,共1KB 的空间内,这就是所谓的中断向量表。
每个中断的⼊⼝点地址在中断向量表中占2 个字,分别是中断处理代码的偏移地址和段地址。
中断0的⼊⼝点位于物理地址0x00000 处,也就是逻辑地址0x0000:0x0000;中断1 的⼊⼝点位于物理地址0x00004 处,即逻辑地址0x0000:0x0004;其他中断⼊⼝点地址以此类推。
中断分类:中断⼤致上可以分为硬件中断和软件中断(简称为软中断)。
顾名思义,硬件中断由硬件来提供,⽐如说:CPU,⿏标键盘等。
⽽软件键盘由内部的代码来定义。
硬件中断:硬件中断还可以分为外部硬件中断和内部硬件中断,外部硬件中断是指除CPU以外的硬件对应的中断,⽽内部硬件中断是内部CPU对应的中断。
汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131LEA DX,FNAMEMOV CX,0 ;语句1INT 21HJC EXITMOV FNUM,AXMOV BX,AX ;语句2MOV CX,100MOV AH,40HLEA DX ,BUFINT 21HMOV BX,FNUMMOV AH,3EHINT 21HEXIT:MOV AH,4CHINT 21HCODE ENDSEND START使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。
2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么?1>汇编:C:\masm> masm lab7;2>连接:C:\masm> link lab7;3>运行:C:\masm> lab73.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别?4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用.5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用.实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。
源程序下:assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset domov ax,0mov es,axmov di,200hmov cx,offset doend-offset do ;安装中断例程cldrep movsbmov word ptr es:[0],200hmov word ptr es:[2],0 ;设置中断向量表mov dx,0ffffhmov bx,1 ;测试一下div bxmov ax,4c00hint 21hdo:jmp short dostartdb 'divide error!'dostart:mov ax,0mov ds,axmov si,202hmov ax,0b800hmov es,axmov di,160*12+60mov cx,13s:mov al,ds:[si]mov ah,15mov es:[di],axinc siinc diinc diloop smov ax,4c00hint 21hdoend:nopcode endsend start3.若将语句1 改为mov cx,1,文件为只读。
8086中断举例一、8086中有个中断向量表,其中有256个中断,每个中断占4个字节,总共1K大小。
二、中断程序的编写主要就是将程序的偏移地址和段地址装载到向量表中。
装载的方法有两种。
方法1:直接装入法。
xorax,ax ; 将AX置零movds,ax;将段初始化为0段,不一定要使用ds段寄存器movax,offset int60 ; 取得中断服务程序的入口地址的偏移量mov ds:[0180h],ax ; 将偏移地址装入中断向量表,60H*4=0180Hmovax,seg int60 ; 取得中断服务程序的入口地址的段地址mov ds:[0180h+2],ax ; 将段地址装入中断向量表8086下的中断服务子程序例程:data segmentinfo db "This is an Interruption service program!",0ah,0dh,'$'data endsSTACK SEGMENT stackSTA DB 50 DUP(?)TOP EQU LENGTH STASTACK ENDScode segmentassumecs:code,ds:data,SS:STACKstart:movax,datamovds,axMOV AX,STACKMOV SS,AXMOV SP,TOPpush ds; ======== 装载中断服务程序的入口地址到中断向量表中========== xorax,axmovds,axmovax,offset printmov ds:[0198h],axmovax,seg printmov ds:[0198h+2],axpop dsint 66h ; 触发中断(软件中断的方式)中断向量号:66H mov ah,4ch ; 返回DOSint 21h; ============= 中断服务程序============ printproc farmovdx,offset info ; 显示一段文字信息mov ah,09hint 21hiret ; 中断返回print endpcode endsend start调试过程需要观察的几个关键点:(1)ISP入口地址装载进中断向量表后的状态(2)在即将触发中断时,CS,IP的变化(3)在中断返回执行IRET时,CS,IP的变化(理解恢复现场)(4)注意堆栈的变化,SP和SS方法2 :push ds; ======== 装载中断服务程序的入口地址到中断向量表中========== mov dx,seg print ; ds:dx(CS:IP)mov ds,dxmov dx,offset printmov al,66h ;中断类型号mov ah,25hint 21h ;装中断向量表pop ds中断向量服务程序入口地址服务程序入口地址中断向量。
8086中断矢量表的建立方法
在8086微处理器中,中断矢量表是通过一系列的汇编语言指令来建立的。
具体步骤如下:
1. 使用`PUSH ES`指令将当前段寄存器ES的值压入堆栈中,以保存当前的段地址。
2. 使用`MOV AX, 0`指令将AX寄存器的值设置为0。
3. 使用`MOV ES, AX`指令将AX寄存器的值复制到ES段寄存器中,设置段地址为0。
4. 使用`MOV DI, 54H`指令将DI寄存器的值设置为54H,这是中断类型码乘以4的结果,用于计算中断服务程序的偏移量。
5. 使用`MOV AX, OFFSET POUT15`指令将中断服务程序入口地址的偏移量存放到AX寄存器中。
6. 使用`CLD`指令清除方向标志,以确保在执行`STOSW`指令时将AX寄存器的值存储到内存中,而不是从内存中读取值。
7. 使用`STOSW`指令将AX寄存器的值存储到ES:DI指向的内存地址中,即中断矢量表的偏移量字段。
8. 使用`MOV AX, SEG POUT15`指令将中断服务程序入口地址的段基址存放到AX寄存器中。
9. 再次使用`STOSW`指令将AX寄存器的值存储到ES:DI指向的内存地址中,即中断矢量表的段基址字段。
10. 使用`POP ES`指令弹出堆栈中的值到ES段寄存器中,恢复ES段寄存器的原始值。
这样,就完成了中断矢量表的建立。
需要注意的是,这些指令是按照特定的顺序执行的,因为8086微处理器的指令执行是有序的,必须按照正确的顺序执行才能得到正确的结果。
微机原理大作业一.中断简介●中断:CPU不再接着(刚执行完的指令)向下执行,而是转去处理中断信息。
1.内中断:由CPU内部发生的事件而引起的中断2.外中断:由外部设备发生的事件引起的中断●不可屏蔽中断:属于中断请求的一种。
外部不可屏蔽中断请求经由专门的CPU针脚NMI,通知CPU发生了灾难性事件,如电源掉电、总线奇偶位出错等。
内部不可屏蔽中断请求是CPU内部自发产生的,如存储器读写出错、溢出中断、除法出错中断等。
NMI线上中断请求是不可屏蔽的(既无法禁止的)、而且立即被CPU锁存。
因此NMI是边沿触发,不需要电平触发。
NMI 的优先级也比INTR高。
不可屏蔽中断的类型指定为2,在CPU响应NMI时,不必由中断源提供中断类型码,因此NMI响应也不需要执行总线周期INTA。
●中断过程:(从中断信息中)取得中断类型码标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中) 设置标志寄存器的第8位TF和第9位IF的值为0CS的内容入栈,IP的内容入栈从内存地址为中断类型码*4中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS二.设计任务利用8086最小模式和不可屏蔽中断方式设计跑马灯,能够实现按键点亮跑马灯,按键熄灭跑马灯。
硬件设计:利用74LS273芯片锁存数据信号,因为它是上升沿有效,通过分析写总线时序图发现,可以直接利用写信号的上升沿来作为控制信号,因此可以让地址信号和写信号通过一个或门,这样就可以得到一个上升沿有效的锁存信号。
使用共阳极的LED灯来制作跑马灯,利用开关来产生中断(NMI)信号。
CLKIORQAD0~AD15 D0~D7A0~A15600HIOR写总线周期时序图软件编程:因为要利用不可屏蔽中断,所以在设置中断向量时类型号为2,另外为了能达到跑马灯的效果,在中断处理程序中应用循环点亮,且设置适当的延时时间。
要设置区分工作状态的变量,这样才能在发生中断时,判断是否应该点亮跑马灯还是熄灭跑马灯。
汇编语⾔程序设计实验四:8086标志寄存器及中断实验任务1task1.asm源码:assume cs:code, ds:datadata segmentx dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031hy dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912hdata endscode segmentstart:mov ax, datamov ds, axmov si, offset xmov di, offset ycall add128mov ah, 4chint 21hadd128:push axpush cxpush sipush disub ax, axmov cx, 8s: mov ax, [si]adc ax, [di]mov [si], axinc siinc siinc diinc diloop spop dipop sipop cxpop axretcode endsend start关于add指令的调试过程截图如下:由图可知add指令使得ZF标志位由NZ变为ZR,CF标志位由NC变为CY,可知运算结果为0且在运算中由最⾼位向更⾼位产⽣了进位。
关于inc指令的调试过程截图如下:由图可知inc指令使得ZF标志位由NZ变为ZR,可知运算结果为0,⽽CF未曾改变。
line31~line34的4条inc指令,不能替换成如下代码,原因是:该题⽤adc指令进⾏⼤整数加法,期间需要⽤到CF标志位的数值,⽽上⾯已经验证过add指令会对CF标志位产⽣影响,故不能替换。
add si, 2add di, 2128位加之前数值截图:完成128位加之后数值截图(有变化):实验任务2task2.asm源码:assume cs:code, ds:datadata segmentstr db 80 dup(?)data endscode segmentmov ds, axmov si, 0s1:mov ah, 1int 21hmov [si], alcmp al, '#'je nextinc sijmp s1next:mov ah, 2mov dl, 0ahint 21hmov cx, simov si, 0s2: mov ah, 2mov dl, [si]int 21hinc siloop s2mov ah, 4chint 21hcode endsend start运⾏结果截图:line11-18:获取键盘输⼊的值并赋值给ds:[si] ,若为“#”,则跳转到next处,否则si++后再次重新进⼊本循环。
《汇编语言程序设计》第十三章中断及中断处理程序汇编语言程序设计第十三章中断及中断处理程序中断是计算机系统中的重要概念,它可以打断正在执行的程序,并在一段时间后恢复执行。
在汇编语言程序设计中,了解中断及中断处理程序的概念和实现方法十分重要。
本文将介绍《汇编语言程序设计》第十三章中断及中断处理程序的内容。
一、中断的概念及分类中断是计算机系统的一种基本机制,它可以让计算机在执行程序的过程中,暂时停下来去处理一些紧急事件。
根据中断的来源和性质,中断可以分为硬件中断和软件中断两种类型。
硬件中断是由硬件设备发出的信号,用于向处理器发出请求,以引起处理器对该事件进行处理。
典型的硬件中断包括时钟中断、外部设备中断等。
软件中断是由程序中的中断指令引起的中断。
软件中断可以通过INT指令来触发,程序员可以根据需要自行设置中断号。
二、中断向量表中断向量表是用于存储中断处理程序入口地址的一张表。
当某个中断发生时,处理器会根据中断号在中断向量表中查找对应的中断处理程序入口地址,并跳转到该地址去执行中断处理程序。
中断向量表一般位于内存的固定地址,不同中断号对应不同的中断处理程序入口地址。
由于中断向量表的地址是固定的,因此在编程时需要特别注意保护中断向量表。
三、中断的处理流程中断处理程序是用于响应中断事件并进行处理的程序。
中断的处理流程一般包括以下几个步骤:1. 保存中断现场:在处理中断之前,需要先保存当前程序的上下文,包括程序计数器、寄存器等内容。
这样在中断处理程序执行完毕后,可以恢复现场继续执行被中断的程序。
2. 中断服务例程:中断处理程序中的核心部分是中断服务例程,它实现了对中断事件的具体处理。
根据中断的类型和需求,中断服务例程可能包括对硬件设备的操作、数据处理等内容。
3. 恢复中断现场:在中断处理程序执行完毕后,需要恢复之前保存的中断现场。
这包括恢复程序计数器、寄存器等内容,以确保被中断的程序可以继续正常执行。
四、常见的中断类型及应用在汇编语言程序设计中,有一些常见的中断类型和应用。
汇编语言程序设计实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科131
LEA DX,FNAME
MOV CX,0 ;语句1
INT 21H
JC EXIT
MOV FNUM,AX
MOV BX,AX ;语句2
MOV CX,100
MOV AH,40H
LEA DX ,BUF
INT 21H
MOV BX,FNUM
MOV AH,3EH
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。
2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么?
1>汇编:
C:\masm> masm lab7;
2>连接:
C:\masm> link lab7;
3>运行:
C:\masm> lab7
3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别?
4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用.
5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用.
实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。
源程序下:
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do
mov ax,0
mov es,ax
mov di,200h
mov cx,offset doend-offset do ;安装中断例程cld
rep movsb
mov word ptr es:[0],200h
mov word ptr es:[2],0 ;设置中断向量表
mov dx,0ffffh
mov bx,1 ;测试一下
div bx
mov ax,4c00h
int 21h
do:jmp short dostart
db 'divide error!'
dostart:
mov ax,0
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,160*12+60
mov cx,13
s:
mov al,ds:[si]
mov ah,15
mov es:[di],ax
inc si
inc di
inc di
loop s
mov ax,4c00h
int 21h
doend:nop
code ends
end start
实
验
结
果
3.若将语句1 改为mov cx,1,文件为只读。
4.若将语句1 改为mov cx,2,文件为隐藏。
5.若将语句2 改为mov bx,1,在屏幕上显示写入的字符。
实验总结
这次实验没有花费很多时间,因为代码都是现成的,就只按照要求修改代码并运行,比较了其之间的不同。
实验二修改了在屏幕上显示的字符的颜色和位置,但是背景色还是没能修改成功。
指
导
教
师
意
见签名:年月日。