作为序言,我真的不希望我的问题得到确切的解决,只希望得到指导。我不想你给我密码。这不是家庭作业,只是我想解决的一个练习。
我只想让你告诉我如何访问VDU和直接改变同一屏幕上的字符。
屏幕分为25行80列。显示在
屏幕存储在一个称为VDU存储器的特殊存储器中(不要与普通存储器混淆
记忆)。屏幕上显示的每个字符占用VDU内存中的两个字节。
其中第一个字节包含所显示字符的ascii值,而第二个字节包含显示字符的颜色。例如,屏幕上第0行和第0列字符的ascii值存储在位置号0xB8000000处。
因此,该字符的颜色将出现在位置号0xB8000000 + 1处。同样,第0行第1列字符的ascii值将位于0xB8000000 + 2位置,其颜色将位于0xB8000000 + 3
我的任务:
利用这些知识编写一个程序,当执行时,它会不断地将屏幕上的每个大写字母转换为小写字母,并将每个小写字母转换为大写字母。当用户从键盘上点击一个键时,程序应该停止。这是一种叫做“跳舞娃娃”的猖獗病毒的活动。(对于单色适配器,请使用0xb000000而不是0xb8000000)。
我真的不知道该怎么做。我甚至连开始都没办法。

最佳答案

你指的是曾经被称为视频刷新缓冲区的东西。重要的是要说明跳舞娃娃是用来做dos的。
基本上,您希望视频内存位于程序内存中的地址0xB8000000。然而,现代操作系统(如linux/windows/mac os x)提供了一种虚拟内存机制,防止应用程序直接操作设备。所以应用程序看到的0xB8000000地址不是与视频刷新缓冲区相对应的物理地址。was a virus的最后一篇文章也有一些关于这个主题的有趣信息。
不过,您感兴趣的技术仍然适用于16位dos,并在this thread一书中介绍。这本书在第六章有一个很好的章节,解释了这是如何工作的。该部分名为0xb8000000,其中有一个有趣的示例,演示如何使用debug.exe访问视频内存并对其进行修改。我在Win 7 Box的cmd.exe上测试成功。
但是,如果您想操作Linux终端的屏幕,请检查Assembly Language Step-by-step: Programming with DOS and Linux
它是一个函数库,用于管理应用程序在字符单元终端上的显示

08-07 14:37