8086 汇编语言中断程序设计
- 格式:doc
- 大小:187.70 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处理器中断处理过程是用来处理外部引发的中断请求的一个过程。
当中断发生时,中断请求将引发中断向量(中断处理程序的程序入口地址)信号。
此向量会被传送到 CPU 的中断标志寄存器(IFR)中,IFR 会根据当前的中断优先级,将中断请求信号发送给 CPU ,以触发 CPU 的中断处理流程。
当中断请求信号触发处理器,处理器首先将当前的程序状态存储到堆栈中供以后恢复使用,然后根据中断向量从中断服务程序(ISR)中取出正确的处理程序。
此时处理器开始执行相应的 ISR,该程序将完成实际的中断处理程序,ISR 将根据外部事件对 CPU 和其他相关设备进行控制,例如改变 CPU 执行的指令,修改状态位,启动外设设备,等等。
完成中断处理程序后,处理器将恢复原来的程序状态,然后继续执行原来的程序,此时中断程序处理完毕,处理器继续执行程序继续完成任务。
- 1 -。
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微处理器的指令执行是有序的,必须按照正确的顺序执行才能得到正确的结果。
汇编语⾔程序设计实验四: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. 恢复中断现场:在中断处理程序执行完毕后,需要恢复之前保存的中断现场。
这包括恢复程序计数器、寄存器等内容,以确保被中断的程序可以继续正常执行。
四、常见的中断类型及应用在汇编语言程序设计中,有一些常见的中断类型和应用。
《汇编语言程序设计》第十三章中断及中断处理程序中断是计算机在执行程序过程中,突然停止当前任务的一种机制。
当出现外部事件(如键盘输入、硬件故障或定时器到达)时,计算机会立即中断当前正在执行的程序,转而执行事先定义好的中断处理程序,以响应这些事件。
中断可以分为硬件中断和软件中断。
硬件中断是由外部设备触发的,比如,键盘输入、鼠标点击等。
而软件中断则是程序内部通过软件指令主动触发的。
中断处理程序是响应中断事件的程序,也被称为中断服务子程序(Interrupt Service Routine,ISR)。
当一个中断发生时,中断处理程序会被调用执行,处理特定的中断事件。
在汇编语言中,编写中断处理程序需要掌握以下几个方面:1.定义中断向量表:中断向量表是一个储存中断向量地址的表格。
每个中断向量是一个4字节的地址,指向相应的中断处理程序。
在开发中,我们需要根据硬件设备的不同,定义对应的中断向量表。
2.中断处理程序的编写:中断处理程序需要以特定的格式编写,称为中断门。
中断门包含了中断向量的地址、中断类型、特权级等信息。
在编写中断处理程序时,需要将程序中所有寄存器的值进行保存,以便在中断处理完后恢复原来的状态。
3.中断的使能与屏蔽:在进行中断处理时,需要将中断的使能标志设置为1,以允许中断的发生。
而在一些情况下,为了阻止中断的发生,我们还需要将中断的屏蔽标志设置为1中断处理程序在操作系统和嵌入式系统中起着重要的作用。
它可以实现多任务处理、设备驱动程序、异常处理等功能。
在操作系统中,中断处理程序负责处理硬件设备的中断请求、时钟中断等,以实现多任务切换和设备驱动等功能。
总结起来,中断处理程序是汇编语言程序设计中重要的内容之一、掌握中断处理程序的编写方法,能够使程序能够响应外部事件,提高程序的实时性和可靠性。
8086汇编语⾔学习(⼗)8086中断8086中断介绍 任何⼀种CPU,都具备⼀种能⼒,可以在执⾏完当前正在执⾏的指令之后,检测到来⾃CPU内部或外部产⽣的特殊通知信息,并⽴即对所接收到的信息做出相应的处理。
这类特殊的信息,被称作中断信息。
顾名思义,中断指的是CPU不去正常执⾏接下来的指令,⽽是被中断,转⽽处理中断信息。
中断信息的种类有很多,但却有着⼀些共同点,中断信息中都包含了中断信息的类型码,⽤于标识中断信息。
8086的中断类型码是8位的,这代表着8086CPU最多可以处理256种不同的中断信息。
中断处理程序 CPU接受到了中断信息后,需要进⾏相应的处理,处理逻辑依然是由开发⼈员编写程序来控制的,所编写的程序被称作中断处理程序。
⼀般来说,需要编写不同的中断处理程序以应对不同的中断信息。
要令CPU中⽌当前指令的执⾏,转⽽跳转执⾏中断处理程序,其原理依然是通过改变8086CPU中CS:IP的值,使之指向中断信息对应的中断处理程序。
想要CPU令处理不同的中断信息时跳转到对应的中断处理程序,则必须要有⼀种机制将中断信息和中断处理程序建⽴关联。
中断向量表 8086CPU的设计者提供了⼀种叫做中断向量表的结构,⽤于建⽴中断类型码和中断处理程序⼊⼝的关联关系。
中断向量表,就是中断程序⼊⼝地址的⼀个列表,被保存在指定的内存地址中,便于CPU读取。
每⼀个中断向量列表项(即中断处理程序⼊⼝地址)是32位的,占两个字的空间,其中⾼16位存放段地址,低16为存放偏移地址。
中断向量表在8086CPU中的位置是固定的,位于0000:0000~0000:03ff这⼀特殊内存空间中(CPU会固定的到约定的内存处获取数据)。
CPU在跳转中断处理程序时,以中断类型码*4+2字单元中的数据设置CS,中断类型码*4字单元中的数据设置IP,如此⼀来,便能正确的跳转对应的中断处理程序。
中断处理过程 虽然已经说明了CPU是如何根据中断信息中的类型码跳转执⾏指定的中断处理程序。
8086指令系统及汇编语言程序设计8086指令系统是指8086微处理器能够支持和执行的一系列指令。
8086微处理器是Intel公司于1978年推出的一款16位微处理器,是一个革命性的产品,为个人计算机的发展奠定了基础。
8086微处理器采用的是复杂指令集(CISC)架构,其指令系统非常丰富,共有近1000条指令,能够完成各种复杂的计算和操作。
8086指令系统主要分为数据传输指令、算术运算指令、逻辑运算指令、移位指令、控制转移指令等几类。
数据传输指令主要用于数据在寄存器和存储器之间的传输,其中包括直接传输和间接传输两种方式。
算术运算指令用于执行各种加减乘除运算,包括有符号数和无符号数的运算。
逻辑运算指令用于执行逻辑操作,如与、或、异或等。
移位指令用于对数据进行位移操作,包括左移、右移等。
控制转移指令用于改变程序的执行顺序,包括无条件跳转、条件跳转等。
在汇编语言程序设计中,我们使用汇编语言来编写针对8086微处理器的程序。
汇编语言是一种低级编程语言,与机器语言直接对应,使用助记符代表机器指令。
汇编语言程序通过汇编器进行编译,生成可执行的机器码文件。
编写汇编语言程序的过程一般包括以下几个步骤:设计程序的逻辑结构、确定程序的算法、编写汇编语言源程序、进行程序调试、优化程序性能。
汇编语言程序设计可以用于解决各种计算机软件和硬件问题。
它可以用来编写底层驱动程序、操作系统、嵌入式系统等,也可以用来进行系统调试和性能优化。
总而言之,8086指令系统及汇编语言程序设计是计算机科学领域中重要的内容。
了解8086指令系统和掌握汇编语言程序设计对于理解计算机底层原理和解决一些底层问题非常有帮助。
同时,汇编语言程序设计也是一门艺术,通过编写高效的汇编语言程序,可以提高计算机的性能和响应速度。
8086汇编语言程序设计
(1)汇编语言介绍
汇编语言(简称汇编)是一种低级语言,它能够与计算机硬件的指令
指令很好地接轨,是一种可靠的,有效的,灵活的编程语言。
主要用于编
写微型机,微处理器,单片机及PC机的程序。
汇编器是汇编语言的翻译器,它将高级语言(如C、C++等)翻译为机器语言指令,以达到执行程
序源代码的目的。
汇编语言程序设计(Assembly Language Programming)是以汇编语
言编写程序以满足特定应用的过程。
它主要用于写微机、微处理器等的控
制程序和系统程序,具有立即计算,快速反应,低耗能,成本低廉的优点。
(2)汇编语言编程
汇编语言编程主要是为了让CPU以机器语言运行,编程时可使用指令
集合或者标准指令。
根据指令可以让CPU执行计算机的功能,原理上看,
汇编语言编程是一种字节操作。
汇编程序编程需要使用CPU的指令集,这些指令可以被用来控制CPU
执行。
指令集又可分为实指令集和抽象指令集。
对于不同的CPU,他们的
指令集也是不一样的,因此需要根据CPU的不同选择合适的指令集。
在汇编语言编程中,常见的指令有加法,减法,乘法,除法,移位,
现行,条件转移等等。
8086汇编中断8086汇编中断中断:CPU不再接着(刚执⾏完的指令)向下执⾏,⽽是转去处理中断信息。
内中断:由CPU内部发⽣的事件⽽引起的中断外中断:由外部设备发⽣的事件引起的中断8086的内中断CPU内部产⽣的中断除法错误,⽐如:执⾏div指令产⽣的除法溢出单步执⾏执⾏into指令执⾏int 指令8086的中断类型码(1)除法错误:0(2)单步执⾏:1(3)执⾏ into 指令:4(4)执⾏ int n指令,⽴即数 n 为中断类型码。
assume cs:codesg, ss:stacksg, ds:datasgstacksg segmentdb 200h dup (0)stacksg endsdatasg segment; ‘$': 9 退出显⽰的格式; 13,10:回车换⾏szmsg db 13,10,'hello world!',13,10,'$'datasg endscodesg segmentstart:mov ax,datasgmov ds,axlea dx, szmsg; ah寄存器为9:终端号 9 显⽰信息、显⽰ds为段地址 dx 位偏移地址的包含信息; 会取上⾯ szmsg 符号的 hello worold! 字符mov ah,9int 21h; ah寄存器为4c:则退出程序,为Dos状态mov ax,4c00hint 21hcodesg endsend start案例说明中断过程中断过程由CPU的硬件⾃动完成;⽤中断类型码找到中断向量,并⽤它设置CS和IP8086CPU的中断过程(1)从中断信息中取得中断类型码(2)标志寄存器的值⼊栈——中断过程中要改变标志寄存器的值,需要先⾏保护(3)设置标志寄存器的第8位TF 和第9位IF的值为0(4)CS的内容⼊栈;(5)IP的内容⼊栈;(6)从中断向量表读取中断处理程序的⼊⼝地址,设置IP和CS。
8086汇编语⾔中断表1、字符功能调⽤类(Character-Oriented Function)01H、07H和08H —从标准输⼊设备输⼊字符02H —字符输出03H —辅助设备的输⼊04H —辅助设备的输出05H —打印输出06H —控制台输⼊/输出09H —显⽰字符串0AH —键盘缓冲输⼊0BH —检测输⼊状态0CH —清输⼊缓冲区的输⼊功能(1)、功能01H、07H和08H功能描述:从标准输⼊设备(如:键盘)读⼊⼀个字符。
该中断在处理过程中将⼀直处于等待状态直到有字符可读为⽌。
该输⼊还可被重定向,如果这样做,则⽆法判断⽂件是否已到⽂件尾⼊⼝参数:AH=01H,过滤掉控制字符,并回显=07H,不过滤掉控制字符,不回显=08H,过滤掉控制字符,不回显出⼝参数:AL=输⼊字符的ASCII码(2)、功能02H功能描述:向标准输出设备(如:屏幕)输出⼀个字符。
该输出还可被重定向,如果这样做,则将⽆法判断磁盘是否满⼊⼝参数:AH==待输出字符的ASCII码出⼝参数:⽆(3)、功能03H功能描述:从辅助设备读⼊⼀个字符,该辅助设备的缺省值为COM1⼊⼝参数:AH=03H出⼝参数:AL=读⼊字符的ASCII码(4)、功能04H功能描述:向辅助设备输出⼀个字符,该辅助设备的缺省值为COM1⼊⼝参数:AH==待输出字符的ASCII码出⼝参数:⽆(5)、功能05H功能描述:向标准的输出设备输出⼀个字符。
该缺省的输出设备为LPT1端⼝的打印机,除⾮⽤MODE命令来改变⼊⼝参数:AH==待输出字符的ASCII码出⼝参数:⽆(6)、功能06H功能描述:控制台(如:键盘、屏幕)输⼊/输出。
如果输⼊/输出操作被重定向,那么,将⽆法判断⽂件是否已到⽂件尾,或磁盘已满⼊⼝参数:AH=06H,DL=输⼊/输出功能选择出⼝参数:若DL=00H-FEH,则此功能为输出,DL为待输出字符的ASCII码;若DL=0FFH,则此功能为输⼊,此时:若ZF=1,则⽆字符可读,否则,AL=读⼊字符的ASCII码(7)、功能09H功能描述:输出⼀个字符串到标准输出设备上。
汇编语言程序设计实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科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,在屏幕上显示写入的字符。