汇编实验八 中断及应用 |
您所在的位置:网站首页 › 汇编语言应用 › 汇编实验八 中断及应用 |
一、实验目的
会自定义中断解决问题能通过定制键盘中断,实现对键盘的监听并完成一定的功能
二、实验内容过程记录
任务1-自定义中断,用中断来算算术
(1)自定义79h号中断,在中断被调用时,可以将(ah)和(al)中的两个数按(bl)中提供的运算符('+'或'-')计算,其结果由(ah)返回。编程序实现该中断并将其安装到0:200H。例如,(ah)=5,(al)=3,(bl)='+'时,(ah)=8;(ah)=5,(al)=3,(bl)='-' 时,(ah)=2。
定义并安装中断例程的代码为: 运行结果截图: 安装自定义79号中断 (2)运行下面的程序,利用自定义的79h中断解决问题assume cs:code, ss:stack stack segment stack db 16 dup (0) stack ends code segment start: mov ah, 5 mov al, 3 mov bl, '+' int 79h ;单步运行程序到此观察结果 mov ax,4c00h int 21h code ends end start 测试中断正常调用,运行截图如下:
对结果的解释(中断是如何发生的?): - 首先,设置了ah寄存器为5,al寄存器为3,bl寄存器为'+',这些是要传递给中断例程的参数。 - 然后,使用int 79h指令触发了79h号中断,这时候程序会跳转到0:200h处执行自定义的中断例程。 - 在中断例程中,你首先将bx寄存器压入栈中,以便在中断结束时恢复其原始值。 - 然后,比较bl寄存器中的运算符是否为'-',如果是,则跳转到jian标记处执行减法运算,如果不是,则继续执行加法运算。 - 对于加法运算,将al寄存器中的数加到ah寄存器中,并将结果保存在ah寄存器中。在这个例子中,结果就是8。 - 然后,跳转到endf标记处结束中断。 - 在endf标记处,将栈顶的值弹出到bx寄存器中,这样就恢复bx寄存器的原始值 - 最后,使用iret指令返回到调用该中断的程序。 - 回到原来的程序,可以观察到此时ah寄存器的值已经变成了8,这就是中断例程返回的结果。 - 最后,使用int 21h指令退出程序。 (3)给出下面的数据区定义,利用前面定义的中断79h,完成对10个“算式”的求解,其结果存放在?处。datasg segment db 8, '+', 9, ? db 9, '-', 1, ? db 2, '+', 3, ? db 7, '-', 5, ? db 4, '-', 2, ? db 8, '+', 1, ? db 5, '+', 6, ? db 13,'-', 7, ? db 8, '+', 4, ? db 8, '-', 2, ? datasg ends 调用中断解决问题的程序为(加入足量注释): 运行结果截图: 从任务1中,我学到了:从这个任务中,我学到了如何自定义一个中断,如何安装一个中断例程,如何传递参数给一个中断例程,如何在一个中断例程中执行加法或减法运算,以及如何从一个中断例程返回结果。这些都是很有用的知识,可以帮助我更好的理解汇编语言的工作原理和功能。 任务2-输数字,出字母输入1-9的数字,以其作为序号,输出对应的字母。例如,输入1,输出a;而输入4,输出d 报告内容: (1)我的程序是(我已经加入了足够的注释): (2)运行结果截图 (3)从任务2中,我学到了: 从这个任务中,我学到了如何使用int 21h指令的不同功能,如何从键盘读取和输出字符,如何操作寄存器和内存地址,以及如何定义和访问数组。这些重要的汇编语言知识,可以帮助我编写更复杂的程序。 任务3-用中断输入并显示利用BIOS系统功能调用,将键盘输入的小写字母转换成大写字母后输出显示,输入非小写字母时,什么也不显示,等待其他输入;输入‘$’字符时结束。 报告内容: (1)我的程序是: (2)运行结果截图 输入 abc 发现转换成大写字母ABC,按$退出程序 (3)从任务3中,我学到了: 我学到了如何使用int 16h指令和int 21h指令来实现键盘输入和屏幕输出,如何使用cmp指令和条件跳转指令来判断字符的范围,以及如何使用sub指令来实现大小写转换。这些很实用的汇编语言技巧,可以帮助我编写更多的交互式程序。 任务4-操作文件(选做)将下面的程序补充完整,将text指向的三行文本保存到文件中去。 注意要在程序中加入必要的注释。 assume cs:code, ds:data; ss:stack stack segment db 100H dup (?) stack ends data segment filename db 'a.txt',0 text db 'I am so happy!', 10,13 db 'I can write message to a file!', 10, 13 db 'oh, so sweat.' handle dw ? data ends code segment start: mov ax, data mov ds, ax ;创建文件——用21h中断的3ch功能(快查手册,看怎么用) ;利用出口参数判断是否成功,若成功,则保存句柄到handle(1个标识文件的16位数 ;向文件中写入文本——用21h中断的40h功能 ;利用出口参数判断是否成功,失败则退出 ;关闭文件——用21h中断的3eh功能 stop: mov ah,4ch int 21h code ends end start 程序如图: 编译,连接,运行该程序 可以发现在MASM根目录下 创建了123.txt文件 打开后可以看到数据段内容已全部写入文件中 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |