qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

;问题:用中断例程完成loop指令的功能

;应用举例:在屏幕中断显示80个'!'?

1.asm

;安装中断例程

assume cs:code

code segment
start:
  mov ax, cs
  mov ds, ax
  mov si, offset lp  ;ds:[si] 只指向源地址
  mov ax, 0
  mov es, ax
  mov di, 200h   ;es:[di] 指向目标地址
  mov cx, offset lpend - offset lp ;cx为传输长度
  cld    ;传输方向为正
  rep movsb  ;rep 为cx!=0 继续 拷贝[movsb]
  
  ;设置7ch中断例程的入口地址
  mov ax, 0
  mov es, ax
  mov word ptr es:[7ch*4], 200h
  mov word ptr es:[7ch*4+2], 0
  
  mov ax, 4c00h
  int 21h
  
 
 ;7ch中断例程
 lp:
   push bp
   mov bp, sp
   dec cx
   jcxz lpert
   add ss:[bp+2], bx ;ss:[bp+2] 为 int 7ch 下一条指令的第一个字节 地址
       ;bx为 s标号 到 int 7ch 下一条指令的第一个字节 地址 的偏移地址
 lpert:
   pop bp
   iret
 lpend:
   nop
   
code ends
end start

2.asm

;实现loop

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], '!'
  mov byte ptr es:[di+1], 0ah
  add di, 2
  ;loop s
  int 7ch        ;如果(cx)!=0,转移到标号s处
 se:
  nop
  
  mov ax, 4c00h
  int 21h

code ends
end start

 

posted on 2013-01-22 12:17  qintangtao  阅读(325)  评论(0编辑  收藏  举报