搜索
bottom↓
回复: 11

求助!keil c中idata数据清零的问题

[复制链接]

出0入0汤圆

发表于 2010-10-16 18:23:50 | 显示全部楼层 |阅读模式
程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit led=P2^0;

void main()
{       
        uchar i;
           uchar idata test_a[10]={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怎么也清不了,请大侠们指点指点,谢谢!

(原文件名:idata clear.JPG)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-10-16 22:38:32 | 显示全部楼层
你对内存区还不太了解,当你使用第1组寄存器时,data区的00~07其实就是R0~R7,你的:p++编译后其实就是 inc R0(地址00),
for(i=0;i<128;i++) 其实也是INC R7(地址07)直到80H,其实它是也被清过零,只是你又把它加上去了。

出0入0汤圆

发表于 2010-10-17 15:24:14 | 显示全部楼层
回复【1楼】flywater  落叶
-----------------------------------------------------------------------

没看大明白。R0-R7 在什么时候清零,又是在什么时候加上的???

出0入0汤圆

 楼主| 发表于 2010-10-17 19:34:51 | 显示全部楼层
回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是Idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到R0和R1,可那是data类型的啊,我查看的是idata类型的数据。

出0入0汤圆

发表于 2010-10-17 21:47:41 | 显示全部楼层
uchar idata test_a[10]={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[10]={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++;
}


头几个清不了很正常

出0入0汤圆

发表于 2010-10-17 21:50:03 | 显示全部楼层
回复【3楼】kongjie07 路人甲
回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到r0和r1,可那是data类型的啊,我查看的是idata类型的数据。
-----------------------------------------------------------------------

低128字的data和idata是重叠的

出0入0汤圆

发表于 2010-10-17 23:26:23 | 显示全部楼层
呵呵,挺有意思. 这个程序永远无法结束吧?

i 变量会被反复清0, for 永远出不来.

而idata内存访问一定要用到Ri作为地址指针.

出0入0汤圆

发表于 2010-10-18 00:08:51 | 显示全部楼层
回复【2楼】Little White
-----------------------------------------------------------------------

看一下汇编代码你就清楚了,此时汇编代码用R0和R7用作了你的循环记数器,你清到07时就已把R0和R7清过了,只是你的程序中INC R0和INC R7又把它加到了87和80H

出0入0汤圆

发表于 2010-10-18 00:09:46 | 显示全部楼层
回复【3楼】kongjie07 路人甲
回复【1楼】flywater 落叶
-----------------------------------------------------------------------
我清的是idata类型的数据,跟data类型没什么关系吧?我知道间接寻址内128字节的寄存器是要用到r0和r1,可那是data类型的啊,我查看的是idata类型的数据。
-----------------------------------------------------------------------

建议好好看看教科书!

出0入0汤圆

 楼主| 发表于 2010-10-18 09:35:52 | 显示全部楼层
找到原因了,虽然我把数组定义成idata类型的,把指针也定义成指向idata类型的,但是由于data类型的RAM基本没用到,所以KEIL C直接把数组存到data类型的RAM里去了,指针指到哪去了,我也不明白了,大侠们帮忙啊。还有就是在低128字节的RAM有剩余是,如何直接吧数据存储到高128字节的RAM区?


(原文件名:编译结果.JPG)


(原文件名:data 0.JPG)

出0入0汤圆

 楼主| 发表于 2010-10-26 18:46:28 | 显示全部楼层
回复【8楼】flywater 落叶
-----------------------------------------------------------------------

回复【9楼】kongjie07 路人甲
-----------------------------------------------------------------------

我一直以为idata存储类型的数据只包含片内高128字节的RAM,现在懂了,对8052来说它包括256字节的片内RAM,清空它可以用STARTUP.A51,把idatalen改成100H,xdatalen也改成100H(我用的是stc89c52rc)就行了。

出0入0汤圆

发表于 2014-7-15 18:00:43 | 显示全部楼层
    idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。idATa是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表