实验16

assume cs:code 

code segment


start:
    
     mov ax , 0
     mov es , ax
     mov word ptr es:[7ch*4] ,   offset setscreen                   //不复制程序,只是将中断向量表中7ch号中断的地址改为我的处理程序的地址,即setscreen函数的地址
     mov word ptr es:[7ch*4+2] , cs


  


     mov ax , 0b800h                                   //为了测试我加了这么一段,在屏幕中间显示一个'T' ,其实完全可以不需要这段,也可以观察到程序的效果
     mov es , ax
     mov bx , 160*12+40*2
     mov byte ptr es:[bx] , 'T'
     inc bx

     mov byte ptr es:[bx] , 2


     mov ah , 1                                         //在引发7ch中断前设置传递给setscreen函数的参数,ah中代表要调用的函数编号,al是函数2,3需要的颜色参数
     mov al , 4                                         //要观察到不同的效果,需要在ah ,al中传递不同参数,我这里传的是1 和 4,代表将屏幕前景色调整为4对于的颜色
     int 7ch
    
     mov ax , 4c00h
     int 21h






  
sub1:                                //清屏函数
     push bx
     push cx
     push es
     mov bx , 0b800h
     mov es , bx
     mov bx , 0
     mov cx , 2000


     sub1s:
     mov byte ptr es:[bx] , ' '                //全屏写空格实现清屏
     add bx , 2
     loop sub1s


     pop es
     pop cx
     pop bx
     ret


 sub2:                          //调整屏幕前景色函数
     push bx
     push cx
     push es


     mov bx , 0b800h
     mov es , bx
     mov bx , 1
     mov cx , 2000


     sub2s:
     and byte ptr es:[bx] , 11111000b
     or es:[bx] , al
     add bx , 2
     loop sub2s


     pop es
     pop cx
     pop bx
     ret 


 sub3:                        //调整屏幕背景色函数
     push bx
     push cx
     push es
     mov cl , 4
     shl al , cl


     mov bx , 0b800h
     mov es , bx
     mov bx , 1
     mov cx , 2000


     sub3s:
     and byte ptr es:[bx] , 10001111b
     or es:[bx] , al
     add bx , 2
     loop sub3s


     pop es
     pop cx
     pop bx
     ret 
     


 sub4:             //向上滚动一行的函数,实现方式:将下一行复制到当前行,然后将最后一行(第24行)全部设置为空格
     push cx
     push si
     push di
     push es
     push ds


     mov si , 0b800h
     mov es , si
     mov ds , si
     mov si , 160
     mov di , 0
     cld
     mov cx , 24


     sub4s:
     push cx
     mov cx , 160
     rep movsb
     pop cx
     loop sub4s


     mov cx , 80
     mov si , 0


     sub4s1:
     mov byte ptr [160*24+si] , ' '
     add si , 2
     loop sub4s1


     pop ds
     pop es
     pop di
     pop si
     pop cx
     ret 


setscreen:                      //中断程序直接调用的函数
     jmp short set                  
     table dw sub1 , sub2, sub3, sub4                //这里保存各个具体功能函数的偏移地址
     set:
     push bx
     cmp ah , 3                               //是否是有效参数,ah的范围在 0-3才会处理
     ja sret
     mov bl , ah
     mov bh , 0
     add bx , bx
     call word ptr table[bx]                     //根据ah的值确定函数的地址,然后调用的函数,有点函数指针的意思


     sret:
     pop bx
     ret


code ends

end start


效果(1)  ah=0 ,实现清屏


效果(2) ah=1 , al=4 ,设置前景色为4对于的色彩



效果(3) ah=2 , al=6 ,将背景色设置为6对于的色彩



效果(4) : 实现上滚一行



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值