汇编网首页登录博客注册
renbin823的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新评论
最新留言
好友圈
文章收藏
友情链接

[2011-06-09 17:32] 15

图片载入中
assume cs:code

stack segment
   db 128 dup (0)
stack ends

code segment

start: mov ax,stack      ;初始化栈段
       mov ss,ax
       mov sp,128
       
       mov ax,0          ;es:di指向中断向量表0:204
       mov es,ax
       mov di,204h



       push es:[9*4]     ;压栈9号中断的中断向量
       pop es:[0]        ;出栈到es:[0]
       push es:[9*4+2]   
       pop es:[2]        
       
       push cs              ;压栈cs
       pop ds               ;出栈到ds
       mov si,offset int9   ;ds:[si]指向新的int9中断处理程序

       mov cx,offset int9end - offset int9 ;循环次数为标号                                 

          ;int9end-int9
       cld                                 ;设置df=0 及设置                                

           ;串传送为正向
       rep movsb                           ;串传送

       mov ax,0                            
       mov es,ax

       cli                            ;设置if=0及屏蔽外中断
       mov word ptr es:[9*4],204h        ;设置中断向量表的                                 

           ;中断向量指向0:204
       mov word ptr es:[9*4+2],0
       sti                              ;if=1恢复接受外中断

       mov ax,4c00h                     ;返回
       int 21h


int9: push ax                        ;压栈关联寄存器
      push cx
      push es
      push di      

      in al,60h                     ;读取60h端口的数据送入al
      
      mov di,0                      ;指向0:0双字单元中保存的                               

      ;地址信息
      mov es,di
      
      pushf                          ;压栈标志寄存器
      call dword ptr es:[0]          ;将原来的9号中断列程作 ;为子列程调用,上面为什么要压

栈标志寄存器原因是 原中断列程 ;的返回指令是 iret 指令的工作原理是 1.出栈ip 2.出栈cs 3.出栈

;标志寄存器刚好和pushf,call 指令刚好相反 

      cmp al,9eh          ;al和9eh比较不等于则返回
      jne next

      mov di,0b800h       ;等于则在显示满屏的a
      mov es,di
      mov di,0
      
      mov ah,2
      mov al,'A'
      mov cx,2000
   s: mov es:[di],ax
      add di,2
      loop s
      
      mov ax,0         ;恢复原int9不然返回后就用不了键盘哦
      mov es,ax
      
      push es:[0]
      push es:[2]
      pop es:[9*4+2]
      pop es:[9*4]

next: pop di
      pop es           ;出栈开始压栈的关联寄存器然后返回
      pop cx
      pop ax
      iret
      


int9end: nop

      
code ends
end start
评论次数(0)  |  浏览次数(429)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码