;编程:
; (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