程序入口地址的直接定制表【 (1) 清屏(2) 设置前景色 (3) 设置背景色 (4) 向上滚动一行】

;编程:
; (1) 清屏
; (2) 设置前景色
; (3) 设置背景色
; (4) 向上滚动一行

;入口参数说明:
; (1)用ah寄存器传递功能号: 0 清屏, 1设置前景色,2设置背景色, 3向上滚动一行
;  (2)对于2 3 号功能,用al传送颜色值  al[0,1,2,3,4,5,6,7]

;各种功能如何实现
; (1) 清屏   :将显存中当前屏幕中的字符设为空格符
; (2) 设置前景色  :设置显存中当前屏幕中处于奇地址的属性字节的第0、1、2位
; (3) 设置背景色  :设置显存中当前屏幕中处于奇地址的属性字节的第4、5、6位
; (4) 向上滚动一行 :依次将第n+1行的内容复制到第n行,最后一行为空

assume cs:code

code segment
start:
   mov ah, 0  ;清屏
   ;mov ah, 1 ;设置前景色
   ;mov al, 4
   ;mov ah, 2 ;设置背景色
   ;mov al, 2
   ;mov ah, 3 ;向上复制一行
   call setscreen
   
   
   mov ax, 4c00h
   int 21h

;==================================================
;将这些功能子程序的入口地址存储在一个表中
;功能号*2 = 对应的功能子程序在地址表中的偏移
;param  ah  功能号
;==================================================
setscreen:
   jmp short set
   table dw sub1, sub2, sub3, sub4  ;标号table 没有':'  为 数据标号
   
 set:
   push bx
   
   cmp ah, 3  ;标号>3
   ja sret
   mov bl, ah
   mov bh, 0
   add bx, bx ;根据ab中的功能号计算对应子程序在table表中的偏移
   
   call word ptr table[bx]  
   ;相当于:
   ;  1、push IP 
   ; 2、jmp word ptr cs:table[bx]
 
 sret:
   pop bx
   ret
  
   

;=========================
;清屏子程序
;=========================
sub1:
   push bx
   push cx
   push es
   mov bx, 0b800h
   mov es, bx
   mov bx, 0
   mov cx, 2000
 subls:
   mov byte ptr es:[bx], ' '
   add bx, 2
   loop subls

   pop es
   pop cx
   pop bx
   ret
   
   
;=========================  
;设置前景色
;param  al 前景色
;========================= 
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

   
;=========================  
;设置背景色
;param  al 背景色
;al 低4位 存放颜色值
; 高4位 0
;========================= 
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:
   push cx
   push si
   push di
   push es
   push ds
   
   mov si, 0b800h
   mov es, si
   mov ds, si
   mov si, 160  ;ds:si 指向第n+1行
   mov di, 0  ;es:di 指向第n行
   cld
   mov cx, 24   ;共复制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

code ends
end start
原文地址:https://www.cnblogs.com/qintangtao/p/2873511.html