将变量分配给特定的内存位置
Assigning a variable to a specific memory location
我不明白如何将变量分配给Ram 位置,更具体地说,我想通过自己编写来查看以下问题的结果,但我不知道如何去做。
我不想要我写的所有问题的答案,如果我不能自己写这段代码,你可以纠正我。并告诉我需要做哪种计算来帮助我。
地址在 0X50 和 0x80 之间的 RAM 由值 0x20 填充。我想确定右侧 'C program' 段末尾的 A 的值。最后,我想确定A.
int main(){
char *C,A=0,B=0x20
C=0x55;
while(B){
B=B+ *C;
C++;
A++;
}
在普通的通用计算机中,您不能为对象分配地址。地址由其他软件为您管理,尝试为对象设置自己的地址可能会干扰该内存的其他用途,如果内存未映射到您的地址 space 中,可能会导致陷阱过程,并可能产生其他不良后果。
假设此代码是针对课堂学习中的假设计算机,并且计算机和 C 实现具有典型属性,例如八位 char
(并且 char
是无符号的) , 那么:
char *C,A=0,B=0x20
将 C
定义为指向 char
的指针。 (这一行应该有一个分号来标记它的结束。)
C=0x55
尝试将 C
设置为指向地址 0x55
。这不是正确的方法,因为 C
是一个指针,意味着它的值是地址,而 0x55
是一个普通整数,而不是地址。编译器应该对这条语句发出警告。执行此操作的正确方法是使用强制转换将整数转换为指针:C = (char *) 0x55;
.
- 此后,只要
B
非零,以 while(B)
开始的循环就会执行。在循环内部,B=B+ *C;
将内存 C
指向的内容添加到 B
。由于您告诉我们该区域的内存已填满 0x20
,因此它会将 0x20
添加到 B
。
- 如果我们假设计算机和 C 实现具有典型属性,这将继续为
B
分配值 0x40
、0x60
、0x80
、0xa0
、0xc0
和 0xe0
。那么下一次加法会产生0x100
。 0x100
超过 char
B
中的八位,它会换行,将 0x00
放在 B
. 中
B
设置为0x00
后,while(B)
循环结束
- 所以循环会执行7次(一次将B设为
0x40
,然后设为0x60
,以此类推,直到将B
设为0x00
).
- 在每次迭代中,
A
递增 1。由于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);
}
访问特定地址在低级硬件和嵌入式编程中非常常见(事实上,没有其他方法可以访问映射到地址 space 的硬件寄存器)。
我不明白如何将变量分配给Ram 位置,更具体地说,我想通过自己编写来查看以下问题的结果,但我不知道如何去做。 我不想要我写的所有问题的答案,如果我不能自己写这段代码,你可以纠正我。并告诉我需要做哪种计算来帮助我。
地址在 0X50 和 0x80 之间的 RAM 由值 0x20 填充。我想确定右侧 'C program' 段末尾的 A 的值。最后,我想确定A.
int main(){
char *C,A=0,B=0x20
C=0x55;
while(B){
B=B+ *C;
C++;
A++;
}
在普通的通用计算机中,您不能为对象分配地址。地址由其他软件为您管理,尝试为对象设置自己的地址可能会干扰该内存的其他用途,如果内存未映射到您的地址 space 中,可能会导致陷阱过程,并可能产生其他不良后果。
假设此代码是针对课堂学习中的假设计算机,并且计算机和 C 实现具有典型属性,例如八位 char
(并且 char
是无符号的) , 那么:
char *C,A=0,B=0x20
将C
定义为指向char
的指针。 (这一行应该有一个分号来标记它的结束。)C=0x55
尝试将C
设置为指向地址0x55
。这不是正确的方法,因为C
是一个指针,意味着它的值是地址,而0x55
是一个普通整数,而不是地址。编译器应该对这条语句发出警告。执行此操作的正确方法是使用强制转换将整数转换为指针:C = (char *) 0x55;
.- 此后,只要
B
非零,以while(B)
开始的循环就会执行。在循环内部,B=B+ *C;
将内存C
指向的内容添加到B
。由于您告诉我们该区域的内存已填满0x20
,因此它会将0x20
添加到B
。 - 如果我们假设计算机和 C 实现具有典型属性,这将继续为
B
分配值0x40
、0x60
、0x80
、0xa0
、0xc0
和0xe0
。那么下一次加法会产生0x100
。0x100
超过char
B
中的八位,它会换行,将0x00
放在B
. 中
B
设置为0x00
后,while(B)
循环结束- 所以循环会执行7次(一次将B设为
0x40
,然后设为0x60
,以此类推,直到将B
设为0x00
). - 在每次迭代中,
A
递增 1。由于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);
}
访问特定地址在低级硬件和嵌入式编程中非常常见(事实上,没有其他方法可以访问映射到地址 space 的硬件寄存器)。