【问题标题】:In C, how do I write to a particular memory location e.g. video memory b800, in DOS (real DOS, MS DOS 6.22)在 C 中,我如何写入特定的内存位置,例如显存 b800,在 DOS 中(真实 DOS,MS DOS 6.22)
【发布时间】:2015-10-06 14:04:54
【问题描述】:

在 C 中,我如何写入特定的内存位置,例如显存 b800, DOS (real DOS, MS DOS 6.22)

我知道 C 没有内置任何东西可以做到这一点,但可能有一些特定于平台的内容,例如DOS 特定的 API 函数可以。

一个小的演示程序会很棒。

我有 Turbo C(TCC.EXE - 不是 tiny c 编译器,Turbo C 编译器)

我知道 debug 可以做到(例如,我知道的一些小调试)-f b800:0 FA0 21 CE(将一些感叹号写入命令行)。但我想要一个 C 程序写入 b800:0

【问题讨论】:

  • 投票结束的人能否说明原因?
  • @dawg DOS 表示分段
  • 2015 年写信给B800:0000h 真是太酷了!
  • 我认为 DOS 应用程序的文本界面比当今的许多 GUI 应用程序更有用。一切都是“键盘优化”的,一切都精确地位于精确的字符位置,在任何显示器上看起来都一样。然而,使用 16 位段的大内存对象是地狱 :)
  • @Stas 更酷看看这个家伙在 2015 年对 qbasic 做了什么:youtube.com/watch?v=HQYsFshbkYw

标签: c dos turbo-c


【解决方案1】:

地址b800:0000 使用0xb800 的段和0x0000 的偏移量。这对应于线性地址0xb8000(注意额外的0,因为该段左移了4位)。

要在protected mode 中创建指向此地址的指针,您可以使用

char *p = (char *)0xb8000;

但是,你最有可能在real mode,所以你需要构造一个far pointer

char far *p = (char far *)0xb8000000;

32 位值被分成两个 16 位值,分别分配给段和偏移量。

你可以正常使用这个指针,那么:

*p = '!';

【讨论】:

  • 为了确定真正看到的东西,最好设置字符属性。
  • @fjardon 是对的。您可能想要为“使用颜色写入字符串”函数添加一个示例。 OP 可能不知道字符和属性数据的交错。
  • 我确信我在 Windows 7 命令提示符下工作过。 codeblocks IDE 启动一个命令控制台来运行程序。但是现在我尝试了一下,我得到了这些错误i.imgur.com/7jtfbca.png gcc 给出了同样的错误。 pastebin.com/raw.php?i=AtscYUJW 当然win7 32bit 有debug.exe 让你` -f b800:0 FA0 21 CE` 所以我不明白为什么它不能在Win7 中编译?我确定是的
  • 如果它是不应该在 Windows 中使用的远.. 我试过这条线 char *p = (char *)0xb8000; *p='!'; 但 EXE 崩溃了
  • 不,仿真是必需的,因为 Windows 不会让您的程序直接访问硬件。如果在 Windows 上可以写入字符缓冲区,那是因为仿真层捕获了访问并解释了您的意图,然后使用加速图形驱动程序将字符渲染到屏幕外位图,然后在屏幕上复制下一次垂直刷新。如果你真的想直接访问硬件,你需要启动 DOS。
【解决方案2】:

你能试试这个吗(未经测试,因为我没有旧电脑)

char far* video = 0xb8000000L;
*(video++) = '!';
*(video++) = 0x0A;

【讨论】:

    【解决方案3】:

    只需创建一个指向基地址的指针,然后像访问数组一样访问内存。回想一下,在文本模式下,屏幕上显示的每个字符都有两个字节。第一个,持有角色本身。第二个持有属性。高 4 位是背景属性,低 4 位是前景。在前景属性中设置最高位使其成为高强度颜色,而在背景属性中设置高位使前景闪烁。这意味着有 8 种颜色可用于背景,16 种颜色可用于前景,最后可以使文本闪烁。

    例如模式 0x13 的东西: char far *graphScreen = (char far*) 0xA0000000;

    对于文本模式的东西, char far *textScreen = (char far*) 0xB8000000;

    然后写入屏幕内存就像 textScreen[ someIndex ] = someChar; textScreen[ someIndex+1 ] = someAttrib;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多