版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序设计主讲:江苏苏第六周大课第6周主要内容子程序的调用和返回输入/输出(I/O)原理I/O设备数据传送方式程序控制下的数据传送无条件传送查询传送中断传送直接存储器存取(DMA)I/O处理机8086的中断系统中断服务程序的设计susujiang@汇编语言程序设计2susujiang@汇编语言程序设计3子程序的调用调用语法格式:
CALLProcName
;若ProcName与该指令在同一代码段,则为段内直接调用:
IP进栈,IP=label的偏移地址; ;若ProcName与该指令不在同一代码段,则为段间直接调用:
CS:IP进栈,CS:IP=label的分段地址;
CALLreg16/mem16 ;段内间接调用: ;IP进栈,IP=reg16/[mem16]
CALLmem32
;段间间接调用:
;CS:IP进栈,CS=mem32高字,IP=mem32低字susujiang@汇编语言程序设计4简单子程序设计方法子程序定义由PROC与ENDP伪指令实现,形式如下:
子程序名 PROC[NEAR|FAR] <过程体> RET
子程序名 ENDP子程序名在整个程序中必须是唯一的。子程序名本质上与标号一样,也具有3种属性:段地址、偏移地址和类型(NEAR或FAR)。
PROC后用关键字NEAR、FAR或空,以表示子程序的类型(缺省为NEAR)。susujiang@汇编语言程序设计5子程序的返回子程序返回分为近(段内)返回和远(段间)返回。语法格式:
RET ;近返回或远返回
RET imm16 ;近返回或远返回,并调整堆栈: SP=SP+imm16功能描述:
(1)
RET:返回地址出栈,从而实现转移到返回地址处; (2)
RETimm16:在返回地址出栈后,CPU立即将imm16加到堆栈指针SP。这种机制用来在返回前将参数从栈中移出。对标志位的影响:无。susujiang@汇编语言程序设计6子程序调用和返回时堆栈的变化远返回:POP1个双字到CS:IP近返回:POP1个字到IP
带立即数Imm的返回susujiang@汇编语言程序设计7主程序与子程序的格式例CSEG SEGMENT
‘code’ ⋮MAIN PROC FAR ⋮ CALL SUB1 ⋮ CALL SUB2 ⋮ RETMAIN ENDPSUB1 PROC NEAR ⋮ RETSUB1 ENDPSUB2 PROC NEAR ⋮ RETSUB2 ENDPCSEG ENDSSEGA SEGMENT‘code’ ⋮MAIN PROC FAR ⋮ CALL SUB3 ⋮ RETMAIN ENDPSEGA ENDS
⋮
SEGB SEGMENT‘code’ ⋮SUB3 PROC FAR ⋮ RETSUB3 ENDP ⋮SEGB ENDSsusujiang@汇编语言程序设计8子程序设计方法SUBPP PROC ;具有缺省属性的SUBPP子程序 PUSHAX ;保护寄存器:顺序压入堆栈
PUSHBX ;AX/BX/CX仅是示例
PUSHCX PUSHDX … ;<过程体> POPDX POPCX ;恢复寄存器:逆序弹出堆栈
POPBX POPAX RET ;子程序返回SUBPP ENDP ;子程序定义结束susujiang@汇编语言程序设计9子程序设计例:例:无参数传递的子程序,实现屏幕光标回车换行的功能。CRLF PROC ;实现光标回车换行
PUSH AX ;保护寄存器AX和DX PUSH DX
MOV DL,0DH ;显示回车
MOV AH,2 INT 21H MOV DL,0AH ;显示换行
MOV AH,2 INT 21H POP DX ;恢复寄存器DX和AX POP AX RET ;子程序返回CRLF ENDP ;子程序定义结束susujiang@汇编语言程序设计10第8章输入输出程序设计主要内容I/O设备数据传送方式
程序直接控制I/O方式
中断传送方式
8086的中断系统susujiang@汇编语言程序设计11输入/输出原理因I/O设备种类繁多、工作原理各异,每个I/O设备都通过专门的I/O接口与系统相连。I/O接口包含多个存放数据、状态和控制信息的寄存器,分别以端口地址标识。数据的输入/输出是通过I/O端口实现的。8086系统通过I/O指令实现对I/O端口的读写。I/O接口的功能越强、内部寄存器的种类和数量越多,程序设计就越复杂。susujiang@汇编语言程序设计12I/O设备与CPU的连接控制总线CB地址总线ABI/O接口电路数据控制状态数据总线DBCPU外设控制寄存器状态寄存器数据寄存器susujiang@汇编语言程序设计138086的I/O端口8086通过输入输出指令与外设进行数据交换呈现给程序员的外设是端口(Port),即I/O地址8088只能使用10根地址线连接外设,端口数最多为1024个,地址范围000H~3FFH8086用于外设端口的地址线为16条,端口数最多为216=65536(64K)个,端口号为0000H~0FFFFH每个端口一次只传送一个字节的数据susujiang@汇编语言程序设计14I/O端口单独编址优点:I/O端口的地址空间独立控制和地址译码电路相对简单专门的I/O指令使程序清晰易读缺点:I/O指令没有存储器指令丰富内存空间I/O空间FFFFF0FFFF80x86采用I/O端口独立编址susujiang@汇编语言程序设计15端口地址端口名称端口地址端口名称020H~023H中断屏蔽寄存器378H~37FH并行口LPT2040H~043H时针/计数器3B0H~3BBH单色显示器端口060H键盘输入端口3BCH~3BFH并行口LPT1061H扬声器(0,1位)3C0H~3CFHVGA/EGA200H~20FH游戏控制口3D0H~3DFHCGA278H~27FH并行口LPT33F0H~3F7H磁盘控制器2F8H~2FFH串行口COM23F8H~3FFH串行口COM1主要外设的I/O端口地址susujiang@汇编语言程序设计16I/O设备数据传送方式程序控制下的数据传送——通过CPU执行程序中的I/O指令来完成传送,又分为:无条件传送、查询传送、中断传送直接存储器存取(DMA)——传送请求由外设向DMA控制器(DMAC)提出,后者向CPU申请总线,最后DMAC利用系统总线来完成外设和存储器间的数据传送I/O处理机——CPU委托专门的I/O处理机来管理外设,完成传送和相应的数据处理要点:无条件和查询传送方式、中断传送方式susujiang@汇编语言程序设计17DMA传送方式希望克服程序控制传送的不足:外设→CPU→存储器外设←CPU←存储器直接存储器存取DMA:外设→存储器外设←存储器CPU释放总线控制权,由DMA控制器管理susujiang@汇编语言程序设计18DMA传送的工作过程⑴CPU对DMA控制器进行初始化设置⑵外设、DMAC和CPU三者通过应答信号建立联系:CPU将总线交给DMAC控制⑶DMA传送DMA读存储器:存储器→外设DMA写存储器:存储器←外设⑷自动增减地址和计数,判断传送完成否susujiang@汇编语言程序设计19第8章输入输出程序设计主要内容
I/O设备数据传送方式程序直接控制I/O方式
中断传送方式
8086的中断系统susujiang@汇编语言程序设计20I/O端口寻址方式8088/8086的端口有64K个,无需分段,设计有两种寻址方式直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号对大于FFH的端口只能采用间接寻址方式susujiang@汇编语言程序设计2180x86的输入输出指令输入指令INAL,imm8 ;字节输入,直接寻址INAL,DX ;字节输入,间接寻址INAX,imm8 ;字输入,直接寻址相邻2个端口INAX,DX ;字输入,间接寻址相邻2个端口输出指令OUTimm8,AL ;字节输出,直接寻址OUTDX,AL ;字节输出,间接寻址OUTimm8,AX ;字输出,直接寻址相邻2个端口OUTDX,AX ;字输出,间接寻址相邻2个端口演示演示参见p.53-54susujiang@汇编语言程序设计22数据交换方式如果输入输出一个字节,利用AL寄存器如果输入输出一个字,利用AX寄存器输入一个字,实际上是从连续两个端口输入两个字节,分别送AL(对应低地址端口)和AH(对应高地址端口)输出一个字,实际上是将AL(对应低地址端口)和AH(对应高地址端口)两个字节的内容输出给连续两个端口susujiang@汇编语言程序设计23例:从40H端口输入一个字,存到BX方法1:直接寻址
inal,40h
movbl,alinal,40h
movbh,al方法2:间接寻址
movdx,40h inal,dx
movbl,al inal,dx
movbh,al注意:
INAX,40H的含义是从相邻端口41H、40H各输入一个字节合成一个字。susujiang@汇编语言程序设计24例:向300H端口输出一个字节;唯一的方法:间接寻址,字节量输出
moval,bvar ;bvar是字节变量
movdx,300h
outdx,al例:向相邻端口300H和301H输出一个字;间接寻址,字量输出vardw5566h
movax,var ;var是字变量
movdx,300h
outdx,axsusujiang@汇编语言程序设计25无条件传送程序例:NEXT: MOVDX,8000H ;DX指向数据端口
INAL,DX ;从输入端口读信息
NOTAL ;反相
OUTDX,AL ;送输出端口显示
CALLDELAY ;调子程序延时
JMPNEXT ;重复susujiang@汇编语言程序设计26查询传送方式CPU需要先了解(查询)外设的工作状态,然后在外设可以交换信息的情况下(就绪)实现数据输入或输出对多个外设的情况,则CPU按一定顺序依次查询(轮询)。先查询的外设将优先进行数据交换查询传送的特点是:工作可靠,适用面宽,但传送效率低susujiang@汇编语言程序设计27查询输入 movdx,8000h;DX指向状态端口status: inal,dx ;读状态端口
testal,01h ;测试标志位D0 jzstatus ;D0=0,未就绪,继续查询
incdx ;D0=1就绪,DX指向数据端口
inal,dx ;从数据端口8001h输入数据susujiang@汇编语言程序设计28查询输出
movdx,8000h ;DX指向状态端口status: inal,dx ;读取状态端口的状态数据
testal,80h ;测试标志位D7 jnzstatus ;D7=1,未就绪,继续查询
incdx ;D7=0,就绪,DX指向数据端口
moval,buf ;变量buf送AL
outdx,al ;将数据输出给数据端口8001hsusujiang@汇编语言程序设计29
61H端口8253&放大器扬声器gate2out2控制其它外设8255芯片
portB PB1PB0扬声器控制示意图T个数发声原理:向扬声器发送一串脉冲信号,推动扬声器内纸盆振动,发出声音脉冲的频率,控制音高;脉冲的个数,控制音长susujiang@汇编语言程序设计30扬声器发声控制*BEEP PROC MOV AL,10110110B ;设计数器2为方式3,二进制计数
OUT 43H,AL
;按先低后高顺序写入16位计数初值
MOV AX,0533H ;初值为0533H=1331, 1.19MHz/1331=896Hz
OUT 42H,AL
;写入低8位
MOV AL,AH
OUT 42H,AL
;写入高8位
IN AL,61H
;读8255的B口原输出值
MOV AH,AL;将B口原值送AH保存
OR AL,03H ;使PB1和PB0位均为1
OUT 61H,AL
;输出使扬声器发声
SUB CX,CXG7:LOOP G7 ;延时
DEC B1 ;B1为控制发声长短的入口条件
JNZ G7 ;B1=6为长声,B1=1为短声
MOV AL,AH OUT 61H,AL
;恢复8255的B口原值,停止发声
RETBEEP ENDPsusujiang@汇编语言程序设计31查询方式I/O的程序设计程序需要先查询外设状态,然后进行数据交换实际的输入输出程序可以规定一个超时参数例:打印机查询输出的控制:要打印的字符首先提供给数据端口然后查询状态端口,确定打印机是否可以接受如果打印机还没有准备好接受数据,则继续检测一个固定时间如果打印机能够接受数据,处理器利用控制端口将数据提供给打印机susujiang@汇编语言程序设计32
⋮ movcx,(sizeofokmsg)-1 movsi,offsetokmsgprnbegin: movdx,378h ;打印机基地址
movbx,100 ;超时参数
moval,[si] ;打印字符
callprintchar ;调用打印子程序
jcprnerr ;CF=1,不能打印
incsi ;CF=0,打印正常
loopprnbegin ;继续
movdx,offsetokmsg;显示正确
jmpprnokprnerr: movdx,offseterrmsg;显示错误prnok: movah,9 int21h
⋮打印机处理主程序*susujiang@汇编语言程序设计33printcharproc pushcx outdx,al ;向数据端口输出打印字符
incdx ;基地址加1成为状态端口379hprint0: subcx,cx ;从0开始减1计数至0print1: inal,dx ;查询状态端口
testal,80h ;最高位D7反映打印机状态
jnzprint2 ;D7=1,可以接收打印数据
loopprint1 ;D7=0,不能接收打印数据
decbl ;超时参数减1,65536*100
jnzprint0 ;循环检测
stc ;规定时间内没有准备好标志
jmpprint3 ;退出打印打印处理子程序*1/2susujiang@汇编语言程序设计34print2: incdx ;基地址再加1成为控制端口37ah moval,0dh ;使最低位D0=1
outdx,al nop ;延时
moval,0ch ;使最低位D0=0
outdx,al ;产生选通脉冲,将打印字符送入打印机
clc ;设置正常标志CF=0print3: popcx ret ;返回printcharendp打印处理子程序*2/2susujiang@汇编语言程序设计35第8章输入输出程序设计主要内容
I/O设备数据传送方式
程序直接控制I/O方式中断传送方式
8086的中断系统susujiang@汇编语言程序设计36中断传送方式断点主程序中断服务程序中断请求对外设进行处理继续执行返回断点CPU在执行程序中,被内部或外部的事件所打断,转去执行一段预先安排好的中断服务程序;服务结束后,又返回原来的断点,继续执行原来的程序流程susujiang@汇编语言程序设计37中断传送的特点中断传送是一种效率更高的程序控制传送方式控制传送的中断服务程序是预先设计好的中断传送请求一般是外设随机向CPU提出的CPU对请求的检测是有规律的:一般是在每条指令的最后一个时钟周期采样中断请求输入引脚中断常用于处理输入和输出中断还有着非常广泛的应用susujiang@汇编语言程序设计38中断工作过程中断请求中断响应关中断断点保护中断识别现场保护中断服务恢复现场开中断中断返回整个中断过程涉及系统的多个部分,可分成多个阶段:
▬►中断服务是进行数据交换的实质性环节关于中断的具体内容将在下一小节介绍。susujiang@汇编语言程序设计39传送方式的比较无条件传送:慢速外设需与CPU保持同步查询传送:简单实用,效率较低中断传送:外设主动,可与CPU并行工作,但每次传送需要大量额外时间开销DMA传送:DMAC控制,外设直接和存储器进行数据传送,适合大量、快速数据传送susujiang@汇编语言程序设计40第8章输入输出程序设计主要内容
I/O设备数据传送方式
程序直接控制I/O方式
中断传送方式
8086的中断系统susujiang@汇编语言程序设计418086的中断系统1.中断源引起中断的事件称作中断源,处理该事件的程序称作中断服务程序(InterruptServiceRoutine,简称ISR)。实现中断的硬件及软件称为中断系统。2.中断号
8086系统允许256种中断,每种中断对应0~255之间唯一的编号,称为中断号或中断类型号。susujiang@汇编语言程序设计42中断分类中断可分为下列3类:硬件中断(或称外部中断):由外部硬件触发的,如键盘按键等。8086系统的硬件中断包括两类:可屏蔽中断与非屏蔽中断(中断号为2)。不能被禁止的中断称为非屏蔽中断。可以被禁止的中断称为可屏蔽中断。
CPU对硬件中断的响应时机是在一条指令执行完之后,中断处理后返回到下一条指令继续执行。软件中断(又称为陷入):在程序中执行中断调用指令引发的。当陷入处理程序用IRET指令返回后,程序从引起陷入的下一条指令继续执行。陷入的主要目的是为应用程序提供系统服务,如最常用的INT21H。异常中断:程序执行过程中因出现错误等内部意外事件而引起的中断。susujiang@汇编语言程序设计433.中断向量与中断向量表每种中断都有一个与之对应的中断服务程序。在实模式下,将中断服务程序的入口地址称作中断向量。存放256个中断向量的内存区域称为中断向量表。每个中断向量占4个字节,用32位分段地址来描述。中断向量表位于内存地址00000H~003FFH,共1KB(256*4B)。对于中断号n,中断向量所在地址为4n~4n+3。例如,0号中断的向量位于地址00000H,1号中断的向量位于地址00004H,等等。中断向量表在系统复位时初始化。8086的中断系统susujiang@汇编语言程序设计44中断向量表中断号N×4中断偏移量中断号含义中断号含义0除法出错8定时器1单步9键盘2非屏蔽中断A未用3断点BCOM24溢出CCOM15打印屏幕D硬盘(并行口)6未用E软盘7未用F打印机susujiang@汇编语言程序设计458086的中断系统4.中断响应当中断发生时,由硬件自动完成下列工作:(1)取中断类型号N(2)标志寄存器FLAGS内容进栈(3)当前代码段地址CS内容进栈(4)当前指令计数器IP内容进栈(5)禁止硬件中断,置IF=0,TF=0。(6)从中断向量表地址0:N×4取出4字节的中断向量,低字送IP,高字送CS。(7)转去执行中断服务程序。合在一起是:返回地址进栈susujiang@汇编语言程序设计46中断优先次序NMIN软件中断INTRTF=1中断响应周期读中断向量号下条指令现行指令IF=1NNNNYYYYY查询中断的顺序,决定了各种中断源的优先权软件中断除法错中断指令中断溢出中断非屏蔽中断可屏蔽中断单步中断高低susujiang@汇编语言程序设计478088的中断响应过程(续)Y还有NMITEMP=1标志寄存器入栈TEMP=TF,IF=TF=0CS:IP入栈获取中断向量执行服务程序弹出CS:IP弹出标志寄存器返回被中断程序(1)(2)(3)(4)(5)NNY(6)8088各种中断源的优先权,实际上是指被识别出来的先后顺序多种中断同时请求时,最先响应的则可能是单步中断或NMI中断susujiang@汇编语言程序设计48
众多的外部设备通过可编程中断控制器(如8259A)与CPU相连。中断控制器与CPU的通信端口中断控制器通过端口20H和21H(用于IRQ0~7)以及0A0H和0A1H(用于IRQ8~15)与CPU通信。其中,端口20H与0A0H对应于中断命令寄存器,端口21H与0A1H对应于中断屏蔽寄存器IMR。发送中断结束命令的方法
结束硬件中断,向中断命令寄存器输出字节20H。
MOV AL,20H OUT20H,AL ;对于IRQ8~15,使用端口0A0H中断控制器*susujiang@汇编语言程序设计498259A中断控制器*Intel8259A是可编程中断控制器可用于管理Intel8080/8085、8086/8088、80286/80386的可屏蔽中断8259A的基本功能一片8259A可以管理8级中断,可扩展至64级每一级中断都可单独被屏蔽或允许在中断响应周期,可提供相应的中断向量号8259A设计有多种工作方式,可通过编程选择susujiang@汇编语言程序设计50中断控制中的寄存器*中断请求寄存器IRR保存8条外界中断请求信号IR0~IR7的请求状态Di位为1表示IRi引脚有中断请求;为0表示无请求中断服务寄存器ISR保存正在被8259A服务着的中断状态Di位为1表示IRi中断正在服务中;为0表示没有被服务中断屏蔽寄存器IMR保存对中断请求信号IR的屏蔽状态Di位为1表示IRi中断被屏蔽(禁止);为0表示允许susujiang@汇编语言程序设计51中断屏蔽字的设定例:*IMR76543210定时器键盘保留串口2串口1硬盘软盘打印机某位为0则允许中断为1则禁止中断只允许键盘中断
moval,11111101bout21h,al系统重设允许打印机中断
inal,21handal,01111111bout21h,al;或者:
moval,0fdhout21h,al;或者:
inal,21handal,7fhout21h,alsusujiang@汇编语言程序设计52中断标志位的意义:IF=0:可屏蔽中断不会被响应关中断、禁止中断、中断屏蔽系统复位,使IF=0任何一个中断被响应,使IF=0执行指令CLI,使IF=0IF=1:可屏蔽中断会被响应开中断、允许中断、中断开放执行指令STI,使IF=1执行指令IRET恢复原IF状态susujiang@汇编语言程序设计53中断程序和子程序的比较它们的主要差异有:◆子程序调用一定是程序员在编写源程序时事先安排好的,是可知的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外);◆子程序调用是用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序);◆子程序的返回指令是RET,而中断服务程序的返回指令是IRET/IRETD。◆在通常情况下,子程序是由应用系统的开发者编写的,而中断服务程序是由系统软件设计者编写的。
中断处理和子程序调用的工作过程非常相似,即:暂停当前程序的执行,转而执行另一程序段,当该程序段执行完时,CPU都自动恢复原程序的执行。susujiang@汇编语言程序设计54中断处理程序设计设计中断服务程序(ISR)应注意的问题:中断服务程序是FAR过程,必须执行IRET指令实现返回。必须保护所有要修改的寄存器,尤其是硬件中断或异常的ISR。在ISR的执行过程中,若允许其它硬件(或嵌套)中断,应使用STI指令。对于硬件中断服务程序,应在返回之前,向中断控制器发送中断结束命令。(编写步骤参见p.300上方的注意)susujiang@汇编语言程序设计55
中断服务程序类型需要交换数据的外设,采用中断请求向处理器提出要求处理器执行事先设计好的中断服务程序,在中断服务程序当中实现数据交换8086可以处理256种中断,分为内部、外部两种类型外部可屏蔽中断用于与外设进行数据交换内部中断服务程序驻留中断服务程序外部可屏蔽中断服务程序susujiang@汇编语言程序设计56内部中断服务程序主程序通过中断调用指令INTn执行内部中断服务程序,其实质相当于子程序调用编写内部中断服务程序与编写子程序雷同利用过程定义伪指令PROC/ENDP但通常要执行STI指令开放可屏蔽中断最后执行IRET指令返回调用程序内部中断服务程序常用寄存器传递参数设置中断向量:AH=25H(INT21H)获取中断向量:AH=35H(INT21H)susujiang@汇编语言程序设计57
.dataintoff dw? ;保存原偏移地址intseg dw? ;保存原段地址
.code movax,3580h ;获取中断80H的中断向量
int21h movintoff,bx ;保存偏移地址
movintseg,es ;保存段基地址内部中断服务程序例——1/5获取中断向量:AH=35H(INT21H)
入口参数:AL=中断向量号出口参数:ES:BX=中断服务程序的入口地址(段基地址:偏移地址)也可用堆栈保存PUSHESPUSHBX注:用户可以根据需要编制自己的程序作为中断服务程序;并且选择合适的中断号来代替系统的中断处理功能。susujiang@汇编语言程序设计58
pushds movdx,
offsetnewint80h movax,
segnewint80h movds,
ax movax,
2580h ;设置中断80H的入口地址 int21h
popds
⋮内部中断服务程序例——2/5设置中断向量:AH=25H(INT21H)入口参数:AL=中断向量号
DS:DX=中断服务程序的段基地址:偏移地址susujiang@汇编语言程序设计59
int80h ;调用中断80h的服务程序,显示信息
movdx,intoff ;恢复中断80H的入口地址
movax,intseg movds,ax movax,2580h int21h .exit0
;返回DOS恢复设置中断向量:AH=25H(INT21H)入口参数:AL=中断向量号
DS:DX=中断服务程序的段基地址:偏移地址若前面用堆栈保存POPDXPOPDS内部中断服务程序例——3/5susujiang@汇编语言程序设计60newint80h procfar ;内部中断服务程序
sti ;开中断
pushax ;保护现场
pushbx pushcx pushsi movsi,offsetintmsg ;获取显示字符串首地址
movcx,sizeofintmsg ;获取显示字符串个数内部中断服务程序例——4/5注:用户可以根据需要编制自己的程序作为中断服务程序;本例的目的是要显示一个字符串,使用BIOS功能。susujiang@汇编语言程序设计61disp: moval,cs:[si] ;获取显示字符
movbx,0 ;显示一个字符
movah,0eh int10h ;参见p.478 incsi loopdisp popsi ;恢复现场
popcx popbx popax iret ;中断返回intmsg db'IamGreat!',0dh,0ah ;显示信息newint80h endp内部中断服务程序例——5/5susujiang@汇编语言程序设计62例8.5:每个十秒响铃一次,同时显示信息。 .modelsmall .stack .datacount dw1msg db‘Thebellisringing!’,0dh,0ah,’$’ .codemain procfarstart: movax,@data movds,ax
movax,351ch ;获取中断1cH的中断向量
int21h pushes ;保存段基地址
pushbx ;保存偏移地址
cli ;关中断susujiang@汇编语言程序设计63例8.5续-2/3
pushds ;设置新中断向量内容时要用到
movdx,segring movds,dx movdx,offsetring movax,251ch int21h popds inal,21h ;读出IMR
andal,0feh ;允许定时中断(D0)
out21h,al ;设置新IMR内容
sti ;开中断
movdi,60000delay: movsi,60000delay1:decsi jnzdelay1 decdi jnzdelay
popdx popds movax,251ch int21h movax,4c00h int21hmain endpsusujiang@汇编语言程序设计64例8.5续-3/3ring procfar pushds pushax pushcx pushdx movax,@data movds,ax sti deccount jnzexit movdx,offsetmsg movah,09h int21h movdx,100 inal,61h andal,0fchsound:xoral,02h out61h,al movcx,1400hwait1:loopwait1 decdx jnzsound movcount,182exit: cli popdx popcx popax popds iretring endp end startsusujiang@汇编语言程序设计65驻留中断服务程序*驻留程序TSR(TerminatebutStayResident)
是一种特殊应用程序,它在装入内存运行后,其部分代码仍然驻留在内存,当该段代码被激活时,它又进入运行状态。常用的驻留程序是作为某个中断处理程序的一部分,其激活条件就是系统产生了此中断的中断请求。方法:利用DOS功能31h代替4ch来终止程序
1、保存、修改中断向量表;
2、用自己定义的地址来取代中断向量表中的原地址;
3、确定驻留代码的字节数,
4、用中断21H之功能31H把需要驻留代码部分驻留在内存
程序驻留返回:AH=31H(INT21H)入口参数:AL=返回代码
DX=程序驻留的容量(节,1节=16个字节)susujiang@汇编语言程序设计66
.modeltiny .code .startup ;等价于org100h jmpstart ;跳转到本程序的开始位置newint80h proc ;驻留的中断服务程序
... ;同例题过程newint80h endp ;中断服务程序结束start: movax,cs ;主程序开始位置
movds,ax movdx,offsetnewint80h movax,2580h int21h ;设置80h的中断向量
int80h ;调用一下看看TSR程序1/2susujiang@汇编语言程序设计67
movdx,offsetistmsg ;显示驻留成功
movah,9 int21h movdx,(offsetstart)+15 ;计算驻留程序的长度(需多加15个字节) movcl,4 shrdx,cl ;除以16转换成“节”
movax,3100h ;中断服务程序驻留后,主程序返回DOS系统
int21histmsg db'INT80Hisinstalled!',0dh,0ah,'$' endTSR程序2/2susujiang@汇编语言程序设计68外部可屏蔽中断服务程序编写可屏蔽中断服务程序,要注意:要发送中断结束命令不能采用寄存器传递参数不要使用DOS系统功能调用INT21H中断服务程序尽量短小主程序除需要修改中断向量外,要注意:控制CPU的中断允许标志IF设置中断屏蔽寄存器IMRsusujiang@汇编语言程序设计69
.code movax,3509h int21h pushes pushbx ;保存原中断向量内容
cli ;关中断
pushds ;设置新中断向量内容
movax,2509h movdx,segscancode movds,dx movdx,offsetscancode int21h popds inal,21h ;读出IMR pushax ;保存原IMR内容
andal,0fdh ;允许键盘中断(D1)
out21h,al ;设置新IMR内容键盘中断服务程序1/5susujiang@汇编语言程序设计70
movbyte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安全员C证考试题库及答案
- 2025-2026学年宁夏回族自治区吴忠市高三3月份模拟考试历史试题含解析
- 2026年文化娱乐行业IP报告及未来五至十年数字内容报告
- 基于地理学科核心素养的初中地理课程评价体系构建研究教学研究课题报告
- 循证医学支持的治疗线数选择
- 初中英语演讲中语言组织策略的课题报告教学研究课题报告
- FEV咨询-2025中国汽车产业分析报告 2025 China automotive industry analysis report
- 大学英语学术英语写作中的文献引用规范课题报告教学研究课题报告
- 教师数字能力评价与培养策略研究-基于大数据与教育信息化的视角教学研究课题报告
- 川崎病随访患者满意度调查方案
- 【《离子速度成像技术研究文献综述》5500字】
- 离婚协议书 2026年民政局标准版
- 回款KPI考核制度
- 2026年及未来5年市场数据中国固态硬盘(SSD)行业市场全景分析及投资规划建议报告
- 灌溉工程巡查培训课件
- TZ208-2007 客运专线铁路电力牵引供电工程施工技术指南
- 软件研发过程管理制度(3篇)
- 建筑工程标准化培训课件
- 数据讲故事与可视化【演示文档】
- 装配式活动板房安装安全技术交底
- 小麦栽培课件
评论
0/150
提交评论