【问题标题】:How to write a data in particular address in C [duplicate]如何在C中写入特定地址的数据[重复]
【发布时间】:2013-10-02 09:35:53
【问题描述】:

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

【问题讨论】:

  • 该地址可能对写入无效。如果您使用的是 POSIX 操作系统,您可以强制它存在,例如使用 mmap and MAP_FIXED
  • @BoBTFish 也许他正在为微控制器编程。
  • 你需要这个做什么?为什么?用什么?

标签: c++ c


【解决方案1】:

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

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

如果省略volatile

,优化编译器可能会遇到很多问题

【讨论】:

    【解决方案2】:

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

    int *nb = (int *) 0x8000000;
    *nb = 0x00001234;
    

    【讨论】:

    • 这也取决于您的链接器脚本(您可以省略一些 RAM 库并手动使用它们),但不建议这样做。
    【解决方案3】:

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

    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 编程课程的课堂作业。可能符合你的场景。

    This 解释也可能会有所帮助

    【讨论】:

    • 这不是初学者作业..:)
    • 同意,不是在编程课程开始时给出的非常“初学者”。但它肯定不具备现实世界的需求,即使在当时也是如此。但是,它有助于理解内存、指针以及能够自己编写函数。因此,它更多的是学术用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多