跳舞玩偶问题:在GCC linux上

Udi*_*pta 5 c terminal gcc virus dos

作为序言,我真的不想要解决我的问题,只需要指导.我不希望你给我代码.这不是家庭作业,它只是我想要解决的一项练习.

我只是想告诉我如何访问VDU并直接在同一屏幕上更改字符.

屏幕分为25行和80列.屏幕上显示的字符存储在称为VDU存储器的特殊存储器中(不要与普通存储器混淆).屏幕上显示的每个字符占用VDU存储器中的两个字节.

这些字节中的第一个包含正在显示的字符的ASCII值,而第二个字节包含显示字符的颜色.例如,屏幕上第0行和第0列上出现的字符的ASCII值存储在位置编号中0xB8000000.

因此,该字符的颜色将出现在位置编号处0xB8000000 + 1.类似地,第0行中字符的ASCII值,第1列将位于其位置0xB8000000 + 2,其颜色位于0xB8000000 + 3.

我的任务:

有了这些知识就可以编写一个程序,该程序在执行时会将屏幕上的每个大写字母转换成小写字母和每个小写字母大写字母.当用户从键盘敲击键时,该过程应该停止.这是一种名为Dancing Dolls的猖獗病毒活动.(对于单色适配器,请使用0xB0000000而不是0xB8000000).

真的,我不知道构建这个代码.我甚至开始坚持.

kar*_*lip 5

你指的是曾经被称为视频刷新缓冲区的东西.重要的是要指出,很重要的跳舞娃娃 是一个病毒DOS.

基本上,您希望视频内存位于0xB8000000程序内存的地址上.但是,现代操作系统(如Linux/Windows/Mac OS X)提供了一种虚拟内存机制,可防止应用程序直接操作设备.因此,0xB8000000应用程序看到的地址不是0xb8000000视频刷新缓冲区对应的物理地址.这个主题的最后一篇文章也有一些关于这个主题的有趣信息.

尽管如此,您感兴趣的技术仍然适用于16位DOS,并在" 汇编语言 "一书中逐步介绍:使用DOS和Linux编程.本书在第6章中有一个很好的部分,它解释了这项工作的准确性.该部分已命名Inspecting the Video Refresh Buffer with DEBUG,并有一个有趣的示例,显示如何使用debug.exe访问视频内存并进行修改.我在Win 7盒子的cmd.exe上成功测试了它.

但是如果你想操纵Linux终端的屏幕,请检查ncurses:

它是一个管理应用程序在字符单元终端上显示的函数库

  • +1回答这个问题.技术问题:我找不到MS-DOS或[debug.exe](http://tech.slashdot.org/story/09/05/08/169226/RIP-MS-DEBUG-1981---2009 )在我的Windows 7上,除了我有一个cmd.exe的快捷方式,我已经设置了MS-DOS图标只是为了好玩...而且,我很确定OP显示为0xB8000000的地址实际上是从在DOS时代所谓的"远指针",因此它意味着B800:0000(段选择器B800,偏移0000),这意味着物理地址十六进制B800*10 + 0000 = B8000.但是,在Windows 7中访问任何这些地址失败. (5认同)