第十六章:直接定址表03
让编程改变世界
Change the world by program
程序入口地址的直接定址表
我们看下面的问题:实现一个子程序setscreen ,为显示输出提供如下功能:
(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行处:最后一行为空。 我们将这4 个功能分别写为 4 个子程序,请读者根据编程思想,自行读懂下面的程序。 程序功能分别实现讲解:gogogo ---->>>功能子程序1:清屏
[codesyntax lang="asm"]sub1: 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[/codesyntax]
功能子程序2:设置前景
[codesyntax lang="asm"]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[/codesyntax]
功能子程序3:设置背景色
[codesyntax lang="asm"]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 sub2s pop es pop cx pop bx ret[/codesyntax]