王爽《汇编语言》第十二章 实验十二 题目解答

; 安装do0子程序,处理中断0
; do0 子程序代替0号中断,在屏幕中间显示"overflow!! dyl'"

assume cs:code

code segment
start:
 ; 用movsb安装do0 到0号中断向量

 ; 配置好movsb要用到的源地址 ds:[si] 开始
 mov ax, cs
 mov ds, ax
 mov si, offset do0
 
 ; 目的地址 为 es:[di] 开始
 mov ax, 0
 mov  es, ax
 mov di, 200h

 ; 代码长度,两个标号之间相减为代码的长度
 mov cx, offset do0end - offset do0
 cld
 rep movsb


 ; 设置中断向量表
 ; 0中断的段地址为 0*4+2
 ; 0中断的偏移地址为 0*4

 mov ax, 0
 mov es, ax
 mov word ptr es:[0*4], 200h
 mov word ptr es:[0*4+2], 0h

 mov ax, 4c00h
 int 21h

do0:
 ; 因为此程序退出时,内存会被操作系统收回,所以这里定义一个数据,放在不会被OS收回的内存里
 jmp short do0start
 db 'overflow!! dyl'
do0start:
 mov ax, cs
 mov ds, ax

  ; 因为拷贝了代码到0:200之后,数据是从202h 地址开始开始的,jmp short do0start 占了2个字节
 mov si, 202h 

 ; 拷贝到显存的中间位置
 mov ax, 0b800h
 mov es, ax
 mov di, 12*160+36*2

 mov cx, 14

 s:
  ; 从 ds:[si] 开始的
  mov al, [si]
  mov es:[di], al
  inc si
  add di, 2
  loop s
    
 mov ax, 4c00h
 int 21h

 iret
do0end: nop

code ends

end start

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值