调试环境keil 2,
目的:想查看一下int型变量在内存中的存储方式,以便于将整个数组用指针的形式存入eeprom中。
结果与想象的有吻合的地方,也有无语的地方,无奈只好求助大神解惑。
下面是我在keil中写的三段代码,就是用 char型的指针p 读取int型变量a,赋值给变量b,预期是b先等于a的高8位,在等于a的低8位。注释是我调试时分步执行记录下的调试数据和疑问。未拷入单片机试验,仅仅在keil中调试。
//======目的:试验int型变量在内存中的存储方式====
//char b 为局部变量
int a=0x1234;
main()
{
char *p;
char b;
p=&a; //p=0x0b, *p=0x12
b=*p; //b=0x00,(为什么会是0,而不是0x12)
p++; //p=0x0c
b=*p; //b=0x34
while(1);
}
//======目的:试验int型变量在内存中的存储方式====
// char b 为全局变量
int a=0x1234;
char b;
main()
{
char *p;
p=&a; //p=0x08, *p=0x12
b=*p; //b=0x12(这里感觉正常了)
p++; //p=0x09
b=*p; //b=0x34
while(1);
}
//======目的:试验int型变量在内存中的存储方式====
int a=0x1234;
main()
{
char *p;
char b=0; //此时c=0x01
char c=0; //c=0x01 (为什么还是01)
p=&a; //p=0x0b, *p=0x12
b=*p; //b=0x00,
b=*p; //b=0x00;
c=*p; //c=0x12 (为何c被赋值了,而b没有)
p++; //p=0x0c
b=*p; //b=0x34
while(1);
}
------解决思路----------------------
关优化。
int a = 0x1234;
#pragma optimize(0)
main()
{
char *p;
char b;
p = &a; //p=0x0b, *p=0x12
b = *p; //b=0x00,(为什么会是0,而不是0x12)
p++; //p=0x0c
b = *p; //b=0x34
while(1);
}
------解决思路----------------------
被优化掉了,keilc会尽可能高效的利用寄存器A
int ax=0x1234;
main()
{
char *p;
char bx=0; //此时c=0x01
char cx=5; //c=0x01 (为什么还是01)
char m,n;
p=(char*)&ax; //p=0x0b, *p=0x12
m=cx+5;//让cx有作用
bx=*p; //b=0x12,
m=m+6; 隔离开,不让其直接使用A
n=bx+5;
bx=*p; //b=0x00;
cx=*p; //c=0x12 (为何c被赋值了,而b没有)
p++; //p=0x0c
bx=*p; //b=0x34
while(1);
}
------解决思路----------------------
用仿真器调试看当前行赋值结果应该在下一行打断点。另外注意关优化也可以使用volatile关键字修饰变量。