曲径通幽论坛

标题: 对int、iret和栈的深入理解 [打印本页]

作者: beyes    时间: 2009-4-1 01:44
标题: 对int、iret和栈的深入理解
一个小程序的功能:自定义中断号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





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2