打印

因特殊情况需要,想编写一段不需要变量的数据拷贝程序

[复制链接]
1876|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dydnts|  楼主 | 2007-5-21 22:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因特殊情况需要,想编写一段不需要变量的数据拷贝程序,想了半天没想出来,
正常情况下该程序类似这个:
    for(i=0;i<30;i++)
    {
        dest_data=source_data;    
    }

如果此段程序不允许加变量i(特殊情况下),请大侠帮忙写一段,C语言和汇编语言的都行(好象看起来C语言是不行了吧,汇编指令用51的就行了)
谢谢!!












谢谢大家,一时着急没说太清楚, 

情况是这样的,此段程序不需要目的地址和源地址之外的变量(防止占用堆栈,比如i),但是又必须要有个控制循环拷贝次数的变量(比如i),

我一开始肯定是用平常人的办法,最笨但也最实用,但是问题是以后可能会扩展到100,200,写几百行太占ROM空间了肯定不行的,

computer00的办法似乎可行,但似乎还要用个指针变量(来指向数组),因此也是不满足要求的,

看到一个PIC的代码,似乎非常简洁,不知到51汇编或C语言能不能满足这个要求,谢谢大家了:



附PIC代码:
repeat #29
mov    [W0++],[W1++]

dsPIC30汇编,总共移动30个字,W0指向源地址,W1指向目的地址,必须是字对齐,要想移
动30个字节,改为:
repeat #29
mov.b  [W0++],[W1++] 
 

相关帖子

来自 2楼
dengm| | 2007-5-22 06:04 | 只看该作者

re:

for(dest_data[0]=1;dest_data[0]<30;dest_data[0]++)
    {
        dest_data[dest_data][0]]=source_data[dest_data][0]];    
    }
    dest_data[0]=source_data[0];

使用特权

评论回复
板凳
平常人| | 2007-5-21 22:10 | 只看该作者

这也太容易了

dest_data[0]=source_data[0];
dest_data[1]=source_data[1];
dest_data[2]=source_data[2];
....
....
dest_data[29]=source_data[29];

共30行! 哈哈哈。。。

使用特权

评论回复
地板
computer00| | 2007-5-21 23:04 | 只看该作者

dest_data和source_data是局部变量吧?

*(dest_data++)=*(source_data++);

使用特权

评论回复
5
pandafeng| | 2007-5-22 02:52 | 只看该作者

用DMA肯定行~~

使用特权

评论回复
6
xwj| | 2007-5-22 07:22 | 只看该作者

为什么要求“不需要变量”?你的“变量”只得是什么包括

用到指针肯定就会用到A、Rx或DPTR或堆栈等
就算DMA也要控制DMA寄存器

严格来说说这些都是变量!

估计是你的理解有误或描述不当,
不管什么程序,只要提前把自己会破坏的数据保存,执行完恢复就可以没任何影响的插入任意位置的

使用特权

评论回复
7
dydnts|  楼主 | 2007-5-22 16:29 | 只看该作者

谢谢大家,一时着急没说太清楚,

情况是这样的,此段程序不需要目的地址和源地址之外的变量(防止占用堆栈,比如i),但是又必须要有个控制循环拷贝次数的变量(比如i),

我一开始肯定是用平常人的办法,最笨但也最实用,但是问题是以后可能会扩展到100,200,写几百行太占ROM空间了肯定不行的,

computer00的办法似乎可行,但似乎还要用个指针变量(来指向数组),因此也是不满足要求的,

看到一个PIC的代码,似乎非常简洁,不知到51汇编或C语言能不能满足这个要求,谢谢大家了:



附PIC代码:
repeat #29
mov    [W0++],[W1++]

dsPIC30汇编,总共移动30个字,W0指向源地址,W1指向目的地址,必须是字对齐,要想移
动30个字节,改为:
repeat #29
mov.b  [W0++],[W1++]

使用特权

评论回复
8
high| | 2007-5-22 22:55 | 只看该作者

5楼已经给出答案了

我也是想了半天不明白为什么不能用堆栈。
    memcpy(dst, src, 30);

使用特权

评论回复
9
computer00| | 2007-5-22 23:20 | 只看该作者

局部变量并不一定就会占用堆栈空间

也许会分配到寄存器中,有时这样反而让你的程序运行速度更快.

使用特权

评论回复
10
平常人| | 2007-5-23 08:07 | 只看该作者

哈哈,又是局部变量的分配问题;谁说局部变量占用堆栈空

00说的没错,对于51、ARM这种寄存器组的CPU,编译器可以把局部变量分配到寄存器中。

另外,分配局部变量有很多种方法,看看我在另一个帖子《C语言变量的分配与赋值问题》的二楼和六楼的解释。

使用特权

评论回复
11
古道热肠| | 2007-5-23 10:15 | 只看该作者

5楼会节省过日子

  5楼的做法,在某些迫不得已的情况下会有效,
  以前遇到过一次,单片机没外扩XData,程序架构大了,加1个变量(既使是局部变量)就编译报告内存溢出,程序中全是这种方式循环,代码效率和代码量都打折扣了。

使用特权

评论回复
12
prcxf| | 2007-5-23 10:16 | 只看该作者

用双dptr的单片机的话很容易

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

42

帖子

0

粉丝