汇编实验八 中断及应用

一、实验目的

  1. 会自定义中断解决问题
  2. 能通过定制键盘中断,实现对键盘的监听并完成一定的功能   

二、实验内容过程记录

任务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文件

打开后可以看到数据段内容已全部写入文件中

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
微机原理与汇编语言-实验报告(中北大学大数据学院)(前4个实验都可以直接运行,后面的几个需要用到proteus,这个要自己根据自己的情况搞,咱就不能保证在你电脑上能不能运行了) 实验一 简单程序设计 1. 编制一个简单的运算程序,并且调试完成。 2. 编制一个计算x=a2+b2 3. 验证上述结果的正确 实验二 循环、分支程序设计 1. 编制一个统计数组中正负数个数及均值的程序,并且调试完成得到正确的结果。 2. 设计计算Y=1+2+3+....,直到累加和刚好大于10000的程序并且调试完成。 3. 对给定数组中的所有元素,按从大到小的顺序排序,并且加以验证。 实验三 系统功能调用实验 1.编制一个具有屏幕提示和键盘输入的程序,键盘输入一个人名,在屏幕上显示“Hello 人名!”; 2.通过键盘输入一串包含大小写字母和数字的字符串,统计其中大写、小写字母和数字字符的个数,并将结果显示在屏幕上。 实验四 8255并行接口实验 1.将8255一个端口接8个发光二极管,用不同工作方式控制其逐次点亮发光二极管。 2.将8255另一个端口接开关,用不同工作方式,编程将开关信息在发光二极管上显示出来。 3.验证上述操作的正确性,对实验结果进行解释 实验五 键盘、LED实验 1.在实验箱上,连接小键盘和LED显示器。 2.编程将键盘输入的数字,显示在显示器上,在按键时,原来显示的数字左移一位,新按的键值显示在最右端。 3.考虑两个键组合时的输入方法 4.对实验结果进行说明 实验中断实验 1.连接实验箱上的数码管,通过消抖开关作为中断源。 2.编写程序,完成在中断服务程序中记录中断次数,在主程序中显示按键次数。 3.将消抖开关换成一般开关,用同样的程序,再测试,仔细观察,发现了什么,为什么? 实验七 定时/计数器实验 1.使用计数器对消抖开关的按动次数进行计数,显示当前的计数值。 2.对实验箱中系统时钟进行计数,改变计数初值(两个初值要相差很大),观察有什么不同。 3.8253的初值用0和1,观察结果,并加以分析。 4.分析实验结果,并对实验结果进行说明。 实验 综合实验 1.将实验箱设计成一个电子表,该表能分时(或按键切换)显示年月日、时分秒; 2.设置按键,通过按键可以修正日期和时间,在修正日期、时间时,电子表仍然可以继续工作。 3.AD实验,用显示器显示当前AD的输入电压值,要求精确到小数点后2位数(选做)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀桃李不言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值