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

我的博客

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

[2012-10-27 09:38] 实验十六

comment            ;

这个程序是学王爽老师的汇编以来第一次遇到难题,而且还无从下手。
debug了数次无果,最后参考了一下其他网友的经验,才得知以下知识点
1、数据标号table在编译时被赋予的偏移地址是相对于安装程序的,所以把它放在整个程序的开头
2、同时修改7ch的中断向量表时,(cs)=20h,(ip)=0,这样方便根据偏移找到table 


              assume    cs:code
        code  segment
;----------------重写中断--------------        
      begin:
              jmp       short fun
       table  dw        sub1,sub2,sub3,sub4
        fun:
              push      bx
              push      ds
              push      cx
              push      dx
                     
              cmp       ah,3
              ja        return
              mov       bl,ah
              mov       bh,0
              add       bx,bx
              mov       dx,offset table
              call      word ptr table[bx]
     return:
              pop       dx
              pop       cx
              pop       ds
              pop       bx
              iret
;--------------清屏子程序-------------------              
       sub1:
              mov       ax,0b800h
              mov       ds,ax
              mov       bx,0
              mov       cx,2000
              mov       al,' '
          s:
              mov       [bx],al
              add       bx,2
              loop      s
              ret
;--------------设置前景子程序---------------
;al的低三位控制前景色 
       sub2:
              mov       bx,0b800h
              mov       ds,bx
              mov       bx,1
              mov       cx,2000
      color:
              mov       [bx],al
              add       bx,2
              loop      color
              ret
;---------------设置背景色-----------------
;al的4 5 6 位控制背景色
       sub3:
              mov       bx,0b800h
              mov       ds,bx
              mov       bx,1
              mov       cl,4
              shl       al,cl
              mov       cx,2000
         bk:
              mov       [bx],al
              add       bx,2
              loop      bk
              ret
;--------------滚屏-----------------------
       sub4:
              mov       bx,0b800h
              mov       ds,bx
              mov       bx,0
              mov       cx,24
        row:
              mov       dx,cx
              mov       cx,80
        col:
              mov       ax,[bx+160]
              mov       [bx],ax
              add       bx,2
              loop      col
              mov       cx,dx
              loop      row
              
              mov       cx,80
              mov       al,' '
              mov       bx,160*24
       tail:
              mov       [bx],al
              add       bx,2
              loop      tail
              ret
       over:  nop
;--------------------------安装和测试程序-----------------       
      start:
              mov       ax,cs
              mov       ds,ax
              mov       si,offset begin
              mov       ax,0
              mov       es,ax
              mov       di,200h

              mov       cx,offset over - offset begin
              cld
              rep       movsb
;修改向量表 
;中断程序被调用时,table[bx]默认的段存器为cs,所以在安装程序中设置中断向量表时
;应设:cs=20h,ip=0,而不是cs=0,ip=200h  
              cli
              mov       word ptr es:[4*7ch],0
              mov       word ptr es:[4*7ch+2],20h
              sti
;测试程序

              mov       ax,0b800h
              mov       ds,ax
              mov       bx,0
              mov       al,'a'
              mov       cx,2000
          l:
              mov       [bx],al
              add       bx,2
              loop      l
              mov       ah,1
              int       21h
;测试1号功能
              mov       ah,1
              mov       al,2
              int       7ch
              mov       ah,1
              int       21h
;测试2号功能
              mov       ah,2
              mov       al,2
              int       7ch
              mov       ah,1
              int       21h
;测试3号共能
              mov       ah,3
              int       7ch
              mov       ah,1
              int       21h
;测试0号功能 
              mov       ah,0
              int       7ch
              mov       ah,1
              int       21h
;退出
              mov       ax,4c00h
              int       21h
        code  ends
              end       start
评论次数(1)  |  浏览次数(641)  |  类型(汇编作业) |  收藏此文  | 

[  fpamc   发表于  2012-10-27 11:19  ]

对的

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码