请问:for(i=0;i<8;i++)和for(i=8;i>0;i--)有区别吗?

[复制链接]
11642|41
 楼主| thanksgiving 发表于 2009-7-27 11:35 | 显示全部楼层 |阅读模式
FOR, TE, AC, IO
在DS1302程序中(如下),不明白for(i=0;i<8;i++)和for(i=8;i>0;i--)有什么不同?为什么前者就是不行!!!这个问题让我搞了一天,程序基本上都一句一句地跟别人的校对了,连变量名后来都改了,就差没整个拷贝过了。。。。后来发现别人的程序这句话也不能改,一改就错。。。而且网上的DS1302程序大都是用后者。。。有谁能告诉我为什么?郁闷的要死,泪奔。。。


/**********1302:写1字节(上升沿有效)***********/
void wr_byte1302(uchar byte)
{
    uchar i;
    ACC=byte;
//    for(i=0;i<8;i++)//为什么不可以???????
    for(i=8;i>0;i--)
    {
        ds1302io=acc0;
        ds1302sclk=0;
        ds1302sclk=1;
        ACC>>=1;
    }
}
scan 发表于 2009-7-27 11:51 | 显示全部楼层

帮你顶上去

看不出什么不同来。
是不是跟你用了ACC有关
qjy_dali 发表于 2009-7-27 11:52 | 显示全部楼层

看一下生成的汇编代码不就搞定了

  还有,在C51编程中,我最“痛恨”写C风格的人用ACC之类的东东,这不明摆着和编译器过不去吗?!累加器和寄存器这类资源是C编译器的“饭碗”,你居然跟它抢?!

  我猜测问题很可能就是因为滥用ACC。
qjy_dali 发表于 2009-7-27 11:54 | 显示全部楼层

2楼发言真快,居然跑到我前面去了,呵呵

微风 发表于 2009-7-27 12:00 | 显示全部楼层

注意标点符号

xwj 发表于 2009-7-27 12:43 | 显示全部楼层

有影响,后者在KeilC51下能编译出DJNZ指令

3楼说得好,确实不应该跟ACC抢饭碗
其实,只要临时声明个bdata变量,Keil就会自动采用最聪明的方法优化成ACC相关指令,而用户根本就不用关心这些。
huangqi412 发表于 2009-7-27 12:56 | 显示全部楼层

晕,不要去乱用那些紧缺资源...

大漠孤烟 发表于 2009-7-27 12:57 | 显示全部楼层

如果真正理解了该芯片的动作时序,

你完全能够以你的思路用C描述出来,可能别人的程序较简洁高效,可狠多时候理解不了别人的东西时,还得自己去下功夫。
gunaaaa 发表于 2009-7-27 13:44 | 显示全部楼层

如果你用第二中应该定义成有符号的

uchar i 改成 char i;
zhaoyu2005 发表于 2009-7-28 09:45 | 显示全部楼层

好像在8位机里

for(i=0;i<8;i++)比for(i=8;i>0;i--)编译的代码大,执行的也慢些,因为判断是否等于零,有个标志位,很简单,而判断非零的等于几,就复杂些,所以在8位机里,推荐for(i=8;i>0;i--)用法。最近在STM32上试了下,两者编译的代码一样大,但是执行时间没比较,没仔细研究汇编代码
vwwj 发表于 2009-7-28 12:07 | 显示全部楼层

我一般这样用 for(i=8;i!=0;i--) ,这样最小

  缺点是循环里给数组赋值第一个会赋不到
qqdgc 发表于 2009-7-28 12:12 | 显示全部楼层

顶3楼的

有风 发表于 2009-7-28 12:18 | 显示全部楼层

改那句还不如改循环里面的内容..

jerkoh 发表于 2009-7-28 14:31 | 显示全部楼层

re

抛开ACC不讲

就DS1302 中关于for(i=8;i>0;i--)与for(i=0;i<8;i++)的区别?
我也是1年多前遇到的
到现在也没解决 明白

10楼的回答比较同意。


tonylulu168 发表于 2009-7-28 17:35 | 显示全部楼层

这点区别,可以忽略不计;

这点也去计较,太小气;
ayb_ice 发表于 2009-7-28 20:27 | 显示全部楼层

执行效率不一样

不过有些MCU上效率区别不大
jerkoh 发表于 2009-7-28 21:52 | 显示全部楼层

re

在普通51 的11.05926M下
试验过 ,问题如楼主所说一样!
沈洁 发表于 2009-7-28 23:34 | 显示全部楼层

当然有区别咯,编译的指令不一样,执行时间不一样,51下面

51下面我们研究过的,--指令要比++指令快,因为有一条特殊的--指令的
jerkoh 发表于 2009-7-28 23:39 | 显示全部楼层

RE

下午 也试了下 keil 的环境下模拟时间

for(i=8;i>0;i--)与for(i=0;i<8;i++)
大约相差也就几十us 吧

但对于一些其他的功能函数 使用这2个都可以

唯独DS1302时 就是会出现for(i=8;i>0;i--)可以
for(i=0;i<8;i++)不行

还是没完全理解,谁来正解下
原野之狼 发表于 2009-7-29 00:19 | 显示全部楼层

这个问题,你去查看一下汇编代码就知道了。

首先,使用ACC肯定是不推荐的,除非对编译器很了解,知道后续的代码不会冲掉ACC的内容。
再者,两个for循环式有区别的,区别在于效率,同样也请查看汇编代码,然后单步看执行时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

153

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部