6

我需要在地址 0x8000000 中写入 0x00001234,在 C 中可以吗?

4

3 回答 3

17

如果您在嵌入式系统中使用硬件寄存器,那么标准方法是:

int volatile * const p_reg = (int *) 0x8000000;
*p_reg = 0x1234;

如果省略volatile ,优化编译器可能会遇到很多问题

于 2013-10-02T09:50:39.813 回答
8

你可以,但是你会有 99.9999..9% 的时间段错误,因为你的程序将无法访问这个内存地址。

int *nb = (int *) 0x8000000;
*nb = 0x00001234;
于 2013-10-02T09:37:24.533 回答
0

好吧,如果这是 ac 类的初学者作业,我怀疑它是 turbo 或 borland c,您在 16 位环境中使用段偏移地址方案进行编程。在这种情况下,使用int * far ptr,将使用far指针类型来访问当前段之外的地址。0xb8000000 曾经是文本模式显存的起始地址。

IE

int far * p = 0xB8000000;
*p = 'A'; // This would actually print char 'A' on screen
*(p+1) = <some number>; // this would determine the color of char A

请注意,这曾经是 16 位编程。因此,正常的 int * 将是 16 位,因此无法访问超出当前内存段的内容。

我们曾经通过直接写入视频内存来实现自己的 printf。这是十多年前 c 编程课程的课堂作业。可能与您的情况相符。

这个解释也可能有帮助

于 2013-10-02T10:03:14.750 回答