1.问题

2.思路


3.代码
assume cs:codesg
codesg segment
main:mov ah,1 ;传递功能序号
mov al,2 ;传送颜色值
call setscreen
mov ax,4c00h
int 21h
setscreen:
jmp short set
table dw sub1,sub2,sub3,sub4
set:mov bx,0b800H
mov es,bx ;附加寄存器保存显示器段地址
dec ah
add ah,ah ;因为table表是dw,2个字节
mov bl,ah
mov bh,0
call table[bx] ;调用table表中子程序的IP偏移地址
;功能4:向上滚动一行
sub4:push cx
push es
push ds
push si
push di
mov si,0b800H
mov es,si
mov di,0 ;目标地址es:di,第一行开始
mov ds,si
mov si,160 ;源地址ds:si,第二行开始
cld ;将方向标志DF clear零,也就是si、di递增
mov cx,24 ;显示器总共25行。循环24次,将所有行都向上移动一行。
s4:push cx
mov cx,80 ;每行160个字节,每次串复制一个word(2个字节),需要循环80次
rep movsw ;重复执行rep后的串处理指令,按word长度执行,知道cx递减到0。因为是word,每次循环si、di都会加2
pop cx
loop s4
;最后一行清零
mov cx,80
mov si,0
s5:mov byte ptr es:[160*24+si],' '
add si,2
loop s5
pop di
pop si
pop ds
pop es
pop cx
ret
;功能2:设置前景色
sub2:push bx
push cx
push es
mov cx,2000 ;循环次数
mov bx,1
s2:and byte ptr es:[bx],11111000b ;显示器内存单元中高字节放显示的字符的属性(前景和背景RGB等)
or es:[bx],al ;设置前景色RGB为2(0010),也就是绿色
add bx,2
loop s2
pop es
pop cx
pop bx
ret
;功能1:清屏
sub1:push bx
push cx
push es
mov cx,2000 ;循环次数
mov bx,0
s1:mov byte ptr es:[bx],' ' ;显示器内存单元中低字节放显示的字符,高字节放显示的字符的属性(前景和背景RGB等)
add bx,2
loop s1
pop es
pop cx
pop bx
ret
;功能3:设置背景色
sub3:push bx
push cx
push es
mov cl,4
shl al,cl ;al逻辑左移4位
mov cx,2000
mov bx,1
s3:and byte ptr es:[bx],10001111b ;显示器内存单元中高字节放显示的字符的属性(前景和背景RGB等)
or es:[bx],al ;设置背景色RGB为2(0010),也就是绿色
add bx,2
loop s3
pop es
pop cx
pop bx
ret
codesg ends
end main
4.运行程序
功能2:设置前景色为绿色


功能3:设置背景色为蓝色


5.直接定址表的优势

该程序用汇编语言在DOS系统下实现屏幕操作,包括清屏、设置前景色为绿色、设置背景色为蓝色的功能。通过直接定址表调用不同的子程序,修改显示器内存中的颜色属性来达到目的。子程序包括清屏、设置前景色、设置背景色和向上滚动一行等基本屏幕控制功能。
15万+

被折叠的 条评论
为什么被折叠?



