【问题标题】:Assigning a variable to a specific memory location [closed]将变量分配给特定的内存位置[关闭]
【发布时间】:2020-06-07 11:16:53
【问题描述】:

我不明白如何将变量分配给 Ram 位置,更具体地说,我想通过自己编写来查看以下问题的结果,但无论如何我都不知道该怎么做。 我不想要我写的所有问题的答案,以便如果我不能自己编写这段代码,你可以纠正我。并帮我说一下我需要做的那种计算。

地址在 0X50 和 0x80 之间的 RAM 由值 0x20 填充。我想确定右侧“C 程序”段末尾的 A 值。最后,我想确定A。

int main(){
char *C,A=0,B=0x20
C=0x55;
while(B){
B=B+ *C;
C++;
A++;
}

【问题讨论】:

  • 问题是你需要阅读你自己的问题并以可以理解的形式重写它。我不知道你在问什么。代码也没有任何意义

标签: c ram memory-address


【解决方案1】:

在普通的通用计算机中,您不能为对象分配地址。地址由其他软件为您管理,尝试为对象设置您自己的地址可能会干扰该内存的其他用途,如果内存未映射到您的进程的地址空间中,可能会导致陷阱,并且可能有其他不良后果。

假设这段代码用于课堂学习中的假设计算机,并且计算机和 C 实现具有典型属性,例如八位 char(并且 char 是无符号的),那么:

  • char *C,A=0,B=0x20C 定义为指向 char 的指针。 (这一行应该有一个分号来标记它的结束。)
  • C=0x55 尝试将 C 设置为指向地址 0x55。这不是正确的方法,因为C 是一个指针,这意味着它的值是地址,而0x55 是一个普通整数,而不是地址。编译器应该警告这个语句。正确的方法是使用强制转换将整数转换为指针:C = (char *) 0x55;
  • 此后,只要B 不为零,以while(B) 开头的循环就会执行。在循环内部,B=B+ *C; 将内存中的内容C 指向B。既然你告诉我们那个区域的内存被0x20填满了,它就会将0x20添加到B
  • 如果我们假设计算机和 C 实现具有典型属性,则将继续为 B 分配值 0x400x600x800xa00xc0 和 @987654346 @。然后下一个添加将产生0x1000x100 超过了char B 中的八位,它将换行,将0x00 放入B
  • B 设置为0x00 后,while(B) 循环将结束。
  • 因此循环将执行 7 次(一次将 B 设置为 0x40,然后设置为 0x60,依此类推,直到将 B 设置为 0x00)。
  • 在每次迭代中,A 都加一。由于A 从 0 开始并递增 7 次,因此其最终值为 7。

注意:C++; 语句改变了C 的值,改变了它指向的位置。通常,这会影响语句B=B+ *C; 中添加的值。但是,由于该区域中的每个字节都填充了相同的值,因此没有效果;在这种情况下,*C 始终是 0x20。如果内存的字节具有不同的值,那么将C 更改为C++; 将更改为*C 获得的值。

【讨论】:

    【解决方案2】:

    如果你想访问物理地址为 X 的数据,你需要

    #define MEM(addr, type)  *(volatile  type *)(addr)
    
    
    void foo(void)
    {
        //write  unsigned int at address 0x1234
        MEM(0x1234, unsigned) = 0x12345689;
    
        //read char from address 0x4000
        char p = MEM(0x4000, char);
    }
    

    访问特定地址在低级硬件和嵌入式编程中非常常见(事实上没有其他方法可以访问映射到地址空间的硬件寄存器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多