在 C 中,如何写入特定的内存位置,例如视频内存 b800,在 DOS 中(真正的 DOS,MS DOS 6.22)
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)
我知道 C 没有内置任何东西可以做到这一点,但可能有一些特定于平台的东西,例如DOS 特定的 API 函数可以。
一个能做到这一点的小演示程序会很棒。
我有 Turbo C(TCC.EXE - 不是微型 c 编译器,Turbo C 编译器)
我知道调试可以做到这一点(例如,我知道的一些微小的调试)-f b800:0 FA0 21 CE
(将一些感叹号写入命令行)。但我想要一个 C 程序写入 b800:0
地址b800:0000
使用了0xb800
的段和0x0000
的偏移量。这对应于线性地址 0xb8000
(注意额外的 0
,因为该段向左移动了 4 位)。
要在 protected mode 中创建指向此地址的指针,您需要使用
char *p = (char *)0xb8000;
但是,您最有可能在 real mode, so you need to construct a far pointer:
char far *p = (char far *)0xb8000000;
32 位值被分成两个 16 位值,分配给段和偏移量。
你可以正常使用这个指针,那么:
*p = '!';
你能试试这个吗(没有测试,因为我没有我的旧电脑)
char far* video = 0xb8000000L;
*(video++) = '!';
*(video++) = 0x0A;
只需创建一个指向基地址的指针,然后像访问数组一样访问内存。回想一下,在文本模式下,屏幕上显示的每个字符都有两个字节。第一,拥有角色本身。第二个持有属性。高 4 位是背景属性,低 4 位是前景。在前景属性中设置最高位使其成为高强度颜色,而在背景属性中设置高位会使前景闪烁。这意味着背景有 8 种颜色可用,前景有 16 种颜色可用,最后还可以使文本闪烁。
例如模式 0x13 的东西:
char far *graphScreen = (char far*) 0xA0000000;
对于文本模式的东西,
char far *textScreen = (char far*) 0xB8000000;
写入屏幕内存非常简单
textScreen[ someIndex ] = someChar;
textScreen[ someIndex+1 ] = someAttrib;
在 C 中,如何写入特定的内存位置,例如视频内存 b800,在 DOS 中(真正的 DOS,MS DOS 6.22)
我知道 C 没有内置任何东西可以做到这一点,但可能有一些特定于平台的东西,例如DOS 特定的 API 函数可以。
一个能做到这一点的小演示程序会很棒。
我有 Turbo C(TCC.EXE - 不是微型 c 编译器,Turbo C 编译器)
我知道调试可以做到这一点(例如,我知道的一些微小的调试)-f b800:0 FA0 21 CE
(将一些感叹号写入命令行)。但我想要一个 C 程序写入 b800:0
地址b800:0000
使用了0xb800
的段和0x0000
的偏移量。这对应于线性地址 0xb8000
(注意额外的 0
,因为该段向左移动了 4 位)。
要在 protected mode 中创建指向此地址的指针,您需要使用
char *p = (char *)0xb8000;
但是,您最有可能在 real mode, so you need to construct a far pointer:
char far *p = (char far *)0xb8000000;
32 位值被分成两个 16 位值,分配给段和偏移量。
你可以正常使用这个指针,那么:
*p = '!';
你能试试这个吗(没有测试,因为我没有我的旧电脑)
char far* video = 0xb8000000L;
*(video++) = '!';
*(video++) = 0x0A;
只需创建一个指向基地址的指针,然后像访问数组一样访问内存。回想一下,在文本模式下,屏幕上显示的每个字符都有两个字节。第一,拥有角色本身。第二个持有属性。高 4 位是背景属性,低 4 位是前景。在前景属性中设置最高位使其成为高强度颜色,而在背景属性中设置高位会使前景闪烁。这意味着背景有 8 种颜色可用,前景有 16 种颜色可用,最后还可以使文本闪烁。
例如模式 0x13 的东西:
char far *graphScreen = (char far*) 0xA0000000;
对于文本模式的东西,
char far *textScreen = (char far*) 0xB8000000;
写入屏幕内存非常简单
textScreen[ someIndex ] = someChar;
textScreen[ someIndex+1 ] = someAttrib;