Q如何访问位于特定地址的内存(内存映射设备或图形内存)?
如何在 C 中进行 PEEK 和 POKE?
A将适当类型的指针设置为正确的数值(使用显式转换,以确保编译器知道您确实要进行此非可移植的转换)。
unsigned int *magicloc = (unsigned int *)0x12345678;然后,*magicloc就指向您想要的地址。[脚注] 如果该地址是内存映射 I/O 寄存器,您可能还需要使用volatile限定符:``volatile unsigned int *magicloc''. (如果您想访问特定地址的字节而不是字,请使用unsigned char *.)
在 MS-DOS 中,您可能会发现像MK_FP()这样的宏对于处理段和偏移量非常有用。正如 Gary Blaine 所建议的,您还可以声明复杂的数组指针,允许您使用数组表示法访问屏幕内存。例如,在 MS-DOS 机器的 80x25 文本模式下,给定声明
unsigned short (far * videomem)[80] = (unsigned short (far *)[80])0xb8000000;您可以访问行i,列j处的字符和属性字节,使用videomem[i][j].
许多操作系统在保护模式下执行用户模式程序,在这种模式下,直接访问 I/O 设备(或运行进程之外的*任何*地址)是根本不可能的。在这种情况下,您必须请求操作系统为您执行 I/O 操作。
参考文献:K&R1 第 A14.4 节,第 210 页
K&R2 第 A6.6 节,第 199 页
ISO 第 6.3.4 节
Rationale 第 3.3.4 节
H&S Sec. 6.2.7 pp. 171-2