实验十二_编写0号中断处理程序

本文介绍了一个简单的0号处理程序实现,当遇到除法溢出时,该程序会在屏幕中央显示“divideerror”字符串,并返回DOS。通过跟踪调试过程,读者可以深入理解中断处理及屏幕输出的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写0号处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error”。然后返回DOS。
要求:仔细跟踪调试,在理解整个过程之前,不要进行后面的学习。

assume cs:code  
code segment 
start:  mov ax,cs 
        mov ds,ax 
        mov si,offset do0;设置ds:si指向源地址 
        mov ax,0 
        mov es,ax 
        mov di,200h;设置es:di指向目的地址 
        mov cx,offset do0end - offset do0;设置cx为传输长度 
        cld;cld(clear direction)设置传输方向为正 
        rep movsb 
         
        mov ax,0;设置中断向量表 
        mov es,ax 
        mov word ptr es:[0*4],200h 
        mov word ptr es:[0*4+2],0 
         
        mov ax,4c00h 
        int 21h 
         
do0:    jmp short begin 
        db 'divide error!' 
begin: mov ax,0 
        mov ds,ax 
        mov si,202h;设置ds:si指向字符串 
        mov ax,0b800h 
        mov es,ax 
        mov di,12*160+34*2;设置es:di指向显存空间的中间位置 
         
        mov cx,13;设置cx为字符串长度 
   s:   mov al,ds:[si] 
        mov es:[di],al 
        inc si 
        add di,2 
        loop s 
         
        mov ax,4c00h 
        int 21h 

do0end:nop 
code ends 
end start 


 

转载于:https://www.cnblogs.com/xpjiang/p/4524434.html

<think>嗯,用户需要完成一个关于DOS环境下中断程序设计的实验,具体是编写7Ch中断处理程序并在另一个程序中调用它。首先,我得回忆一下DOS中断的基本知识。中断处理程序需要安装到中断向量表中,这里涉及到设置中断向量,将自定义的中断服务例程(ISR)的地址写入对应的向量位置。用户的需求是让7Ch中断在屏幕上显示班级、序、学、姓名等信息,所以中断处理程序里需要包含输出字符串的代码。 接下来,我得考虑如何用汇编语言编写这样的程序。在DOS环境下,通常使用int21h的系统调用来进行输出,比如AH=09h的功能显示字符串。中断处理程序应该保存寄存器状态,执行显示操作,然后用iret返回。安装程序需要获取当前中断向量,保存原值(如果需要恢复的话),然后设置新的向量指向自定义的ISR。不过根据题目,可能不需要恢复,直接安装即可。然后,用户需要编写两个程序:一个是安装中断处理程序的安装程序,另一个是触发7Ch中断的调用程序。安装程序需要使用MASM和LINK编译成COM文件,因为COM文件从0100h开始执行,适合这种小程序。安装程序需要将ISR驻留在内存中,可能需要使用int27h终止并驻留,或者使用int21h的31h功能。不过根据DOS版本,int27h可能更适合小型的驻留程序中断处理程序的结构方面,需要确保在中断被调用时,正确使用DOS功能显示字符串。字符串数据应该放在代码段中,以便正确访问。此外,要注意在中断处理程序中不要破坏其他寄存器的值,可能需要保存和恢复相关寄存器。接下来,关于中断向量表的截图,用户需要运行安装程序后,使用debug工具查看0000:01F0(因为7Ch的中断向量位于7Ch*4=1F0h的位置)的内容,确认向量指向安装的ISR地址。可能遇到的问题包括:字符串没有正确以$结尾导致显示异常,中断处理程序没有正确结束导致系统挂起,安装程序没有正确设置中断向量,或者驻留内存部分计算错误导致ISR被后续程序覆盖。需要确保安装程序计算正确的驻留长度,通常使用(offset pgm_end -offset start+15)/16来计算段落数。现在,我需要将这些思路转化为具体的汇编代码,并添加注释。安装程序部分,使用int21h的25h功能设置中断向量,int27h驻留。中断处理程序中使用09h功能显示字符串,然后iret返回。调用程序则直接使用int7Ch触发中断。测试时,需要先运行安装程序,再运行调用程序,观察输出是否正确。同时,用debug的d命令查看中断向量表的内容,确认7Ch的向量是否正确指向安装的处理程序。可能还需要注意代码的段地址是否正确,尤其是在安装程序中,确保CS正确传递给ISR的向量设置。此外,在编写字符串时,确保以'$'结束,否则DOS的09h功能会一直打印直到遇到$,导致乱码。最后,用户可能需要实验结果截图,但由于无法提供图片,只能描述预期结果。中断向量表的截图同理,需指导用户如何使用debug查看。</think>以下是基于DOS环境的汇编语言中断程序设计实现方案: (一)安装中断处理程序代码(install.asm): ```assembly assume cs:code, ds:data data segment msg db '2301 1 202310001 wangxiaoming$' ; 要显示的字符串,必须以$结尾 data ends code segment start: mov ax, cs ; 设置数据段为代码段 mov ds, ax ; 安装中断处理程序 mov ax, 0 mov es, ax mov di, 7Ch*4 ; 计算7Ch中断向量地址(7C*4=1F0) cli ; 禁止中断 mov es:[di], offset int7c ; 设置偏移地址 mov es:[di+2], cs ; 设置段地址 sti ; 允许中断 ; 驻留程序退出 mov dx, offset pgm_end add dx, 15 mov cl, 4 shr dx, cl ; 计算驻留长度(段落数) mov ax, 3100h ; DOS功能31h int 21h int7c proc far ; 中断处理程序 push ds push ax push dx mov ax, data mov ds, ax mov dx, offset msg mov ah, 09h ; DOS显示字符串功能 int 21h pop dx pop ax pop ds iret ; 中断返回 int7c endp pgm_end label byte ; 程序结束标记 code ends end start ``` (二)调用中断程序代码(call.asm): ```assembly assume cs:code code segment start: int 7Ch ; 调用自定义中断 mov ax, 4c00h ; 程序结束 int 21h code ends end start ``` 代码说明: 1. 安装程序通过修改中断向量表(地址0000:01F0)设置7Ch中断处理程序 2. int7c中断处理程序使用DOS功能09h显示字符串 3. 驻留程序使用DOS功能31h实现,确保中断程序常驻内存 4. 调用程序直接使用int 7Ch指令触发中断 实验步骤: 1. 编译安装程序: ```bash masm install.asm link install.obj exe2bin install.exe install.com ``` 2. 编译调用程序: ```bash masm call.asm link call.obj exe2bin call.exe call.com ``` 3. 先运行install.com安装中断程序 4. 运行call.com测试中断调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值