本实验是本书的第二个精华的实验。到此可以总结,汇编的重点在于跳转,这里的跳转包括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是确定不行的。

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

  1. 汇编题目:编写包含多个功能子程序的中断例程

    安装一个新的int  7ch中断例程,为显示输出提供如下的功能子程序. (1)清屏. (2)设置前景色. (3)设置背景色. (4)向上滚动一行 (一)用ah寄存器传递功能号:0表示清屏,1表 ...

  2. 实验二、80C51汇编语言编程实验:编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性。需考虑有进位和无进位情况。

    实验二.80C51汇编语言编程实验:编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性.需考虑有进位和无进位情况. 报价 200 文章目录 实验二.80C51汇编语言编 ...

  3. 用中断例程完成loop指令的功能【安装中断例程,设置中断向量表】

    ;问题:用中断例程完成loop指令的功能 ;应用举例:在屏幕中断显示80个'!'? 1.asm ;安装中断例程 assume cs:codecode segment start:mov ax, csm ...

  4. 汇编语言随笔(14)-直接定址表、检测点16和实验16

    标号 1,关于地址标号,a:,带有冒号的形式,之前我们一直使用.这种标号被用来标记指令,数据的起始地址,表示内存单元的起始地址.       后面带有冒号的地址标号,只能在代码段中使用,不能在其他段中 ...

  5. 《汇编语言》王爽(第四版) 第十六章 实验16

    文章目录 前言 一.实验任务 二.思路分析 1.程序框架 2.设置前景色 3.设置背景色 三.最终成果 1.完整代码 2.效果图 总结 前言 本文是王爽老师<汇编语言>(第四版) 第十六章 ...

  6. 汇编语言随笔(16)- 对磁盘进行读写(int 13h 中断例程)和实验 17

    磁盘读写 3.5 英寸软盘分为上下两面,每面有 80 个磁道,每个磁道又分为 18 个扇区,每个扇区的大小为 512 个字节.下面的磁盘读写均以 3.5 英寸软盘为例. 在读写扇区的时候,要给出面号. ...

  7. 汇编语言(王爽)实验十 编写子程序

    标 题: 汇编实验10-- 编写子程序 作 者: XHS_12302 时 间: 2016_7_28 16:56 实验10编写子程序 在这次实验中,我们将要编写3个子程序,通过它们来认识几个常见的问题和 ...

  8. 实验16:使用context:include-filter指定扫描包时要包含的类 实验17:使用context:exclude-filter指定扫描包时不包含的类

    实验17:使用context:exclude-filter指定扫描包时不包含的类 扫描的时候可以排除一些不要的组件 type="annotation" 指定排除规则,按照注解进行排 ...

  9. 汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)

    int 指令 int 指令的格式为:int n,n为中断类型码.这里由 n 显式的给出了调用哪一个中断处理程序.       CPU 的中断过程仍然是: (1)取中断类型码n (2)标志寄存器入栈,I ...

最新文章

  1. MVC中获取模型属性的Range和StringLength验证特性设置
  2. 关于GDPR的六大理解
  3. malloc 初始化_在C语言中,请一定记得初始化局部变量!
  4. 中点坐标公式 矩形_压轴题必备|中考数学“动点坐标”问题,这个万能解法人人都能学会!...
  5. java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用
  6. 推荐:CLR 完全介绍-一篇讲解CLR内存回收机制以及常见的调试技巧的文章
  7. linux python 环境 png,在mint-15 linux上显示python的.png图像
  8. 就如何快速免费提高网站排名小结
  9. php基础知识点指南思维导图(可下载)
  10. Django-天天生鲜项目
  11. 最小二乘支持向量机分类器(LSSVM)及Python实现
  12. php学生在线交流平台,php学生社团活动报名系统
  13. Linux查看tomcat是否启动,查看tomcat监听端口
  14. 03-SQLPlus的常用命令和使用
  15. Bibtex4word+texlive在win7配置过程及遇到的问题
  16. 一站到底名人堂成员_综艺节目数风流人物,还看《一站到底》“名人堂”!
  17. 如何实现python中的strcmp函数
  18. 如皋范湖洲朱氏开始续谱
  19. 1st Javascript Editor V3 8绝对完美破解版
  20. word-break Java code

热门文章

  1. 前端学习(869):高级事件导读
  2. html:(17):img标签和表单标签
  3. 实例4:python
  4. document.compatMode的CSS1compat
  5. Vue基础之Vue模板语法
  6. 剑指offer--重建二叉树
  7. [转]NGINX-检测客户端是通过电脑还是移动设备访问的,将请求重定向到适配的WEB站点...
  8. 【NOIP2016】换教室
  9. 作业3(学习进度表)【第四周】
  10. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍