求助!keil c中idata数据清零的问题
程序如下:#include<reg52.h>
#define uchar unsigned char
#define uintunsigned int
sbit led=P2^0;
void main()
{
uchar i;
uchar idata test_a={1,2,3,4,5,6,7,8,9,0};
uchar idata * data p=0;
for(i=0;i<128;i++)
{
*p=0;
p++;
}
led=0;
}
发现0x00和0x07怎么也清不了,请大侠们指点指点,谢谢!
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590318R4FQWJ.JPG
(原文件名:idata clear.JPG) 你对内存区还不太了解,当你使用第1组寄存器时,data区的00~07其实就是R0~R7,你的:p++编译后其实就是 inc R0(地址00),
for(i=0;i<128;i++) 其实也是INC R7(地址07)直到80H,其实它是也被清过零,只是你又把它加上去了。 回复【1楼】flywater落叶
-----------------------------------------------------------------------
没看大明白。R0-R7 在什么时候清零,又是在什么时候加上的??? 回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是Idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到R0和R1,可那是data类型的啊,我查看的是idata类型的数据。 uchar idata test_a={1,2,3,4,5,6,7,8,9,0};
uchar idata * data p=0;
for(i=0;i<128;i++)
{
*p=0;
p++;
}
修改:
uchar idata test_a={1,2,3,4,5,6,7,8,9,0};
unsigned char idata * p = 0;//uchar idata * data p=0;
for(i=0;i<128;i++)
{
*p=0;
p++;
}
头几个清不了很正常 回复【3楼】kongjie07 路人甲
回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到r0和r1,可那是data类型的啊,我查看的是idata类型的数据。
-----------------------------------------------------------------------
低128字的data和idata是重叠的 呵呵,挺有意思. 这个程序永远无法结束吧?
i 变量会被反复清0, for 永远出不来.
而idata内存访问一定要用到Ri作为地址指针. 回复【2楼】Little White
-----------------------------------------------------------------------
看一下汇编代码你就清楚了,此时汇编代码用R0和R7用作了你的循环记数器,你清到07时就已把R0和R7清过了,只是你的程序中INC R0和INC R7又把它加到了87和80H 回复【3楼】kongjie07 路人甲
回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到r0和r1,可那是data类型的啊,我查看的是idata类型的数据。
-----------------------------------------------------------------------
建议好好看看教科书! 找到原因了,虽然我把数组定义成idata类型的,把指针也定义成指向idata类型的,但是由于data类型的RAM基本没用到,所以KEIL C直接把数组存到data类型的RAM里去了,指针指到哪去了,我也不明白了,大侠们帮忙啊。还有就是在低128字节的RAM有剩余是,如何直接吧数据存储到高128字节的RAM区?
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590696HZ2SXW.JPG
(原文件名:编译结果.JPG)
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_590697ANGGEJ.JPG
(原文件名:data 0.JPG) 回复【8楼】flywater 落叶
-----------------------------------------------------------------------
回复【9楼】kongjie07 路人甲
-----------------------------------------------------------------------
我一直以为idata存储类型的数据只包含片内高128字节的RAM,现在懂了,对8052来说它包括256字节的片内RAM,清空它可以用STARTUP.A51,把idatalen改成100H,xdatalen也改成100H(我用的是stc89c52rc)就行了。 idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。idATa是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)
页:
[1]