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

我的博客

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

[2012-05-23 23:48] 实验16「优化」

assume cs:code

code segment
;名称:7ch中断例程(setscreen)安装程序
;
;功能:
;(1) 设置前景色;
;(2) 设置背景色;
;(3) 向上滚动,或清屏
;
;参数:用ah寄存器传递功能号:
;0 表示设置前景色;
;1 表示设置背景色;2 向上滚动,或清屏
;
;对于0、1号功能,用al传送颜色,
;al∈{0,1,2,3,4,5,6,7}
;
;对于2号功能:dx存放滚动行数
;dx∈{0~24},当dx=0时,为清屏
;dx最大为24,即向上滚动24行,否则设置0,清屏

setld:jmp short set

  table  dw sub1,sub2,sub3

set:  push bx
      
   cmp ah,3
   ja sret
   mov bl,ah
   xor bh,bh
   add bx,bx
   
   call word ptr table[bx]
   
sret: pop bx
      iret
   

;以下为0号设置前景色功能
sub1: push ds
      push es
   push si
   push di
   push cx
   push ax
   ;此处保存这么多寄存器是为了兼容下面的错误处理程序
   ;更贴切的说是兼容三个功能的程序
   
   mov bx,0b800h
   mov es,bx
   mov bx,1
   mov cx,2000
   
   cmp al,7
   ja sorry
   ;此机制是检测错误的颜色输入,并转入处理程序
   
   
sub1s:and byte ptr es:[bx],11111000b
      or byte ptr es:[bx],al
   add bx,2
   loop sub1s
   
sory1:pop ax
   pop cx
   pop di
   pop si
   pop es
   pop ds
   ret
   
;以下为1号设置背景色功能
sub2: push ds
      push es
   push si
   push di
   push cx
   push ax
   
   mov bx,0b800h
   mov es,bx
   mov bx,1
   
   cmp al,7
   ja sorry
   ;此机制是检测错误的颜色输入,并转入处理程序
   
   mov cl,4
   shl al,cl
   
   mov cx,2000
   
sub2s:and byte ptr es:[bx],10001111b
      or byte ptr es:[bx],al
   add bx,2
   loop sub2s
   
   pop ax
   pop cx
   pop di
   pop si
   pop es
   pop ds
   ret
   
;以下为错误输入处理程序
sorry:jmp short show

  sor  db "'al' input range for '0-7'   "
  soo  db "'dx' maximum not more than 24"
  
show: push ds
      push es
   push si
   push di
   push cx
   
   ;由于前面设置好es,多以在此处不必设置
   mov si,offset sor
   
show2:mov di,13*160+60
   push cs
   pop ds
   mov cx,29
   mov ah,0ah
   
show1:mov al,[si]
   mov es:[di],ax
   inc si
   add di,2
   loop show1
   
   pop cx
   pop di
   pop si
   pop es
   pop ds
   jmp sory1
   
show3:push ds
      push es
   push si
   push di
   push cx
   
      mov si,offset soo
   jmp show2
   
;以下为2号向上滚动功能
sub3: push ds
      push es
   push si
   push di
   push cx
   push ax
   
   mov si,0b800h
   mov es,si
   mov ds,si
   mov si,160
   xor di,di
   mov cx,25
   
   cmp dx,24
   ja show3
   ;检测错误行数输入,并转入错误处理程序
   
   sub cx,dx
   ;计算复制行数
   cld
   
sub3s:push cx
      mov cx,160
   rep movsb
   pop cx
   loop sub3s
   
   mov ax,80
   mul dx
   mov cx,ax
   ;计算清空的行数
   
   mov si,0f9eh
   ;指向最后一行最后一个字符
   
sub3y:and byte ptr [si],0
      sub si,2
   loop sub3y
   
      pop ax
   pop cx
   pop di
   pop si
   pop es
   pop ds
   ret
   
send: nop

;以下为安装程序
start:push cs
      pop ds
   mov si,offset setld
   xor ax,ax
   mov es,ax
   mov di,200h
   mov cx,offset send - offset setld
   
   cld
   rep movsb
   
   sti
   mov word ptr es:[7ch*4],0
   mov word ptr es:[7ch*4+2],20h
   cli
   
   mov ax,4c00h
   int 21h
   
code ends
end start
;
;程序结构与第一版的实验16同理
;
;目前发现这个程序的一个问题就是,
;滚屏的功能中,复制的不是最后那几条,而是前几条。。。
评论次数(8)  |  浏览次数(856)  |  类型(汇编作业) |  收藏此文  | 

[  fpamc   发表于  2012-05-23 23:55  ]

这两个实验16可是送给tomato老师的惊喜呦!O(∩_∩)O~

[  yahwei   发表于  2012-05-24 13:15  ]

滚屏的功能,我是以字为单位,将1行至24行的内容直接复制到0行至23行,然后清空24行。这样就可以少用一个循环了。

[  fpamc   发表于  2012-05-24 13:27  ]

我的这个滚屏是可控的……向上滚动多少行在于dx……

呵呵,谢谢两个建议咯~

[  fpamc   发表于  2012-05-25 11:05  ]

滚屏算法有问题……有时间研究研究……

[  tomato   发表于  2012-05-25 17:10  ]

如果想要看到效果,是不是还需要写个应用程序?能不能弄个小软件出来,运行就可以选择功能?

[  fpamc   发表于  2012-05-25 19:10  ]

咦?
老师一说……突然冒出了思路……
不过……我要先把这个滚屏的算法研究研究……
目前这个有问题。

还有……动态时间(中断)。
先还债……欠了好多债`(*∩_∩*)′~

[  yahwei   发表于  2012-05-25 21:23  ]

滚动25行的效果不就和清屏一样了么?为什么是滚动0行等于清屏?

[  fpamc   发表于  2012-05-25 22:21  ]

  sub cx,dx 
   ;计算复制行数 
这里加一条mov dx,cx
其实不加也可以清屏,就是循环了10000h次……
浪费了资源。

整个滚屏算法有问题。
有时间我研究个相对更准确的。

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