直接定址表03 – 零基础入门学习汇编语言74
第十六章:直接定址表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:清屏
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
功能子程序2:设置前景
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
功能子程序3:设置背景色
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
功能子程序4:向上滚动一行
参考源码:相关代码下载
我们可以将这些功能子程序的入口地址存储在一个表中,它们在表中的位置和功能号相对应。
对应的映射关系为:
功能号*2 = 对应的功能子程序在地址表中的偏移。
源代码实现:相关代码下载
当然,我们也可以将子程序setscreen如下实现:相关代码下载
显然,用通过比较功能号进行转移的方法,程序结构比较混乱,不利于功能的扩充。
比如说,在 setscreen 中再加入一个功能,则需要修改程序的逻辑,加入新的比较、转移指令。
用根据功能号查找地址表的方法,程序的结构清晰,便于扩充。
如果加入一个新的功能子程序,那么只需要在地址表中加入它的入口地址就可以了。
视频下载
技术, IT技术, 汇编语言, 视频教程
风险提示及免责条款
市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!
