您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 汇编语言程序设计_7_2
汇编语言程序设计AssemblyLanguageProgramming高级编程专题(5)中断程序设计输入输出(I/O)输入输出指令无条件I/O方式查询式I/O方式回顾中央处理机CPU总线控制逻辑接口接口内存储器大容量存储器I/O设备I/O子系统查询式I/O方式没问题没问题没问题没问题没问题没问题中断(Interrupt)老师,我有问题!中断程序设计中断相关概念中断服务子程序设计完整中断程序的编写例子中断相关概念中断:计算机暂停现行程序的运行,转去执行另一程序以处理发生的事件,处理完毕后又自动返回原来的程序继续运行中断功能:CPU与I/O设备数据传送方式提供系统服务方式:DOS,BIOS上课上课提问回答问题中断屏蔽请勿提问IF中断嵌套老师,中断是什么?中断是一种数据传送方式…...中断嵌套老师,数据传送方式有哪些?数据传送方式有……四种!老师,中断是什么?…...中断方式的特点是效率高。中断是一种数据传送方式…...中断源中断逻辑陷入中断INT指令可屏蔽硬件中断非屏蔽中断异常中断0除数01单步3断点4溢出INTRNMI中断向量与中断类型码中断服务子程序每种中断都有与之对应的处理程序中断向量中断服务子程序的入口地址(16位偏移地址,16位段地址)中断向量表存放中断向量的表格。256个,00000H-003FFH,1KB中断类型码表格的编号n6810A7008B017000…………E3480200……00000H00001H00002H00003H00004H00005H00006H00007H0号中断中断向量偏移地址段地址4*04*0+24*14*1+21号中断中断向量偏移地址段地址n号中断中断向量偏移地址段地址4*n4*n+2中断向量表C:\debug-d0000:00000000:00006810A7008B017000-1600A9038B0170000000:00108B017000B9061202-40071202FF0312020000:0020460712020A041202-3A00A9035400A9030000:00306E00A9038800A903-A200A903FF0312020000:0040A9081202A4091202-AA0912025D0412020000:0050B00912020D02E102-C40912028B0512020000:00600E0C1202140C1202-1F0C1202AD0612020000:0070AD061202A4F000F0-37051202183B00C00000:00807210A7007C10A700-4F03E2058A03E2050000:00901703E2058610A700-9010A7009A10A7000000:00A0B810A70054027000-F20447D7B810A7000000:00B0B810A700B810A700-4001270450097EDF0000:00C0EAAE10A700E800F0-B810A700A62402D40000:00D0B810A700B810A700-B810A700B810A700.........中断响应8086/8088CPU中断响应过程获取中断类型码nPUSHFIF0保护断点:PUSHCS;PUSHIP获取中断向量跳转执行中断服务子程序……8B017000………………ISRPROCFARPUSHAXSTI......…..…..…..POPAXIRETISRENDP…………主程序主程序中断请求保护现场n中断过程恢复现场中断服务子程序目的:编写一个新的中断功能配置新的I/O设备扩充原有中断功能或截获系统操作合理合法地修改中断会增加非常有用的新功能。INT10H,扩充显示中文能够截获到系统的各种操作和消息。键盘,鼠标,文件操作中断服务子程序与一般子程序的差别:中断服务子程序应为FAR中断响应时IF=0,子程序里一般应IF1硬件中断处理程序,最后发中断结束EOI命令返回为IRET而非RET由系统进行调用中断服务子程序的编写ISRPROCFARPUSHAX……STI;便于中断嵌套……CLIEOI(EndOfInterrupt)POPAX……IRET;中断返回ISRENDP保护现场开中断处理中断关中断发中断结束命令恢复现场中断返回完整中断程序的编写中断服务子程序写好之后……挂接中断服务子程序修改中断向量保护,恢复,转发,调用,……重物2重物1重物程序1程序2钩子(HOOK)技术原中断新中断完整中断程序的编写设置新中断向量执行新中断处理保存原中断向量N号中断向量新中断完整中断程序的编写设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理原中断N号中断向量新中断完整中断程序的编写设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理原中断N号中断向量OLDISRDW?,?;ES=0MOVAX,ES:[N*4]MOVOLDISR[0],AXMOVAX,ES:[N*4+2]MOVOLDISR[2],AX设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理保存原中断向量;ES=0MOVES:[N*4],OFFSETISRMOVES:[N*4+2],SEGISR设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理设置新中断向量设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理………………执行新中断处理OLDISRDW?,?PUSHFCALLDWORDPTROLDISR设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理中断过程:……PUSHF保护断点:PUSHCS;PUSHIP取中断向量,并执行调用原中断处理OLDISRDW?,?;ES=0MOVAX,OLDISR[0]MOVES:[N*4],AXMOVAX,OLDISR[2]MOVES:[N*4+2],AX设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理恢复原中断处理通过DOS中断修改中断AH=25H——设置MOVAX,SEGISRMOVDS,AXMOVDX,OFFSETISRMOVAL,INTNOMOVAH,25HINT21HAH=35H——获取MOVAL,INTNOMOVAH,35HINT21H;ES:BX举例:定时器实现定时中断—BIOSINT08H、INT1CHBIOSINT08H—硬件中断;INT1CH—软件中断挂接INT1CH中断每55ms由系统调用一次例子挂接INT1CH,显示10次字符串挂接INT1CH,从30倒计时到0……INT1CH中断向量…….显示字符串调用原中断计数中断服务子程序挂接新中断计数器=10?是否开始恢复原中断结束主程序DATASEGMENTSTRINGDB‘INT1CHISHOOKED!',0DH,0AH,'$'OLDISRDW?,?TIMERDB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVES,AXMOVAX,ES:[1CH*4]MOVOLDISR[0],AXMOVAX,ES:[1CH*4+2]MOVOLDISR[2],AXMOVWORDPTRES:[1CH*4],OFFSETISRMOVWORDPTRES:[1CH*4+2],SEGISR;COUNTHEREAGAIN:CMPTIMER,10JAEEXITJMPAGAINEXIT:MOVAX,OLDISR[0]MOVES:[1CH*4],AXMOVAX,OLDISR[2]MOVES:[1CH*4+2],AXMOVAX,4C00HINT21HISRPROCFARPUSHDXPUSHAXSTI;便于中断嵌套LEADX,STRINGMOVAH,9INT21HINCTIMERPUSHFCALLDWORDPTROLDISRPOPAXPOPDXIRET;中断返回ISRENDPCODEENDSENDSTART设置新中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理运行结果倒计时程序Timer.asm应用:病毒与反病毒病毒截获磁盘操作——BIOSINT13H,用于传染病毒和破坏磁盘截获其它几乎所有操作——DOSINT21H,传染、破坏、保护自己截获键盘输入中断——BIOSINT09H,监视用户击键情况截获定时中断——BIOSINT08H、INT1CH,激发条件截获错误处理——DOSINT24H,隐蔽自己反病毒截获磁盘操作——BIOSINT13H,监视磁盘动作,发现不良企图截获其它几乎所有操作——DOSINT21H,监视磁盘、文件操作引导型病毒原理进入ROM-BIOS读引导至0000:007CH读入IO.SYS和MSDOS.SYS加电/复位读入COMMAND.COM并执行读引导区病毒执行病毒程序接管13H中断向量一个实例-引导病毒“小球”;============================================;病毒在引导区,开机开始执行;============================================0000:7C00:……;保存正常INT13中断地址MOVAX,[13H*4]MOV[7C07],AXMOVAX,[13H*4+2]MOV[7C09],AX;============================================;复制自身到藏身之处;============================================MOVAX,[0413];取当前未使用内存容量DECAXDECAXMOV[0413],AX;内存容量减2K以获得藏身空间MOVCL,06SHLAX,CLMOVES,AX;计算藏身内存区域的段地址MOVCX,0200;驻留于高端XORDI,DICLDREPZMOVSB;复制自身到藏身段;===========================================;接管13H磁盘操作中断;===========================================XORAX,AXMOVDS,AXMOV[13H*4],offsetNewInt13hMOV[13H*4+2],segNewInt13h;===========================================;将正常引导分区装入内存,进行正常引导;===========================================XORAX,AXMOVES,AXINT13PUSHCSPOPDSCMPBYTEPTR[000B],00;当前盘是否为软盘......JMP0000:7C00;开始正常引导过程;===============================================;以下是病毒的INT13中断处理例程;===============================================NewInt13hPROCFARPUSHDSPUSHAXSTITESTDL,F0JNZ7C81SHRAH,1DECAHJNZ7C81……CALLInfectDisk;进行传染PUSHFCALLDOWRDPTR[7C07];调用正常13H中断POPAXPOPDSIRETNewInt13hENDP总结中断相关概念中断服务子程序设计完整中断程序的编写例子保护现场开中断处理中断关中断发中断结束命令恢复现场中断返回替换原中断向量执行新中断处理调用原中断处理保存原中断向量恢复原中断处理
本文标题:汇编语言程序设计_7_2
链接地址:https://www.777doc.com/doc-3392447 .html