"Assembly Language" Third Edition Wang Shuang Experiment 16! ! !

Install a new int 7ch interrupt routine to provide the following function subroutines for display output

  (1).清屏
  (2).设置前景色
  (3).设置背景色
  (4).向上滚动一行
  入口参数说明如下:
      用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;
      对于1 2号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
  
  assume cs:code,ss:stack
  stack segment
      db 128 dup (0)
  stack ends
  
  code segment
  start:  mov ax,stack
          mov ss,ax
          mov sp    
          
          ;安装新中断例程  
          mov ax,0
          mov es,ax
          mov di,200h    
           
          push cs
          pop ds
          mov si,offset sub
          
          cld
          mov cx,offset subend-offset sub
          rep movsb;串传送指令
          
          ;改变中断向量表对应表项7ch值
          cli    ;防止变址程序执行中执行原7ch中断例程
          mov es:[7ch*4],200h
          mov es:[7ch*4+2],0
          sti
          
          mov ax,4c00h
          int 21h
          
    sub:  ;清屏
          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  

   sub4:  ;向上滚动一行
          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
  
  int7c:  jmp short set
          table dw sub,sub2,sub3,sub4    ;直接定址表
    set:  push bx
          
          cmp ah,3
          ja sret 
          mov bl,ah
          mov bh,0
          add bx,bx
          call word ptr table[bx]    ;调用对应地址的程序
          
   sret:  pop bx
          ret 
 subend:  nop
 code ends
 end start

Guess you like

Origin blog.csdn.net/Xgggcalled/article/details/113847047