将一个变量赋值到特定的内存位置[关闭]。

问题描述 投票:-3回答:1

我不明白如何将一个变量分配给一个Ram的地方,更具体地说,我想通过自己写的方式看到下面问题的结果,但我不知道怎么做.我不想要问题的答案,我写了所有的问题,如果我不能自己写这个代码,你可以纠正我。并帮我说一下我需要做哪种计算。

RAM的地址在0X50和0x80之间,由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个回答
1
投票

在普通通用计算机中,你不能为对象分配地址。地址是由其他软件为你管理的,如果试图为对象设置自己的地址,可能会干扰其他对该内存的使用,如果该内存没有映射到你的进程的地址空间中,可能会导致陷阱,也可能造成其他不良后果。

假设这段代码是为课堂学习中的一台假想计算机编写的,而且计算机和C语言实现具有典型的属性,如八位的 char (而且 char 是无符号的),那么。

  • char *C,A=0,B=0x20 定义 C 的指针。char. (这一行应该有一个分号来标记它的结束。)
  • C=0x55 试图设置 C 指向地址 0x55. 这不是正确的方法,因为 C 是一个指针,意味着它的值是地址,而 0x55 是一个普通的整数,而不是一个地址。编译器应该对这句话发出警告。正确的方法是使用转码将整数转换成指针。C = (char *) 0x55;.
  • 之后,从 while(B) 就会执行,只要 B 为非零。循环内。B=B+ *C; 添加内存的内容 C 指向 B. 既然你告诉我们那片区域的记忆充满了。0x20它补充说 0x20B.
  • 如果我们假设计算机和C实现具有典型的属性,这将继续与 B 被分配的值 0x40, 0x60, 0x80, 0xa0, 0xc00xe0. 然后下一个加法将产生 0x100. 0x100 超过了8位的 char B,它将包裹,把 0x00B.
  • B 设置为 0x00జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ while(B) 循环将结束。
  • 所以循环将执行7次(一次将B设置为 0x40,然后到 0x60以此类推,直到它设置 B0x00).
  • 在每次迭代中。A 递增一。由于 A 从0开始,递增7次,其最终值为7。

注: C++; 语句改变了 C,改变其指向的位置。一般来说,这将会影响到语句中增加的价值。B=B+ *C;. 然而,由于该区域的每个字节都被填充了相同的值,所以没有影响。*C 始终是 0x20 在这种情况下。如果内存的字节有不同的值,那么改变 CC++; 将改变对 *C.


0
投票

如果你想访问物理地址为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);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.