|
一个小程序的功能:自定义中断号7ch,编写中断服务子程序。从 0000:0200 起安装中断服务器程序 ,在屏幕中间显示80个感叹号。
程序代码:
assume cs:codesg
codesg segment
start:
;------------------------------------------------------------------------------
;从 0000: 0200 起安装中断服务子程序
; ds:si--->指向要复制的中断服务程序
; es:di--->指向安装中断服务程序的地方
; 用ds:si 和 es:di 是为了配合 rep movsb 指令的复制
;-------------------------------------------------------------------------------
mov ax,cs
mov ds,ax
mov si, offset lp ;从 lp 开始处复制
mov ax,0
mov es,ax
mov di,200h ;把中断服务程序复制在 0000:0200 起的空间里
mov cx, offset lpend - offset lp ;取得要复制程序的长度
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,0b800h
mov es,ax
mov di,160*12 ;设置显示缓冲区
mov bx,offset s-offset se ;取位移,注意此处位移为 负
mov cx,80
;-----------------------
;循环显示
;-----------------------
s:
mov byte ptr es:[di],'!'
add di,2
int 7ch ;中断产生,先后入栈为:标志寄存器,CS,IP(nop指令的IP)
se:
nop
mov ax,4c00h
int 21h
;-----------------------
;中断服务子程序
;-----------------------
lp:
push bp ;因为服务子程序用到bp,所以入栈保存
mov bp,sp ;取得栈顶位置
dec cx
jcxz lpret
add [bp + 2],bx ;修改 IP 使其指向 标号 s 所代表的地址处
lpret:
pop bp ;恢复 bp
iret ;中断返回
lpend:
nop
codesg ends
end start |
|