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

我的博客

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

[2012-05-23 23:45] 实验16「扩展」

assume cs:code

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

setld:jmp short set

  table  dw sub1,sub2,sub3,sub4

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 bx
      push es
   push cx
   
   mov bx,0b800h
   mov es,bx
   xor bx,bx
   mov cx,2000
   
sub1s:and byte ptr es:[bx],0
      add bx,2
   loop sub1s
   
   pop cx
   pop es
   pop bx
   ret
   
;以下为1号设置前景色功能
sub2: push bx
      push cx
   push es
   
   mov bx,0b800h
   mov es,bx
   mov bx,1
   mov cx,2000
   
   cmp al,7
   ja sorry
   ;此机制是检测错误的颜色输入,并转入处理程序
   
   
sub2s:and byte ptr es:[bx],11111000b
      or byte ptr es:[bx],al
   add bx,2
   loop sub2s
   
sory1:pop es
   pop cx
   pop bx
   ret
   
;以下为2号设置背景色功能
sub3: push bx
      push cx
   push es
   
   mov bx,0b800h
   mov es,bx
   mov bx,1
   
   cmp al,7
   ja sorry
   ;此机制是检测错误的颜色输入,并转入处理程序
   
   mov cl,4
   shl al,cl
   
   mov cx,2000
   
sub3s:and byte ptr es:[bx],10001111b
      or byte ptr es:[bx],al
   add bx,2
   loop sub3s
   
   pop es
   pop cx
   pop bx
   ret
   
;以下为错误颜色输入,处理程序
sorry:jmp short show

  sor  db "'al' input range for '0-7'"
  
show: push ds
   push si
   push di
   push cx
   
   ;由于前面设置好es,多以在此处不必设置
   mov di,13*160+60
   push cs
   pop ds
   mov si,offset sor
   mov cx,26
   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 ds
   jmp sory1
   
;以下为3号向上滚动功能
sub4: 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
   
   sub cx,dx
   push cx
   ;计算复制行数
   cld
   
sub4s:push cx
      mov cx,160
   rep movsb
   pop cx
   loop sub4s
   
   pop cx
   mov ax,80
   mul cx
   mov cx,ax
   ;计算清空的行数
   
   mov si,0f9eh
   ;指向最后一行最后一个字符
   
sub4y:and byte ptr [si],0
      sub si,2
   loop sub4y
   
      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

;关于安装程序放到后面的原因:
;如果安装程序放到前面,那么......
;编译器在编译标号为地址是相对于前面的安装程序而产生的
;所以,放到前面才是正确的偏移地址
;
;关于注册中断向量。。
;中断程序被调用时,table[bx]默认的段存器为cs
;所以在安装程序中设置中断向量表时,应设:cs=20h,ip=0,而不是cs=0,ip=200h 
;在debug下就能看到问题。。
评论次数(3)  |  浏览次数(848)  |  类型(汇编作业) |  收藏此文  | 

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

爪机不好发图……图就免了~`(*∩_∩*)′

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

有个建议,关于颜色值的问题,其实不用判断它是否在范围内因为是逻辑运算,就算超过范围也没事的。
另外,我觉得CS应该是20H而不是200H,你觉得呢?

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

关于判断……貌似题目中要求了。
那个……cs是20h……`(*∩_∩*)′

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