您好,欢迎访问三七文档
中断与复习•8088PC机中断(INTXX)包括:•1)内部中断•2)外部中断•都以INTXX表示。•其中,XX表示中断的类型编号。•编号可以从0~255。IBMPC的中断源分类:不可屏蔽中断(NMI)外部中断(又叫硬件中断)可屏蔽中断(INTR)除法中断(int0)溢出中断(int4)软件指令中断(INTN)单步中断(int1)断点中断内部中断(又称软件中断)软件中断硬件中断处理紧急事件处理外设事件•例如:int0是内部中断。•当CPU执行div等除法指令的时候,如果发生了除法溢出错误,将产生中断类型码为0的中断信息,CPU将检测到这个信息,然后引发中断过程,转去执行0号中断所对应的中断处理程序。•int1也是内部中断,是单步执行中断。一、中断系统应具有如下功能:(1)支持多种中断源。(2)支持所有中断源的优先级管理。(3)支持中断请求屏蔽处理。(4)支持中断嵌套处理高优先级请求可插入到低优先级请求的中断处理中处理。(5)中断响应后,自动进行中断处理。(6)中断处理结束后,自动进行返回处理。•二、CPU的中断响应包括:•①关中断,使中断响应周期不被其他中断终止。•②保护断点(当前程序的断点地址CS和IP进栈)和标志寄存器内容进栈。•从这个过程可以知道,所有的INT中断指令,都要使用和改变堆栈。•③取得中断服务程序的入口地址并执行。•CPU响应外部中断的条件(以8086/8088CPU为例)是:•①当前指令周期无总线请求•②中断允许标志位IF=1•③当前指令执行完。•三、中断服务。•中断服务程序要做的工作有:•①保护现场。将中断服务程序可能用到的寄存器进栈保护。•②开中断•③查找中断源,转入相应的中断服务。•中断服务完成后:•④关中断,使下一步的恢复现场工作不受干扰。•⑤恢复现场•⑥开中断,允许其他中断请求可以被CPU响应。•四、中断结束。•中断服务程序最后一条指令,必须是中断返回指令iret。CPU执行后,自动把现存堆栈中的标志寄存器内容和断点地址内容恢复,接着执行的将是中断前被打断的原程序。•所以,指令IRET,它的作用是实现恢复断点信息并返回。包括段地址CS和偏移地址IP每个中断服务程序都有惟一确定的集中了全部的中断向量(256个)中断向量在中断向量表中的编号中断向量的装入•BIOS负责0~1FH共32个中断向量的装入。用户若要使用中断,必须把自己的中断向量(中断服务程序的入口地址)装入到向量表中。•2、使用中断,必须对中断向量表进行设置•——将中断源的中断向量存入中断向量表对应的位置。可用以下方法:。•方法一:用系统DOS功能调用(INT21H)设置。•实现:(1)选用功能号:AH←25H•(2)调用参数:DS←中断向量的段基址•DX←中断向量的偏移地址•AL←中断类型码NCPU自动进行的中断处理软件中断•执行中断指令INTn引起。•特点:•①执行中断指令INTn进入中断服务,并从指令本身获得中断类型码。•②进入中断不需中断响应总线周期。•③除单步中断,不受中断标志IF的控制。•④中断服务可被硬中断打断。•⑤没有随机性软中断处理程序•由中断指令INTnn引起的软中断是不可屏蔽的,但它不会随机发生。•当CPU执行INTnn后才发生中断,所以它类似于子程序调用,但不等于子程序调用。•软中断处理程序主要步骤为:•①要考虑切换堆栈区:它可能在开中断状态下工作,可能有多重中断嵌套发生,要占用大量堆栈。•②及时开中断:以便CPU可以及时响应可屏蔽中断请求。•③保护现场:把要用的寄存器原来的内容先保护下来。•④完成中断服务。•⑤恢复现场。•⑥堆栈切换。•⑦用IRET实现中断返回。13.5BIOS和DOS中断例程的安装过程•(1)开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。13.5BIOS和DOS中断例程的安装过程•(2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。13.5BIOS和DOS中断例程的安装过程•(4)DOS启动后,除完成其它工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。13.6BIOS中断例程应用•下面我们举几个例子,来看一下BIOS中断例程的应用。•int10h中断例程是BIOS提供的中断例程,其中包含了多个和屏幕输出相关的子程序。13.6BIOS中断例程应用•一般来说,一个供程序员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数来决定执行哪个子程序。•BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号。13.6BIOS中断例程应用•我们看一下int10h中断例程的设置光标位置功能。movah,2movbh,0movdh,5movdl,12int10h13.6BIOS中断例程应用•(ah)=2表示调用第10h号中断例程的2号子程序,功能为设置光标位置,可以提供光标所在的行号(80*25字符模式下:0~24)、列号(80*25字符模式下:0~79),和页号作为参数。•(bh)=0,(dh)=5,(dl)=12,设置光标到第0页,第5行,第12列。13.6BIOS中断例程应用•bh中页号的含义:内存地址空间中,B8000h~BFFFFh共32K的空间,为80*25彩色字符模式的显示缓冲区。•一屏的内容在显示缓冲区中共占4000个字节。13.6BIOS中断例程应用•显示缓冲区分为8页,每页4K(≈4000),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。•也就是说,通常情况下,B8000~B8F9F中的4000个字节的内容将出现在显示器上。13.7DOS中断例程应用•int21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。•我们从前一直使用的是int21中断例程的4ch号功能,即程序返回功能,如下:movah,4ch;程序返回moval,0;返回值int21h13.7DOS中断例程应用•(ah)=4ch表示调用第21h号中断例程的4ch号子程序,功能为程序返回,可以提供返回值作为参数。•我们前面使用这个功能的时候经常写作:movax,4c00hint21h13.7DOS中断例程应用•我们看一下int21h中断例程的在光标位置显示字符串的功能:ds:dx指向字符串;要显示的字符串需用“$”作为结束符movah,9;功能号9,表示在光标位置显示字符串int21h13.7DOS中断例程应用•(ah)=9表示调用第21h号中断例程的9号子程序,功能为在光标位置显示字符串,可以提供要显示字符串的地址作为参数。13.7DOS中断例程应用•编程:在屏幕的5列12行显示字符串“Welcometomasm!”。–源代码•;编程:在屏幕的5行12列显示字符串“welcometomasm!”。•assumecs:code•datasegment•db'Welcometomasm!','$'•dataends•codesegment•start:movah,2;置光标•movbh,0;第0页•movdh,5;dh中放行号•movdl,12;dl中放列号•int10h••movax,data•movds,ax•movdx,0;ds:dx指向字符串的首地址data:0•movah,9•int21h•movax,4c00h•int21h•codeends•endstart13.7DOS中断例程应用•DOS为程序员提供了许多可以调用的子程序,都包含在int21h中断例程中。•我们这里只对原理进行了讲解,对于DOS提供的所有可调用子程序的情况,读者可以参考相关的书籍。第14章端口•14.1端口的读写•14.2CMOSRAM芯片•14.3shl和shr指令•14.4CMOSRAM中存储的时间信息引言•CPU可以直接读写3个地方的数据:–(1)CPU内部的寄存器;–(2)内存单元;–(3)端口。•这一章,我们讨论端口的读写。14.1端口的读写•对端口的读写不能用mov、push、pop等内存读写指令。•端口的读写指令只有两条:in和out,分别用于从端口读取数据和往端口写入数据。14.1端口的读写•访问端口:–inal,60h;从60h号端口读入一个字节–执行时与总线相关的操作:①CPU通过地址线将地址信息60h发出;②CPU通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读取数据;③端口所在的芯片将60h端口中的数据通过数据线送入CPU。14.1端口的读写•访问端口:–过程演示–注意:在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时用al,访问16位端口时用ax。14.1端口的读写•对0~255以内的端口进行读写:inal,20h;从20h端口读入一个字节out20h,al;往20h端口写入一个字节•对256~65535的端口进行读写时,端口号放在dx中:movdx,3f8h;将端口号3f8送入dxinal,dx;从3f8h端口读入一个字节outdx,al;向3f8h端口写入一个字节14.3shl和shr指令•shl和shr是逻辑移位指令,后面的课程中我们要用到移位指令,这里进行一下讲解。14.3shl和shr指令•shl逻辑左移指令,功能为:–(1)将一个寄存器或内存单元中的数据向左移位;–(2)将最后移出的一位写入CF中;–(3)最低位用0补充。14.3shl和shr指令•指令:moval,01001000bshlal,1;将al中的数据左移一位–执行后(al)=10010000b,CF=0。–我们来看一下shlal,1的操作过程14.3shl和shr指令•shlal,1的操作过程–(1)左移:原数据:01001000左移后:01001000–(2)最后移出一位写入CF中:原数据:01001000左移后:1001000CF=0–(3)最低为用0补充:原数据:01001000左移后:10010000•如果接着上面,继续执行一条shlal,1指令?执行后:(al)=00100000b,CF=1操作过程14.3shl和shr指令•再执行一条shlal,1指令的操作过程:–(1)左移:原数据:10010000左移后:10010000–(2)最后移出一位写入CF中:原数据:10010000左移后:0010000CF=1–(3)最低为用0补充:原数据:10010000左移后:0010000014.3shl和shr指令•如果移动位数大于1时,必须将移动位数放在cl中。比如,指令:moval,01010001bmovcl,3shlal,cl执行后(al)=10001000b,因为最后移出一位是0,所以CF=0。14.3shl和shr指令•可以看出,将X逻辑左移一位,相当于执行X=X*2。•比如:14.3shl和shr指令•shr逻辑右移指令,它和shl所进行的操作刚好相反:–(1)将一个寄存器或内存单元中的数据向右移位;–(2)将最后移出的一位写入CF中;–(3)最高位用0补充。14.3shl和shr指令•指令:moval,10000001bshral,1;将al中的数据右移一位–执行后(al)=01000000b,CF=1。–如果接着上面,继续执行一条shral,1指令,则执行后:(al)=00100000b,CF=0。14.3shl和shr指令•如果移动位数大于1时,必须将移动位数放在cl中。比如,指令:moval,01010001bmovcl,3shral,cl执行后(al)=00001010b,因为最后移出的一位是0,所以CF=0。14.3shl和shr指令•可以看出,将X逻辑右移一位,相当于执行X=X/2。•shl和shr指令执行过程演示•移位指令[所有的移位指令都影响标志位CF、OF、PF、SF和ZF]•非循环逻辑移位:把操作数看成无符数来进行移位.•SHL(SHiftlog
本文标题:汇编中断复习
链接地址:https://www.777doc.com/doc-3585667 .html