实验16 编写包含多个功能子程序的中断例程

本实验是本书的第二个精华的实验。到此可以总结,汇编的重点在于跳转,这里的跳转包括jmp,call(调用),int(中断),这反映到操作系统上就是调用,线程、进程的切换,跳转的本质是任务的切换,CPU的并行就是通过指令切换完成的,所以汇编是操作系统的基础。再说跳转,那就涉及到程序放在哪里,怎样把指令指到想执行的程序上?分为两种情况:一是不安装程序,这种情况比较好办,通过offset直接可以定位到程序的位置,然后通过jmp或者call找到位置执行;二是安装程序,本实验就是第二种情况。

1,安装代码

assume cs:codecode segment
start:	mov ax, cs    mov ds, ax    mov si, offset setscreen     ;设置ds:si指向源地址    mov ax, 0    mov es, ax              mov di, 200h            ;设置es:si指目的地址    mov cx, offset setscreenend - offset setscreen  ;设置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, 4c00hint 21h;----------------
setscreen:jmp short settable dw offset sub1 - offset setscreen + 200h,offset sub2 - offset setscreen + 200h,offset sub3 - offset setscreen + 200h,offset sub4 - offset setscreen + 200h
set:	push bxpush esmov bx, 0mov es, bxcmp ah, 3ja sretmov bl, ahxor bh, bhadd bx, bxadd bx, offset table - offset setscreen + 200hcall word ptr es:[bx]
sret:	pop espop bxiretsub1: push bx push cx push es mov bx,0b800h mov es,bx mov bx,0 mov cx,2000 
sub1s:        mov byte ptr es:[bx],' ' add bx,2 loop sub1s pop es pop cx pop bx ret sub2:   push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 
sub2s:        and byte ptr es:[bx],11111000b or es:[bx],al add bx,2 loop sub2s pop es pop cx pop bx ret sub3:        push bx push cx push es mov cl,4 shl al,cl mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 
sub3s:        and byte ptr es:[bx],al or es:[bx],al add bx,2 loop sub3s pop es pop cx pop bx ret sub4:        push cx push si push di push es push ds mov si,0b800h mov es,si mov ds,si mov si,160 mov di,0 cld mov cx,24 sub4s:        push cx mov cx,160 rep movsb pop cx loop sub4s mov cx,80 mov si,0 
sub4s1:        mov byte ptr [160*24+si],' ' add si,2 loop sub4s1 pop ds pop es pop di pop si pop cx ret 
setscreenend:nopcode ends
end start







2,应用代码(t2)

assume cs:codecode segment
start:	mov ah, 1mov al, 2int 7chmov ax, 4c00hint 21hcode ends
end start

3,实验结果:

t1.exe

masm t2.asm

link t2.obj

t2.exe

4,实验体会

jmp,loop这类指令,编译后后面跟的是两个指令的距离,所以包含它们俩的代码无论是复制还是安装,都可以正常的运行;offset这个指令后得到的指令正在运行的程序所在的段的偏移地址,一旦复制安装到其它地方一般就会出错,所以在写中断例程时,一定要考虑中断例程在0段下的偏移地址,而不是在安装程序中的偏移地址。这段话结合上面的程序不难理解。

这段程序费了我两天时间,有两个问题,一是包含offset的中断例程应该怎样处理,这一点和loop,jmp混在一起了;二是往上有个老师说程序放在0:7e00处,但是我在dosbox出现了奇怪的问题,老师讲的没错,他是在winxp上运行的,应该可以吧,但是在dosbox是确定不行的。








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

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

相关文章

前端学习(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…

逐个字符输出

num raw_input(input is : )#用户输入for i in range(len(num)): #循环取字符输出 print num[i] for i,ch in enumerate(num):#使用enumerate&#xff08;&#xff09;函数 print ch 转载于:https://www.cnblogs.com/timp/p/3652972.html

x86从实模式到保护模式实验说明

在做完王爽《汇编语言》所有实验后&#xff0c;到这里进入到操作系统的层面了。作为一个数学系的研究生自学计算机&#xff0c;摸索了很长时间后&#xff0c;感觉一个靠谱的路线是&#xff1a;先学会一门语言对计算机有一个感觉&#xff0c;能做点事情--》再学点数据结构&#…

前端学习(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;便可做出东西…

SQL - 将NULL设置为 NOT NULL

在有些时候&#xff0c;我们在创建表的时候&#xff0c;会忘掉设置某一个列的属性&#xff0c;比如忘了设置为非空&#xff0c;但是默认情况下系统会自动的设置为NULL。这样我们该怎样通过语句设置呢&#xff1f;&#xff1f; 例如有一个表&#xff0c;其中的一个属性为WM CHAR…

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

本章的实验的主要任务是安装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…

几种比较好看的滚动条样式及代码

7.代码&#xff1a; <div style"BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; OVERFLOW: auto; BORDER-LEFT: 1px solid; WIDTH: 300px; DIRECTION: rtl; BORDER-BOTTOM: 1px solid; HEIGHT: 100px;"> <p alignleft>文字</p></DIV> 6.代…

线性表----链表

链表分为单链表&#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…

Java适配器的设计模式

1&#xff0c;Java接口&#xff0c;实现接口&#xff0c;完成某个功能。比如窗口的设计&#xff0c;usb接口的设计… 本文侧重将窗体类的设计模式&#xff0c;利用Java适配器。 接口如下&#xff1a; /*** * author echo lovely* 2020年4月7日下午8:34:02* 窗体接口* */ publi…

第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;我用的都…

澳元兑美元震荡整理,后市可否追高

57理财网4月14日讯——周一(4月14日)亚市盘中&#xff0c;澳元兑美元(0.9389, -0.0002, -0.02%)震荡整理&#xff0c;现交投于0.9390附近。本周对于澳元而言可谓风险事件重重&#xff0c;除了澳洲联储将公布会议纪要外&#xff0c;中国一季度GDP数据也将在周三出炉。而在此前澳…