prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 19.25

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 操作。

另请参阅问题 4.145.19

参考文献: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


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管