我不明白如何将一个变量分配给一个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语言实现具有典型的属性,如八位的 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
它补充说 0x20
到 B
.B
被分配的值 0x40
, 0x60
, 0x80
, 0xa0
, 0xc0
和 0xe0
. 然后下一个加法将产生 0x100
. 0x100
超过了8位的 char
B
,它将包裹,把 0x00
在 B
.B
设置为 0x00
జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ while(B)
循环将结束。0x40
,然后到 0x60
以此类推,直到它设置 B
到 0x00
).A
递增一。由于 A
从0开始,递增7次,其最终值为7。注: C++;
语句改变了 C
,改变其指向的位置。一般来说,这将会影响到语句中增加的价值。B=B+ *C;
. 然而,由于该区域的每个字节都被填充了相同的值,所以没有影响。*C
始终是 0x20
在这种情况下。如果内存的字节有不同的值,那么改变 C
与 C++;
将改变对 *C
.
如果你想访问物理地址为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);
}
在低级硬件和嵌入式编程中,访问特定地址是非常常见的(事实上,没有其他方式可以访问映射到地址空间的硬件寄存器)。