. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->内中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  试验12 自己写的  [待解决] 回复[ 1次 ]   点击[ 803次 ]  
zhenglxd
[帖 主]   [ 发表时间:2009-06-02 15:15 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
;实验12 编写0号中断的处理程序,使得除法溢出发生时,在屏幕中间显示字符窜"divide error"然后返回到dos.
;分析:本题重点 1.改写向量表中 0中断码 表项地址,使其指向目标程序 2.编写目标程序 作用为把"divide error"发送到显存,后返回dos
;不设置颜色可能会看不出来。。因为都黑色..
assume cs:code

code segment
mov ax,0
mov es,ax
mov word ptr es:[0],200H
mov word ptr es:[2],0    ;0中断码入口地址指向0:200H

mov ax,code
mov ds,ax
mov si,offset err_show   ;ds:si指向源地址

mov ax,0
mov es,ax
mov di,200H              ;es:di指向 0:200H

cld 
mov cx,offset err_end-offset err_show
rep movsb                ;开始复制

mov ax,4c00H
int 21H

err_show:mov ax,cs
         mov ds,ax
         mov si,offset err_char-offset err_show+200H 

;ds:si指向源地址 offset err_char-offset err_show表示2个标号间的差,由于 err_show是从0段的200开始 所以最后切记加上200H
         
         mov ax,0B800H
         mov es,ax
         mov di,12*160+36*2     ;es:di指向显存地址

         mov cx,12              ;字符窜长度
         cld                    ;DF 正向
      sl:movsb                  ;复制到显存
         mov byte ptr es:[di],2 ;设置颜色
         add di,1
         loop sl

         mov ax,4c00H
         int 21H

err_char:db "divide error"
err_end:nop
code ends
end

;开始的时候犯了几个错误1. 200H是偏移地址不是段地址 2.数值要以数字开头 3.标号 代表的是偏移地址 不是段地址 4.显存地址每2个内存单元表示一个字符 5.标号仅仅代表一个固定的偏移地址 6.写代码要仔细,不要求出了偏差值,却忘记加上初始值.
auty95
[第1楼]   [ 回复时间:2009-11-06 15:42 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-10-09 11:42
;不设置颜色可能会看不出来。。因为都黑色.. 

-------------------------------------------------------
请问楼主试验过吗?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved