汇编程序设计PPT.ppt
新新新新 编编编编汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计1 1第八章第八章 输入输出与中断输入输出与中断8.1 .1 输入输入/输出输出 8.2 8.2 中断中断 8.3 .COM8.3 .COM文件文件 习题八习题八2 2输入输出输入输出:计算机系统必须有信息的输入输出。计算机系统必须有信息的输入输出。中断中断:中断是一种计算机非常常用而且重要的工作方式。中断是一种计算机非常常用而且重要的工作方式。3 3 8.1 8.1 输入输入/输出输出 8.1.1 8.1.1 外部设备和接口外部设备和接口 8.1.2 8.1.2 输入输入/输出指令输出指令 8.1.3 8.1.3 程序控制输入程序控制输入/输出输出 4 4接口:接口:计计 算算 机机 与与 外外 部部 设设 备备 的的 信信 息息 交交 换换 是是 通通 过过“接接 口口(Interface)”电路间接实现的。电路间接实现的。总线:总线:计算机与接口之间通过计算机与接口之间通过“总线(总线(BUS)”连接。连接。8.1.1 8.1.1 外部设备和接口外部设备和接口5 51.CPU1.CPU与接口之间的信号与接口之间的信号CPU与接口之间传送三种类型的信号与接口之间传送三种类型的信号:(1 1)数据信号)数据信号 (2 2)状态信号状态信号 (3 3)控制信号控制信号 6 62.端口端口端端口口:为为了了使使CPU能能对对接接口口电电路路内内部部寄寄存存器器进进行行读读写写,这这些些寄寄存存器器都都分分配配到到一一个个专专用用的的地地址址,这这种种分分配配了了地地址址的的寄寄存存器器称为称为“端口(端口(Port)端口的种端口的种类:(1 1)数据输入端口数据输入端口 (2 2)数据输出端口数据输出端口 (3 3)状态端口状态端口(输入)入)(4 4)控制端口控制端口(输出)出)7 7IN和和OUT指指令令的的共共同同特特点点是是:必必须须使使用用累累加加器器AL、AX或或EAX进行数据的传送。进行数据的传送。输输入入时时,IN指指令令把把端端口口的的数数据据/状状态态信信息息读读入入AL(8位)、位)、AX(16位)或位)或EAX(32位)中。位)中。输输出出时时,要要输输出出的的数数据据/命命令令先先放放人人AL(8位位)、AX(16位位)或或EAX(32位位)中中,然然后后执执行行OUT指指令,将令,将AL、AX或或EAX中信息向端口输出中信息向端口输出 8.1.2 8.1.2 输入输入/输出指令(输出指令(IN/OUTIN/OUT)8 81.IN/OUT(输入输入/输出)指令输出)指令(1)IN(输入)指令输入)指令 指令格式:指令格式:INACC,PORT INACC,DX操作:操作:AL/AX/EAX(PORT)AL/AX/EAX(DX)功能:把指定端口中的数据读入功能:把指定端口中的数据读入AL、AX或或EAX中中 9 9输入指令举例:输入指令举例:端口地址在端口地址在0255之间:之间:IN AL,35H;将将地地址址为为35H的的端端口口数数据据送送AL 端口地址在端口地址在065535之间之间:MOV DX,21H;端口地址放入端口地址放入DX IN AL,DX;把地址为把地址为21H的端口数据送的端口数据送AL中中 1010(2)输出指令输出指令 指令格式:指令格式:OUTPORT,ACC OUTDX,ACC操作:(操作:(PORT)AL/AX/EAX (DX)AL/AX/EAX 功能:把功能:把AL、AX或或EAX中的数据从指定端口输出中的数据从指定端口输出 1111输出指令举例:输出指令举例:端口地址在端口地址在0255之间:之间:OUT60H,AL ;将将AL中中数数据据送送到到地地址址;为为60H的的8位端口中位端口中 端口地址在端口地址在065535之间之间:MOV DX,21H OUT DX,AL;将将AL中中数数据据从从DX所所;指定的指定的8位端口输出位端口输出 12122.串输入串输入/输出指令输出指令串输入串输入/输出指令的源操作数和目的操作数都是隐含的输出指令的源操作数和目的操作数都是隐含的串串输输入入指指令令把把DX指指定定的的端端口口数数据据送送入入ES:DI所所指指向向的的存储单元,自动修改存储单元,自动修改DI以指向下一个存储单元以指向下一个存储单元 串串输输出出指指令令把把DS:SI 所所指指向向的的存存储储单单元元的的数数据据向向DX指定的端口输出,自动修改指定的端口输出,自动修改SI以指向下一个存储单元以指向下一个存储单元 1313(1)串输入指令串输入指令INS指令格式:指令格式:INSB/INSW/INSD操操 作:作:ES:DI(DX)修改修改DI值以指向下一个数据单元值以指向下一个数据单元 INSB、INSW、INSD分分别别表表示示从从端端口口读读入入一一个个字字节节、字字或或双双字字,存存人人ES:DI所所指指向向的的存存储储单单元元。如如果果方方向向标标志志DF0,指指令令执执行行后后,DI分分别别增增加加1、2、4,如如果果DF1,则则DI分分别别减减少少1、2、4 1414(2)串输出指令串输出指令OUTS 指令格式:指令格式:OUTSB/OUTSW/OUTSD 操操 作:作:(DX)DS:SI修改修改SI值以指向下一个数据单元值以指向下一个数据单元 OUTSB、OUTSW、OUTSD分分别别表表示示把把DS:SI所所指指向向的的一一个个字字节节、字字或或双双字字数数据据向向指指定定的的端端口口输输出出,同同时时根根据据DF的的值值,将将SI增加或减少增加或减少1、2、4 1515输入输出方式:输入输出方式:编编写写输输入入、输输出出程程序序,必必须须根根据据外外设设的的工工作作方方式式来来决决定定输入输入/输出采用的方式输出采用的方式 三种基本的程序控制输入输出方式:三种基本的程序控制输入输出方式:(1)无条件输入)无条件输入/输出输出 (2)查询式输入)查询式输入/输出输出 (3)中断方式)中断方式 8.1.3 8.1.3 程序控制输入程序控制输入/输出输出16161.无条件方式输入无条件方式输入/输出输出外外设设始始终终处处于于就就绪绪状状态态,CPU在在需需要要时时可可随随时时与与外外设设交交换换数数据据,而而无无须须知知道道外外设设所所处处的的状状态态,就就可可以以使用无条件输入使用无条件输入/输出方式进行数据的传输输出方式进行数据的传输 举例:扬声器发声举例:扬声器发声 1717有两种方法使扬声器发声:有两种方法使扬声器发声:1.1.将将61H61H端口端口D0D0置为置为0 0,关闭,关闭Timer2Timer2,D1D1交替置为交替置为1/01/0,使,使扬声器发声;扬声器发声;2.2.将将61H61H端口端口D0D0、D1D1均置为均置为1 1,使,使“Timer2Timer2”工作,产生固工作,产生固定频率的信号,使扬声器发声。定频率的信号,使扬声器发声。下面的子程序使用第一种方法使扬声器发声,声音频率由下面的子程序使用第一种方法使扬声器发声,声音频率由DXDX寄存器的值决定,声音的延续时间由寄存器的值决定,声音的延续时间由BXBX寄存器内的值决定。寄存器内的值决定。1818SOUNDSOUNDPROCPROCPUSHPUSHAXAX;保护现场保护现场PUSHPUSHCXCXININAL,61HAL,61H;读读61H61H端口端口“当前值当前值”ANDANDAL,11111110BAL,11111110BOUTOUT61H,AL61H,AL;使使D0=0D0=0,关闭,关闭Timer2Timer2TRIG:TRIG:ININAL,61HAL,61H;读读61H61H端口端口“当前值当前值”XORXORAL,2AL,2OUTOUT61H,AL61H,AL;D1;D1取反后输出,产生周期性信号取反后输出,产生周期性信号MOVMOVCX,DXCX,DXLOOPLOOP$;延时,控制延时,控制1/01/0输出时间,控制发声频率输出时间,控制发声频率1919DEC BXDEC BXJNZJNZTRIGTRIG;延时,控制发声的总时间延时,控制发声的总时间POPPOPCXCX;恢复现场恢复现场POPPOPAXAXRETRETSOUNDSOUND ENDPENDP2020 2.查询方式输入查询方式输入/输出输出CPU必必须须通通过过“读读”外外部部设设备备的的状状态态端端口口,了了解解外外部设备的当前状态,确定能否进行部设备的当前状态,确定能否进行“数据传输数据传输”2121(1)查询式输入查询式输入 查查询询式式输输入入的的接接口口电电路路中中,除除了了有有一一个个数数据据输输入入端端口,还必须有一个用于反映外设状态的状态端口口,还必须有一个用于反映外设状态的状态端口状状态态端端口口的的每每一一位位反反映映设设备备的的一一种种状状态态,例例如如,用用D7=1表表示示设设备备已已经经完完成成了了数数据据准准备备,可可以以传传输输数数据据,D7=0则则表表示示尚尚未未完完成成数数据据准准备备,不不能能进进行行数数据据传传输输。这一位常常被称为这一位常常被称为“READY”。2222(2 2)查询式输出查询式输出 采采用用查查询询方方式式进进行行输输出出的的接接口口电电路路中中,有有一一个个用用于于数据输出端口,还有一个用于反映外设状态的端口数据输出端口,还有一个用于反映外设状态的端口 外外设设状状态态位位称称作作“BUSY”,BUSY=1表表示示设设备备正正处处于于数数据据准准备备阶阶段段(“忙忙”);BUSY=0表表示示设设备备已已经完成数据准备(经完成数据准备(“空闲空闲”),可以进入数据传输),可以进入数据传输2323 8.2 8.2 中断中断 8.2.1 8.2.1 中断的概念中断的概念 8.2.2 8.2.2 中断服务程序中断服务程序 8.2.3 8.2.3 定时中断定时中断8.2.4 8.2.4 驻留程序驻留程序24241.1.中断与中断源中断与中断源中断:中断:由于某种事件的发生,使由于某种事件的发生,使CPU中断(暂时停止)中断(暂时停止)正在执行的程序而转去执行该事件的处理程序,为该事正在执行的程序而转去执行该事件的处理程序,为该事件服务结束后,继续执行原来被中断的程序,这个过程件服务结束后,继续执行原来被中断的程序,这个过程称为中断称为中断 中断源中断源:引起中断的事件称为中断源:引起中断的事件称为中断源 断点:断点:由于中断,将要执行但尚未执行的指令地址称为由于中断,将要执行但尚未执行的指令地址称为“断点断点”,包括,包括16位段基址和位段基址和16位偏移地址位偏移地址8.2.1 8.2.1 中断的概念中断的概念25252.2.中断分类中断分类中断可以划分为外部中断和内部中断两大类中断可以划分为外部中断和内部中断两大类(1)内部中断)内部中断中断指令中断指令INT引起的中断(软件中断)引起的中断(软件中断)由于由于CPU的某些错误引起的中断,如除法错中断、溢出的某些错误引起的中断,如除法错中断、溢出中断(异常中断)中断(异常中断)为调试程序设置的中断(陷阱中断)为调试程序设置的中断(陷阱中断)2626(2)外部中断)外部中断不可屏蔽中断(不可屏蔽中断(NMI),),通常代表通常代表CPU外部的故障外部的故障 外设完成数据准备,请求进行数据传输引起的可屏蔽中断外设完成数据准备,请求进行数据传输引起的可屏蔽中断 3.3.中断类型中断类型 为了区分不同的中断源,为了区分不同的中断源,80X86给每一个中断源一个编号,给每一个中断源一个编号,称为中断类型称为中断类型27274.4.中断向量表中断向量表中断向量:中断向量:每种类型的中断都有一个相应的中断服务程每种类型的中断都有一个相应的中断服务程序来进行处理,中断服务程序的入口地址称为序来进行处理,中断服务程序的入口地址称为“中断向中断向量量”中断向量表中断向量表:80 x86微机系统中把微机系统中把256个中断向量按照它个中断向量按照它们中断类型的顺序组织成一张表,存放在内存最低的们中断类型的顺序组织成一张表,存放在内存最低的1KB中,地址范围中,地址范围000H3FFH,这张表称为这张表称为“中断向中断向量表量表”(图(图8-5)28285.5.中断处理过程中断处理过程中断发生时,计算机中断机构自动完成如下操作中断发生时,计算机中断机构自动完成如下操作:(1)取中断类型号)取中断类型号N(2)标志寄存器(标志寄存器(FLAGS)内容入栈内容入栈(3)当前代码段寄存器()当前代码段寄存器(CS)内容入栈内容入栈(4)当前指令计数器()当前指令计数器(IP)内容入栈内容入栈(5)禁止外部中断和单步中断()禁止外部中断和单步中断(TF=0,IF=0)(6)从从中中断断向向量量表表中中取取地地址址4N的的2字字节节内内容容送送IP,取取地地址址4N+2的的2字节内容送字节内容送CS(7)进入中断处理程序。进入中断处理程序。29296.6.中断优先级和中断嵌套中断优先级和中断嵌套中断优先级中断优先级:给各个中断源安排一个中断响应的先后:给各个中断源安排一个中断响应的先后次序,即中断优先级次序,即中断优先级 中断嵌套中断嵌套:中断服务程序执行过程中,被优先级更高:中断服务程序执行过程中,被优先级更高的中断请求所中断,称为中断嵌套的中断请求所中断,称为中断嵌套 3030使用中断方式进行输入使用中断方式进行输入/输出时,用户需要编制两个程输出时,用户需要编制两个程序模块序模块:“主程序主程序”和和“中断服务程序中断服务程序”主程序主程序:主要任务是为进入中断服务程序进行各种准备:主要任务是为进入中断服务程序进行各种准备,输入输出完成后进行结束处理输入输出完成后进行结束处理 中断服务程序中断服务程序:中断发生时由:中断发生时由CPU执行该程序,进行所执行该程序,进行所需要的输入输出处理需要的输入输出处理 8.2.2 8.2.2 中断服务程序中断服务程序31311.主程序主程序(1)设置中断向量)设置中断向量:设置中断向量就是把中断服务程序的入口地址放入中断设置中断向量就是把中断服务程序的入口地址放入中断向量表中向量表中 设置中断向量有两种可选的方法:设置中断向量有两种可选的方法:用用MOV指令将中断向量直接写入中断向量表中,称指令将中断向量直接写入中断向量表中,称为直接写入法为直接写入法 用用DOS功能调用,设置中断向量功能调用,设置中断向量 3232例例8-2:用直接写入法设置中断向量。假设中断类型为用直接写入法设置中断向量。假设中断类型为N,中断中断 服务程序入口标号为服务程序入口标号为INTERRUPT PUSHPUSHDSDS;保护保护DSDS寄存器内容寄存器内容MOV MOV AX,0AX,0MOV MOV DS,AX DS,AX ;数据段指向中断向量表数据段指向中断向量表MOV MOV BX,4*NBX,4*N;中断向量安放位置(偏移地址)送中断向量安放位置(偏移地址)送BXBXMOV MOV WORD PTR BX,OFFSET INTERRUPT;WORD PTR BX,OFFSET INTERRUPT;写入偏移地址写入偏移地址MOV MOV WORD PTR BX+2,SEG INTERRUPT ;WORD PTR BX+2,SEG INTERRUPT ;写入段基址写入段基址POPPOPDSDS;恢复恢复DSDS寄存器寄存器 3333用用DOS功能调用功能调用25H用来设置中断向量:用来设置中断向量:入口参数为:入口参数为:AH25H AL中断类型号中断类型号 DS:DX中断向量中断向量用用DOS功能调用功能调用35H用来读中断向量用来读中断向量:入口参数为:入口参数为:AH25H AL中断类型号中断类型号 DS:DX中断向量中断向量 出口参数为:出口参数为:ES:BX中断向量中断向量8.2.2 8.2.2 中断服务程序中断服务程序3434例例8-3:使用使用DOS功能调用设置中断向量功能调用设置中断向量 PUSHPUSHDSDSMOVMOVAX,SEG INTERRUPTAX,SEG INTERRUPTMOVMOVDS,AXDS,AXMOVMOVDX,OFFSET INTERRUPTDX,OFFSET INTERRUPTMOVMOVAL,NAL,NMOVMOVAH,25HAH,25HINTINT21H21HPOPPOPDSDS3535(2)设置设备的中断屏蔽位)设置设备的中断屏蔽位:“中断屏蔽中断屏蔽”:外部设备的中断请求由中断控制器外部设备的中断请求由中断控制器8259A8259A统一管理统一管理 ,在,在8259A8259A内部,有一个内部,有一个“中断屏蔽寄中断屏蔽寄存器存器”,该寄存器的,该寄存器的8 8位二进制对应于位二进制对应于8259A8259A的的8 8个中断个中断请求输入,寄存器某一位设置为请求输入,寄存器某一位设置为“1”1”时,对应引脚上时,对应引脚上的中断请求不能被传送到的中断请求不能被传送到CPUCPU,该中断因此无法得到相该中断因此无法得到相应。对中断请求的这种管理方法称为应。对中断请求的这种管理方法称为“中断屏蔽中断屏蔽”。3636(3)设置中断允许位)设置中断允许位IF,开放中断开放中断:STI指令可以将中断允许位指令可以将中断允许位IF置置1,打开中断。只有中断,打开中断。只有中断打开时,打开时,CPU才会响应从才会响应从INTR引脚输入的,也就是从引脚输入的,也就是从8259A发来的可屏蔽中断请求发来的可屏蔽中断请求 3737(4)其他设置)其他设置:主程序还应该为中断服务程序使用的指针、计数器等设主程序还应该为中断服务程序使用的指针、计数器等设置初值。在中断方式输入输出结束后,进行必要的结束置初值。在中断方式输入输出结束后,进行必要的结束处理处理 38382.中断服务程序中断服务程序中断服务程序的主要操作步骤中断服务程序的主要操作步骤:(1)保存寄存器内容:)保存寄存器内容:(2)开放中断)开放中断(3)中断服务)中断服务(4)关中断()关中断(CLI)(5)发送中断结束命令发送中断结束命令(6)恢复寄存器内容)恢复寄存器内容(7)中断返回中断返回 3939实际应用中,经常要用到实际应用中,经常要用到“定时定时”:确定某个操作所需要的时间:例如,测量电机的转速。确定某个操作所需要的时间:例如,测量电机的转速。定时启动某个操作:例如,定时采集温度、压力等数据定时启动某个操作:例如,定时采集温度、压力等数据PC微机内部微机内部“定时器定时器”:每:每55ms(1/18.2秒)产生一个秒)产生一个“时间到时间到”信号,向信号,向8259A申请中断。该中断类型号为申请中断。该中断类型号为09H,主要用于操作系统的定时操作主要用于操作系统的定时操作 为了满足用户的定时需要,另设了一个为了满足用户的定时需要,另设了一个1CH中断,每次进中断,每次进入入09H中断后,由该中断服务程序通过执行指令中断后,由该中断服务程序通过执行指令“INT 1CH”进入进入1CH中断,执行用户的定时中断服务程序中断,执行用户的定时中断服务程序 8.2.3 8.2.3 定时中断定时中断4040用户的定时任务实现方法用户的定时任务实现方法:保存原保存原1CH1CH中断向量;中断向量;把新的把新的1CH1CH中断服务程序入口地址填入中断向量表;中断服务程序入口地址填入中断向量表;编制新的编制新的1CH1CH中断服务程序:首先执行新增加的定时中断服务程序:首先执行新增加的定时任务,完成后进入原中断服务程序,执行其它的定任务,完成后进入原中断服务程序,执行其它的定时任务。时任务。例例8.4:在屏幕上显示一个实时时钟,限于篇幅,只在屏幕上显示一个实时时钟,限于篇幅,只显示时钟的显示时钟的“秒秒”值值 4141;EX804.ASM ;EX804.ASM 定时中断,显示实时时钟(秒值)定时中断,显示实时时钟(秒值)INCLUDEINCLUDEYLIB.HYLIB.H;头文件,包含外部函数与宏的定义头文件,包含外部函数与宏的定义 ;*;*CODECODESEGMENTSEGMENTASSUMEASSUMECS:CODECS:CODESECONDSECONDDBDB0 0;秒值秒值SIGNALSIGNALDBDB0 0;1;1秒时间到标记秒时间到标记COUNTCOUNTDWDW0 0;毫秒值毫秒值OLDINT1CHOLDINT1CHDDDD?;原来原来1CH1CH中断向量中断向量4242START:MOVSTART:MOVAL,1CHAL,1CH;取原来取原来1CH1CH中断向量中断向量 MOVMOVAH,35HAH,35HINTINT21H21HMOVMOVWORD PTR OLDINT1CH+2,ES;WORD PTR OLDINT1CH+2,ES;保存原中断向量保存原中断向量MOVMOVWORD PTR OLDINT1CH,BXWORD PTR OLDINT1CH,BX;*;*LEALEADX,MYINT1CHDX,MYINT1CH;取新向量偏移地址取新向量偏移地址MOVMOVAX,SEG MYINT1CHAX,SEG MYINT1CH;取新向量段地址取新向量段地址MOVMOVDS,AXDS,AXMOVMOVAL,1CHAL,1CHMOVMOVAH,25HAH,25HINTINT21H21H;设置新的设置新的1CH1CH中断向量中断向量4343STISTI;开放可屏蔽中断;开放可屏蔽中断 CLSCLS;清屏宏指令清屏宏指令AGAIN:MOVAGAIN:MOV AH,1AH,1;读键盘缓冲区的字符读键盘缓冲区的字符INTINT16H16HJZJZTEST_STEST_S;键盘缓冲区空,转键盘缓冲区空,转TEST_STEST_SCMPCMPAL,QAL,Q;键盘字符是键盘字符是QQ?JZJZEXITEXIT;是是QQ,退出主程序,退出主程序TEST_S:CMPTEST_S:CMPSIGNAL,1SIGNAL,1;1;1秒钟到了吗?秒钟到了吗?JNEJNEAGAINAGAIN;未到转未到转AGAIN AGAIN MOVMOVSIGNAL,0 ;1SIGNAL,0 ;1秒钟到,标记清秒钟到,标记清0 0INCINCSECONDSECOND;秒加秒加1 1CMPCMPSECOND,60SECOND,60;到到6060秒?秒?JNEJNEDISPDISP;秒值未到秒值未到6060,显示,显示MOVMOVSECOND,0SECOND,0;秒值到秒值到6060,恢复为,恢复为0 04444DISP:DISP:SETCUSORSETCUSOR0,4,390,4,39;设置光标位置宏指令设置光标位置宏指令MOVMOVAL,SECONDAL,SECONDMOVMOVAH,0AH,0;(AXAX)=秒值秒值MOVMOVDX,0FFFFHDX,0FFFFH;(DXDX)=0FFFFH=0FFFFHCALLCALLWRITEDECWRITEDEC;显示秒值显示秒值JMPJMPAGAINAGAIN;转转AGAINAGAIN,重复上述过程,重复上述过程EXIT:EXIT:MOVMOVDX,WORD PTR OLDINT1CHDX,WORD PTR OLDINT1CHMOVMOVAX,WORD PTR OLDINT1CH+2AX,WORD PTR OLDINT1CH+2MOVMOVDS,AX DS,AX MOVMOVAH,25HAH,25HMOVMOVAL,1CHAL,1CHINTINT21H21H;程序退出前程序退出前,恢复原来恢复原来1CH1CH中断向量中断向量MOVMOVAX,4C00HAX,4C00H;返回操作系统返回操作系统INTINT21H21H4545MYINT1CHMYINT1CHPROCPROCFARFAR;新的新的1CH1CH中断服务程序中断服务程序PUSHPUSHAXAX;保护现场保护现场STISTI;开中断,允许响应更高级别中断;开中断,允许响应更高级别中断ADDADDCOUNT,55COUNT,55;COUNT;COUNT单元加单元加5555CMPCMPCOUNT,1000COUNT,1000;COUNT;COUNT单元的数大于单元的数大于10001000吗?吗?JBJBBACKBACK;小于小于10001000,退出中断程序,退出中断程序SUBSUBCOUNT,1000COUNT,1000;大于大于10001000,1 1秒到,毫秒数减秒到,毫秒数减10001000MOV MOV SIGNAL,01HSIGNAL,01H;“1;“1秒到秒到”标记置标记置1 1,由主程序计秒,由主程序计秒4646BACK:BACK:CLICLIPOP AXPOP AX;恢复现场恢复现场PUSHFPUSHF;模仿进入中断服务程序的条件模仿进入中断服务程序的条件CALLCALLCS:OLDINT1CH;CS:OLDINT1CH;进入原进入原1CH1CH中断服务程序中断服务程序IRETIRETMYINT1CHMYINT1CHENDPENDPCODECODEENDSENDS END ENDSTARTSTART47471.什么是程序驻留什么是程序驻留驻留程序驻留程序:计算机系统中,有一类特殊的程序,它们计算机系统中,有一类特殊的程序,它们常驻内存,所占用的内存空间受到常驻内存,所占用的内存空间受到DOS的保护,不会被的保护,不会被后来装入的程序覆盖。它们平时处于后来装入的程序覆盖。它们平时处于“待命待命”状态,使状态,使用者感觉不到它的存在,一旦某个条件被满足,这个程用者感觉不到它的存在,一旦某个条件被满足,这个程序被激活,进入序被激活,进入“运行运行”状态,这样的程序称为状态,这样的程序称为“驻留驻留程序程序”(简称(简称TSR程序)程序)8.2.4 8.2.4 驻留程序驻留程序48482.怎样实现程序驻留怎样实现程序驻留使用使用AH=31H的的DOS功能调用可以实现程序的驻留:功能调用可以实现程序的驻留:入口参数:入口参数:AH=31HAH=31H DX DX驻留程序的大小驻留程序的大小(以(以“节节”为单位,为单位,1 1节等于节等于1616个字节)个字节)设设置置好好入入口口参参数数,执执行行INT INT 21H21H指指令令,控控制制权权交交还还DOSDOS,同时,指定的内存区域处于同时,指定的内存区域处于DOSDOS的保护之下。的保护之下。49493.驻留程序的基本结构驻留程序的基本结构驻留程序由两部分组成:驻留程序部分,初始化及驻留驻留程序由两部分组成:驻留程序部分,初始化及驻留控制部分控制部分由于由于DOS保护的内存区域从低地址开始向高地址端延伸,保护的内存区域从低地址开始向高地址端延伸,所以应把驻留程序写在程序的头部,初始化及驻留控制所以应把驻留程序写在程序的头部,初始化及驻留控制程序写在程序的尾部程序写在程序的尾部 5050驻留程序的一般格式为驻留程序的一般格式为 :CODECODESEGMENT SEGMENT ASSUME CSASSUME CS:CODECODE,DSDS:CODECODE;驻留程序数据区驻留程序数据区 ;待驻留的程序待驻留的程序 ;MAIN:MAIN:;准备工作,如装载中断向量表准备工作,如装载中断向量表LEALEADX,MAINDX,MAIN;取驻留程序字节数;取驻留程序字节数MOVMOVCL,4CL,4SHRSHRDX,CLDX,CL;转换成;转换成“节节”数数INTINT21H21H;驻留并退出驻留并退出MOVMOVAH,31HAH,31H;驻留退出功能号;驻留退出功能号CODECODEENDSENDSEND END MAINMAIN51514.激活驻留程序激活驻留程序几种激活驻留程序的方法:几种激活驻留程序的方法:执行软中断指令执行软中断指令INTINTn n 时钟中断激活时钟中断激活热键激活热键激活 52525.驻留程序应用举例驻留程序应用举例 例例8-5将将一一个个定定时时显显示示当当前前时时间间的的程程序序驻驻留留在在内内存存中中。这个程序在屏幕的右上角显示当前时间。这个程序在屏幕的右上角显示当前时间。5353;EX805.ASM EX805.ASM 驻留程序例,驻留程序以驻留程序例,驻留程序以“后台后台”方式显示当方式显示当前前“秒秒”值值INCLUDE YLIB.HINCLUDE YLIB.HGETPS MACROGETPS MACRO;读出光标位置宏指令读出光标位置宏指令 MOVMOVAH,3AH,3 MOV MOVBH,0BH,0 INT INT10H10H MOV MOVCURSOR,DXCURSOR,DXENDMENDM5454CODECODESEGMENTSEGMENTASSUMEASSUMECS:CODECS:CODESECONDSECONDDBDB0 0;秒值秒值COUNTCOUNTDWDW0 0;毫秒值毫秒值CURSORCURSORDWDW?;原光标位置原光标位置MYINT1CHMYINT1CHPROCPROCFARFAR;1CH;1CH定时中断处理程序定时中断处理程序PUSHPUSHAXAX;保护现场保护现场PUSHPUSHBXBXPUSHPUSHCXCXPUSHPUSHDXDXPUSHPUSHCSCS;装载装载DSDSPOPPOPDSDSSTISTI5555ADDADD COUNT,55COUNT,55;毫秒计时,加毫秒计时,加5555CMPCMP COUNT,1000COUNT,1000;到到1 1秒?秒?JBJBBACKBACK;未到未到1 1秒,结束中断服务秒,结束中断服务SUBSUB COUNT,1000COUNT,1000;1;1秒到,毫秒数减秒到,毫秒数减10001000MOVMOV AL,SECOND AL,SECOND ADDADD AL,1 AL,1 ;秒值加秒值加1 1DAADAAMOVMOV SECOND,AL ;SECOND,AL ;保存秒值保存秒值CMPCMP AL,60H ;AL,60H ;秒值到秒值到6060?JNEJNE DISP ;DISP ;未到未到6060秒,转显示秒,转显示MOVMOV SECOND,0 ;SECOND,0 ;秒值到秒值到6060,恢复为,恢复为0 05656DISP:DISP:GETPS GETPS ;取原光标位置取原光标位置并保存并保存 SETCUSORSETCUSOR0,0,770,0,77;把光标设置在把光标设置在0 0行行7777列列MOVMOVBL,SECONDBL,SECOND;秒值放入秒值放入BLBLCALLCALLDISPLYDISPLY;显示秒值显示秒值MOVMOVDX,CURSORDX,CURSORSETCUSORSETCUSOR0,DH,DL0,DH,DL;恢复原光标位置恢复原光标位置 BACK:CLIBACK:CLIPOPPOPDXDX;恢复现场恢复现场POPPOPCXCXPOPPOPBXBXPOPPOPAXAXIRETIRETMYINT1CHMYINT1CHENDPENDP5757DISPLY:MOVDISPLY:MOVAL,BLAL,BL;秒值送秒值送ALALMOVMOVCL,4CL,4ROLROLAL,CLAL,CLANDANDAL,0FHAL,0FH;把秒针值十位上的数分离出来把秒针值十位上的数分离出来ADDADDAL,30HAL,30H;转换成字符码转换成字符码MOVMOVBH,0 BH,0 MOVMOVCX,1CX,1MOVMOVAH,0EHAH,0EH;显示秒值十位数显示秒值十位数INTINT10H10H5858MOVMOV AL,BL AL,BL ANDAND AL,0FH AL,0FH;把秒针值个位上的数分离出来把秒针值个位上的数分离出来ADDADD AL,30HAL,30HMOVMOV BH,0BH,0MOVMOV CX,1CX,1MOVMOV AH,0EHAH,0EH;显示秒值个位数显示秒值个位数INTINT 10H10HRETRET5959;*;*主程序主程序 *START:START:LEALEADX,MYINT1CHDX,MYINT1CHMOVMOVAX,SEG MYINT1CHAX,SEG MYINT1CHMOVMOVDS,AXDS,AXMOVMOVAL,1CHAL,1CHMOVMOVAH,25HAH,25HINTINT21H21H;设置新的设置新的1CH1CH中断向量中断向量 STISTI6060LEALEA DX,STARTDX,START;取驻留程序的字节数取驻留程序的字节数MOVMOV CL,4CL,4SHRSHR DX,CLDX,CL;以节为单位的驻留程序长度以节为单位的驻留程序长度MOVMOV AH,31HAH,31H;用功能号用功能号31H31H的的DOSDOS调用实现驻留调用实现驻留INTINT 21H21HCODECODEENDSENDSENDENDSTARTSTART6161 8.3 8.3 .COM文件文件 8.3.1 .COM8.3.1 .COM文件和文件和.EXE.EXE 文件文件 8.3.2 .COM8.3.2 .COM文件文件 62621.什么是什么是.COM文件和文件和.EXE 文件文件汇编语言编写的程序经过汇编、连接后,可生成扩展名汇编语言编写的程序经过汇编、连接后,可生成扩展名为为“.EXE”或或“.COM”的可执行程序文件,这两种文件的可执行程序文件,这两种文件都可以在都可以在DOS下运行下运行 无论是无论是.EXE文件还是文件还是.COM文件,程序在装入内存时,文件,程序在装入内存时,DOSDOS把当前可用内存的最低地址作为程序装入的起始地把当前可用内存的最低地址作为程序装入的起始地址,为程序建立大小为址,为程序建立大小为256256个字节的程序段前个字节的程序段前(PSP),然后才装入程序本身然后才装入程序本身 8.3.1.COM8.3.1.COM文件和文件和.EXE.EXE文件文件63632.COM文件和文件和.EXE 文件区别文件区别.EXE文件可以有独立的代码段、数据段和堆栈段,且可文件可以有独立的代码段、数据段和堆栈段,且可以有多个代码段、数据段,程序占用的存储空间可以超以有多个代码段、数据段,程序占用的存储空间可以超过过64KB.COM文件只有一个段,它的程序段前缀、代码段、数据文件只有一个段,它的程序段前缀、代码段、数据段和堆栈段都放在同一个物理段内,其长度不超过段和堆栈段都放在同一个物理段内,其长度不超过64KB。64641.COM文件的特点文件的特点.COM文件装入内存时,文件装入内存时,PSP、数据、程序、堆栈共用一个大数据、程序、堆栈共用一个大小固定为小固定为64K-2个字节的一个段。在这个段内,偏移地址个字节的一个段。在这个段内,偏移地址0000H开始的开始的256个字节存放程序段前缀个字节存放程序段前缀PSP,偏移地址偏移地址100H开始的内存存放开始的内存存放.COM程序和数据,堆栈则从这个段的程序和数据,堆栈则从这个段的底部开始向低地址方向延伸(图底部开始向低地址方向延伸(图8-6)。8.3.2.COM8.3.2.COM文件文件65652.COM文件源程序形式文件源程序形式 .COM文件的源程序基本形式如下:文件的源程序基本形式如下:CODESEGMENTASSUMECS:CODE,DS:CODE,ES:CODEORG 100HSTART:;程序部分程序部分 INT20H;数据定义部分数据定义部分 CODEENDSENDSTART6666 例例8-6.COM8-6.COM程序举例。下面的程序运行时输出一个字符串。程序举例。下面的程序运行时输出一个字符串。CODECODESEGMENTSEGMENTASSUMEASSUMECS:CODE,DS:CODE CS:CODE,DS:CODE ORGORG100H100HSTART:LEASTART:LEADX,MESSDX,M