实验13 编写、应用中断

int指令的最终功能和call指令类似,都是调用一段程序

两者的根本区别表现在服务时间和服务对象上不一样。(本段叙述参考原文:http://blog.csdn.net/jxq0816/article/details/50121563)
1)调用子程序发生的时间是已知的和固定的,即在主程序的调用指令(CALL)执行时发生主程序调用子程序过程,调用指令所在位置是已知的和固定的;而中断过程发生的时间一般是随机的,CPU在执行某一主程序时受到中断源提出的中断申请,就发生中断过程,而中断申请一般由硬件电路产生,申请时间是随机的。也可以说,调用子程序是程序设计者事先安排好的,而执行中断服务程序是由系统工作环境随机决定的
2)子程序完全为主程序服务,两者属于主从关系。主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序二者一般是无关的,两者是平行关系。
3)主程序调用子程序的过程完全属于软件处理过程,不需要专门的硬件电路,而中断处理系统是一个软、硬件结合的系统,需要专门的硬件电路才能完成中断处理的过程。
4)子程序嵌套可以实现若干级,嵌套的最多级数受计算机内存开辟的堆栈大小限制;而中断嵌套级数主要由中断优先级来决定,一般优先级不会很大。

从宏观上看,虽然程序中断方式克服了程序查询方式中CPU"踏步"现象,实现了CPU与IO并行工作,提高了CPU的资源利用率,但从微观操作分析,CPU在处理中断程序时,仍需暂停原程序的正常运行,尤其是当高速I/O设备或辅助存储器频繁地、成批地与主存交换信息时,需不断打断CPU执行现行程序,而执行中断服务程序。

在完成这个实验时,可参看下面相关的附注实验。

(1)

安装程序:

assume cs:codesg  codesg segment  
start:  mov ax, cs  mov ds, ax  mov si, offset show_str      ;设置ds:si指向源地址  mov ax, 0  mov es, ax            mov di, 200h            ;设置es:si指目的地址  mov cx, offset show_strend - offset show_str  ;设置cx传输长度  cld  rep movsb  mov ax, 0       ;设置中断向量表  mov es, ax  mov word ptr es:[7ch*4], 200h  mov word ptr es:[7ch*4+2], 0  mov ax, 4c00h  int 21h  ;-------show_str---------------  
show_str:  push si  push di  push cx  push bx  mov bl, cl  mov ax, 0b800h  mov es, ax  mov di, 0  mov al, 160  mul dh  mov di, ax  mov al, 2       ;es:di point to display memory  mul dl  add di, ax  s:  xor cx, cx  mov cl, ds:[si]  jcxz ok  mov es:[di+0], cl  mov es:[di+1], bl  add si, 1  add di, 2  jmp s  ok: pop bx  pop cx  pop di  pop si  iret show_strend:nopcodesg ends  
end start  


应用程序:

assume cs:codedata segmentdb 'welcome to masm!', 0
data endscode segment
start:	mov dh, 10mov dl, 10mov cl, 2mov ax, datamov ds, axmov si, 0int 7chmov ax, 4c00hint 21hcode ends
end start


实验结果:



体会:show_str既可以用call子程序方式来调用,也可以用中断的方式来调用,这两者有各自的特点和用途,本篇开头已经略述。


(2)

附三中已经有类似实现,这里略去。


(3)下面的程序,分别在屏幕的第2,4,6,8行显示4句英文诗,补全程序。

代码如下:

assume cs:code	;不写start,默认从cs:0开始读取指令code segment
s1:        db 'Good,better,best,','$' 
s2:        db 'Never let it rest,','$' 
s3:        db 'Till good is better,','$' 
s4:        db 'And better,best.','$' 
s:         dw offset s1,offset s2,offset s3,offset s4 
row:       db 2,4,6,8start:	mov ax, csmov ds, axmov bx, offset smov si, offset rowmov cx, 4ok:	mov bh, 0mov dh, ds:[si]mov dl, 0mov ah, 2int 10hmov dx, ds:[bx]mov ah, 9int 21hadd bx, 2inc siloop okmov ax, 4c00hint 21hcode ends
end start


实验结果:


实验体会:

这个才是在现实中解决问题的方式--》用别人已经造好的轮子。世界要靠大家的合作才能更好的发展,自己直接用别人的轮子即可;但是首先你好了解别人的轮子是怎么造的,完全不理会原理而只会使用,有可能被组装出来的“汽车”非常的难用。总之,研究其理,用其产品。


附一:编写,安装中断7ch中断例程,实现word型数据求平方(课本253页)

1,安装程序代码:

assume cs:codesg  codesg segment  
start:  mov ax, cs  mov ds, ax  mov si, offset sqr      ;设置ds:si指向源地址  mov ax, 0  mov es, ax            mov di, 200h            ;设置es:si指目的地址  mov cx, offset sqrend - offset sqr  ;设置cx传输长度  cld  rep movsb  mov ax, 0       ;设置中断向量表  mov es, ax  mov word ptr es:[7ch*4], 200h  mov word ptr es:[7ch*4+2], 0  mov ax, 4c00h  int 21h  ;sqr------------------------  
sqr:	mul axiret
sqrend: nopcodesg ends  
end start  

2,应用代码

assume cs:codesgcodesg segment
start:	mov ax, 3456int 7chadd ax, axadc dx, dxmov ax, 4c00hint 21hcodesg ends
end start

3,实验结果



附二:编写,安装中断7ch中断例程,实现字符串字母全变成大写(课本254页)

1,安装程序代码:

assume cs:codesg  codesg segment  
start:  mov ax, cs  mov ds, ax  mov si, offset capital      ;设置ds:si指向源地址  mov ax, 0  mov es, ax            mov di, 200h            ;设置es:si指目的地址  mov cx, offset capitalend - offset capital  ;设置cx传输长度  cld  rep movsb  mov ax, 0       ;设置中断向量表  mov es, ax  mov word ptr es:[7ch*4], 200h  mov word ptr es:[7ch*4+2], 0  mov ax, 4c00h  int 21h  ;capital------------------------  
capital:push cxpush si
change:	mov cl, [si]mov ch, 0jcxz okand byte ptr [si], 11011111binc sijmp short changeok:	pop sipop cxiretcapitalend:nop
codesg ends  
end start  

2,应用程序

assume cs:codesgdata segmentdb 'conversation', 0
data endscodesg segment
start:	mov ax, datamov ds, axmov si, 0int 7chmov ax, 4c00hint 21hcodesg ends
end start
3,实验结果



附三:编写,安装中断7ch中断例程,实现loop指令功能(课本256页)

1,安装程序


assume cs:codesg  codesg segment  
start:  mov ax, cs  mov ds, ax  mov si, offset lp     ;设置ds:si指向源地址  mov ax, 0  mov es, ax            mov di, 200h            ;设置es:si指目的地址  mov cx, offset lpend - offset lp  ;设置cx传输长度  cld  rep movsb  mov ax, 0       ;设置中断向量表  mov es, ax  mov word ptr es:[7ch*4], 200h  mov word ptr es:[7ch*4+2], 0  mov ax, 4c00h  int 21h  ;lp------------------------  
lp:	mov bp, spdec cxjcxz lpretadd [bp+0], bx
lpret:	iret
lpend:	nopcodesg ends  
end start  


2,应用程序

assume cs:codesg  codesg segment  
start:  mov ax, 0b800hmov es, axmov di, 160*12mov bx, offset s - offset semov cx, 8
s:	mov byte ptr es:[di], '!'add di, 2int 7ch
se:	nopmov ax, 4c00h  int 21h  codesg ends  
end start  


3,实验结果



附四:调用BIOS中断例程

int10中断例程是bios提供的中断例程,其中包含了多个和屏幕输出相关的子程序,确定子程序要通过ah来传递内部子程序的编号,代码如下:

assume cs:codesg  codesg segment  
start:  mov ah, 9mov al, 'a'mov bl, 11001010bmov bh, 0mov cx, 3int 10hmov ax, 4c00h  int 21h  codesg ends  
end start  

实验结果:



附五:调用dos中断例程,在屏幕的第5行12列显示字符串“Welcome to masm!”

mov ax, 4c00h

int 21h

int 21h中断例程是dos提供的中断例程,其中包含了dos提供给程序员在编程时调用的子程序。int 21h中断例程的4ch号子程序是返回功能。

(ah)=9表示调用第21h号中断例程的第9号子程序,功能为在光标位置显示字符串,可以提供要显示的字符串的地址作为参数。

代码如下:

assume cs:codesg  data segmentdb 'Welcome to masm!', '$'
data endscodesg segment  
start:  mov ah, 2	;置光标mov bh, 0	;第0页mov dh, 5	;dh行mov dl, 12	;dl列int 10h		;BIOS中断mov ax, datamov ds, axmov dx, 0	;point to first address of datamov ah, 9int 21hmov ax, 4c00h  int 21h  codesg ends  
end start  

实验结果:



从实验四,五可以看出,遇到打印相关的需求,直接调用BIOS,操作系统的相关中中断例程即可,无需自己再造轮子。









本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORACLE分页查询

先看SQL语句 create table USERS (USER_ID VARCHAR2(10) primary key not null, --登录名USER_NAME VARCHAR2(20) not null,--用户名(昵称)USER_PASSWORD VARCHAR2(20) not null,--密码USER_SEX VARCHAR2(2) not null,--性别USER_BIRTHDAY DATE…

实验14:访问CMOS RAM显示当前日期和时间

下面的代码实现的功能是实时的显示时间,显示的效果就如同一个电子时钟,这个代码来自于“网易云课堂”讲汇编的一位老师(从0开始,讲的非常的好),这段代码老师写的太好了,贴在下面学习效仿一下&am…

前端学习(1047):todolist删除数据2

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>todoList待办事项</title><script src"…

实验15 安装新的int 9中断例程

这个实验综合了外中断&#xff0c;内中断&#xff0c;应该是全书最精华的一个实验&#xff0c;常常思考整个程序的流程&#xff0c;指导这个流程觉得熟悉、自然。 代码如下&#xff1a; assume cs:code, ss:stackstack segmentdb 128 dup(0) stack endscode segment start:mov…

前端学习(1048):todolist正在进行和已经完成阶段

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>todoList待办事项</title><script src"…

一个web版的计算器

非小白勿入&#xff01;&#xff01;&#xff01; emmmm&#xff0c;最近写js作业复习题&#xff0c;有个计算器的题目&#xff0c;我就拿来啦&#xff0c;哈哈哈。 想着html也是一种良好的界面嘛&#xff0c;还可以手动改变(js)&#xff0c;哈哈哈&#xff0c;就有此了。 关键…

前端学习(1049):todolist正在进行和已经完成阶段2

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>todoList待办事项</title><script src"…

终于学会上传图片了\( ̄︶ ̄*\))

actionbigItem要点使用smartupload jar 包html 表单提交数据有三种类型的提交bigItem 做项目&#xff0c;发现了一个技术难点。 要上传图片到服务器。 要点 1&#xff0c;smartupload jar 包下载。 2&#xff0c;部署jar包 使用smartupload jar 包 Jsp页面操作 <html…

前端学习(1050):todolist正在进行个数和已完成个数

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>todoList待办事项</title><script src"…

第一次体验python有感

python解释器python学习工具pycharmpython的类库&#xff08;numpy matplotlib&#xff09; python是一门动态型的语言&#xff0c;无需变量&#xff0c;有值&#xff0c;它自动确认变量&#xff0c;类库及其强大&#xff0c;丰富&#xff0c;几句代码&#xff0c;便可做出东西…

第三章 汇编语言和汇编软件

本章的实验的主要任务是安装NASM这个软件&#xff0c;在安装的时候有一个重要的一点就是软件版本要严格按照书中的要求&#xff0c;虽然作者说过可以下载更新的版本&#xff0c;但是实践表明会出现各种莫名的错误&#xff0c;书中的所有软件都可以在网上很容易找到☺&#xff0…

第四章 虚拟机的安装和使用

本章的主要是用virtualBox创建一个虚拟机&#xff0c;创建的过程基本上和书上的一样&#xff0c;有个别不一样的地方也不难&#xff0c;百度一下就知道了。 最后测试自己的虚拟VHD硬盘是否安装成功的方法&#xff1a; 1&#xff0c;用fixvhdwr.exe打开自己创建的虚拟硬盘Kong…

数据结构的介绍

数据结构逻辑结构集合线性结构树形结构图形结构数据的储存结构顺序储存结构链式储存结构索引储存结构散列储存结构数据的操作数据结构分为 逻辑&#xff0c;储存&#xff0c;数据的操作。逻辑结构 是指数据间存在的逻辑关系&#xff0c;与数据的储存无关。 两个要素组成&#…

第五章 编写主引导扇区代码

本章的思路是&#xff0c;在本机上上写一段代码&#xff08;这些代码的意义是往显存中写一些数据&#xff09;--》编译成bin文件--》写入到vhd硬盘的引导扇区&#xff08;即第一扇区&#xff0c;见第四章详述&#xff09;--》开机从硬盘启动&#xff0c;从而执行了自己写的这段…

第六章 相同的功能,不同的代码

本章的代码和上一章实现的是同样的功能&#xff0c;但是本章采用更合理的技巧去组织代码&#xff0c;使代码更通用、易懂。具体代码贴在下面&#xff0c; ;代码清单6-1;文件名&#xff1a;c06_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码;创建日期&#xff1a;2011-4-12 2…

线性表----链表

链表分为单链表&#xff0c;循环链表&#xff0c;双向链表。 1&#xff0c;链表 采用链式方式储存的线性表称为链表&#xff0c;链表是用若干地址分散的存储单元存储数据元素。必须采用附加信息表示数据元素之间的逻辑关系&#xff08;逻辑上相邻结点地址-指针域&#xff09;。…

第七章 比高斯更快的计算

下面这段代码的功能是在显存0xb800:0 写入“123...1005050”这个字符串&#xff0c;没有什么难度。 ;代码清单7-1;文件名&#xff1a;c07_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码;创建日期&#xff1a;2011-4-13 18:02jmp near startmessage db 123...100start:mov ax…

第8章 硬盘和显卡的访问与控制

首先声明&#xff0c;这一章非常重要&#xff0c;如果刚开始读不懂&#xff0c;读不下去&#xff0c;一定要坚持&#xff0c;还有读这本书的一个要求是王爽《汇编语言》看两遍&#xff0c;并做完所有的课后实验。这一章其实是操作系统的的加载和引导过程。其中涉及的有硬盘读写…

和不安全的Android说再见,Google为它添加新铠甲

伴随着最近被曝出的Heartbleed漏洞&#xff0c;安全问题再次成为网络上的热点话题。虽然Android的安全性并没有外界传言的那样脆弱&#xff0c;但Google还是在继续为其增加防护措施。根据Android官方博客的消息&#xff0c;Google最近对Android上的应用程序验证机制进行了一次升…

face-recognition库(人脸识别库)安装,使用

一&#xff0c;起因 1&#xff0c;在某hub上下载了所谓“最简单的人脸识别项目”。 2&#xff0c;开始了face-recognition的安装之路。 3&#xff0c;人脸识别在win10上的使用&#xff0c;识别图像上面的人脸。 二&#xff0c;安装face-recognition库 1&#xff0c;我用的都…