编写并安装int 7ch中断例程,功能为完成loop指令的功能

参数:(cx)= 循环次数,(bx)= 位移

以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后cs、ip和栈中的状态。

在屏幕中间显示80个‘!’

assume cs:code
code segment
start: mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s - offset se;设置从标号se到s的转移位移
mov cx,80
s: mov byte ptr es:[di],'!'
add di,2
int 7ch ;如果(ch)!=0,转移到标号s处
se: nop
mov ax,4c00h
int 21h
code ends
end start
;--------------------int 7ch中断安装例程--------------------------------------
assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset sub_loop
mov ax,0
mov es,ax
mov di,200h
mov cx,offset sub_loopend - offset sub_loop
cld
rep movsb mov ax,0
mov es,ax
mov es:[7ch*4],200h
mov es:[7ch*4+2],0 mov ax,4c00h
int 21h sub_loop:push bp
dec cx
jcxz ok
mov bp,sp
add ss:[bp+2],bx ok: pop bp
iret
sub_loopend:nop
code ends
end start

总结:

遇到的问题:无法显示字符串"!!!!!!(80个)"

解决方法:用测试程序调试,发现调用int 7ch中断例程后程序的指向不正确

    找到以下逻辑错误(非语法错误),都是中断例程安装时的问题:

        1.mov si,sub_loop 忘了offset操作符,反汇编了一下发现有无操作符offset对生成的机器码没有影响,

    程序照样能正确的跑起来.

        2.mov si,200h 应该改为mov di,200h,因为后边用了串传送指令,默认的目的地址在es:[di]中.

收获:   1.编写程序到底是一口气先写完了再添加注释,还是边写边添加注释,我自己的看法是前者节省时间,

    思路不易被打断,写完了会比较爽.但是出了问题查错比较麻烦,后者与其相反.到底采用哪种方式,还在思索中...

        2.编程的时候最好先把框架搭建起来,里面可以有中文的描述(称其为伪代码),这样不易漏掉东西,比如就

    这个程序而言可能会忘了设置中断向量表.

实验十三_编写、应用中断例程_2 & 总结的更多相关文章

  1. 实验十五_安装新的int 9中断例程

    安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,    如果松开,就显示满屏幕的“A”:其他的键照常处理. 提示:按下一个键时产生的扫描码称为通码,松开一个键产生的扫描 ...

  2. 汇编实验15:安装新的int 9中断例程

    汇编实验15:安装新的int 9中断例程 任务 安装一个新的int 9中断例程,功能:在DOS下,按下“A”键后,除非不在松开,一旦松开后,就显示满屏幕的“A”,其他键照常处理. 预备知识概要 这次实 ...

  3. 汇编程序52:实验15 安装新的int9中断例程

    assume cs:code ;重写int9中断例程,当按住a后松开,便会产生满屏A stack segment dw dup() stack ends code segment start: mov ...

  4. 汇编试验十五:安装新的int 9中断例程

    安装新的int 9中断例程(按'A'键后显示满屏幕的'A') int 9 是外中断,同样,程序编写还是和其他中断例程类似,安装(复制),调用: 不同点是在于,他要从端口读取数据60h, Source ...

  5. 安装新的int 9中断例程

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  6. 实验十三 团队作业9:Beta冲刺与团队项目验收

    实验十三 团队作业9:Beta冲刺与团队项目验收 实验时间 2019-6-20(21) Deadline: [6.20-6.26]之间任选连续3天的23:00,以团队随笔博文提交时间为准. 评分标准: ...

  7. 王爽 <<汇编 语言>> 13.6 BIOS中断例程应用

    ;名称:ILOVEU程序 ;使用BIOS提供的中断例程 assume cs:code code segment main: ;显示背景22*80 ;dh中放行号 ;dl中放列号 bibi: push ...

  8. Gradle 1.12 翻译——第十三章 编写构建脚本

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  9. 安装新的int 9中断例程2

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

随机推荐

  1. HTML: 字符實體

    在HTML編寫中,有些字符不適合直接在代碼中寫出,比如>,<, (space空格),",',&等等,這時我們按照一定的格式將它們寫出,比如(大於)> 符號,我們用 ...

  2. razor 添加html5属性

    在 HTML5 中, 可以使用 data- 属性来表示用户数据,这些数据甚至可以是 JSON 格式的数据,对 Web 前端开发带来很大的方便. 在 MVC 的 Razor 中,可以使用匿名对象来生成定 ...

  3. 模板-高精度BigInteger

    #include <bits/stdc++.h> using namespace std; struct BigInteger { static const int BASE = 1000 ...

  4. mina学习(一)

    Mina:是一个帮助用户开发高性能和高伸缩性网络应用程序的框架 学习地址链接:http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html ...

  5. java override

    java override // 覆盖父类的方法,在子类直接调用子类内部这个方法时 public class TestCalc{ protected static class Wine{ String ...

  6. Windows下mysql自动备份的最佳方案

    网上有很多关于window下Mysql自动备份的方法,其实不乏一些不好的地方和问题,现总结出一个最好的方法供大家参考: 新建一个记事本,然后重命名为: mysql_backup.bat 然后单击右键选 ...

  7. Simplest way to serve static data from outside the application server in a Java web application

    tomcat service.xml <Context docBase="/path/to/images" path="/images" /> re ...

  8. php--在apache上配制rewrite重写

    配置步骤: 第一步:找到apache的配置文件httpd.conf(文件在conf目录下) 第二步:你首先必须得让服务器支持mod_rewrite,如果你使用的是虚拟主机,请事先询问你的主机提供商. ...

  9. android 直接启动其他应用的Service

    最近在做一个小插件,没有图标没有activity,利用其他APK启动它的service. 直奔主题,插件A,安装插件的应用B. B安装A后,由于A刚被安装,没有注册广播接收器,这里不考虑AIDL.需求 ...

  10. ASP.NET 开发笔记1

    1.GirdView  动态添加列 PostBack 后 模板列中的控件丢失的问题 http://blackboy51.blog.163.com/blog/static/511359122011910 ...