关于屏幕属性和滚屏
乍看题目,可能以为我是个高手,嘎嘎。其实非也!从2010年12月6日开始,正式加入王老师(王爽)的学习活动,我们的现在的学习课程就是汇编,很有意思的一门语言。以前的课程是有汇编的,虽然考试的时候也拿了个不错的成绩,可那也就是考试前突击的结果。实际上对这门语言的实质并不了解,只是简单的知道一些表面的东西。现在有这个机会跟王老师学习,感觉自己很幸运啊。
废话少说,开始咱今天的正题:
首先,提个问题:为什么我们用cmd进入虚模式的doc界面,输入debug,可以用一些R、A、T、U、E、D等命令。展示在我们面前的界面是黑底白字,我们是否可以进行更改?
第一, 进入doc时,输入是黑底白字,应该是系统这么安排的,不关我们的事,那么我们是否可以对它进行更改呢?答案是肯定的。
首先我们要知道,为什么我们在B800:0—B800:F0F改写内容时,很简
单,这块显存的内容对应的我们的显示器的当前页,也就是可以展示给我们
的这一页。我们知道,在doc中,一行可以显示80个字符,但它是由160个字
节控制的。那么那80个字节干吗去了?跑了不成?呵呵,当然不是。屏幕上
的每个字符时由两个字节控制的,第一个字符是咱们要显示的内容,它的下
一个字节用来控制它的属性(比如用什么形式来显示第一个字符)。那么我
们怎么来改变我们屏 幕的属性呢?
让我们来做个操作:进入debug,输入 –e B800:F00 71 71 71 71 71 然后回车,发现了什么?是的,屏幕的最后一行的前几个字符变白底蓝字了。让我们继续输入回车,不管我们输入多少次回车,只要我们当前页全部显示完之后,接下来的屏幕全部是白底蓝字。这是为什么呢?
我们可以做个假设,①当我们改变显存 B800:0—B800:F0F的某一块的内容时,接下来(因为是滚屏)显存的内容都会经过我们改的这一块内存单元,所以属性就跟着改了。②当前屏显示完后,接下来的一屏是由B800:F01 这个字节来控制的。
假设①是成立的,我们再来做个小操作 (如果你当前页面时白底蓝字的话)–e B800:A0 7 7 7 7 然后回车,我们发现屏幕的第二行的前几个字符颜色又发生了变化,变成了黑底白字。然后我们再按回车,??很奇怪,接下来的仍然是白底蓝字,并没有发生变化。可想而知,我们的第一种假设是错误的。让我们来看第二种假设是否成立。如果我们改变了整个屏幕除了B800:F01这个位置,我们看接下来的一屏是否会发生变化,没有。这就证明我们的第二种假设是成立的吗?这样下结论似乎有些牵强。那就让我们再来操作一下吧
我们发现当执行最后一句,即将显存B800:F01出的内容改为 7 这条
指令执行后接下来的一屏属性发生了变化,变成了黑底白字。好的,
我们用程序有做了测试,别问我,机器已经告诉我们第二种假设是成
立的。
关于滚屏,经过前面的介绍,估计大家已经能想到了。因为我们的当前屏幕
只显示,而且是一直显示B800:0—B800:F0F这一页的内容。我们如果想要在
当前屏幕上显示一些内容,也只是在这一地址范围内操作。可想而知,它的
滚屏机制就相当于一个圆筒,从B800:0到B800:F0F 编号,当第一屏显示完
之后,接下来要显示的内容又从B800:0开始,只不过现在的内容已经不是最
开始时的内容了。之前的内容已经被新的内容覆盖了。
我是这么理解的,如果有什么理解偏差或理解不到的地方,还请
高手们放过小妹一把,多多指教。
2010.12.12 信息院实验楼 寇晓红