打印

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

[复制链接]
10320|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楼发言真快,居然跑到我前面去了,呵呵

使用特权

评论回复
5
微风| | 2009-7-27 12:00 | 只看该作者

注意标点符号

使用特权

评论回复
6
xwj| | 2009-7-27 12:43 | 只看该作者

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

3楼说得好,确实不应该跟ACC抢饭碗
其实,只要临时声明个bdata变量,Keil就会自动采用最聪明的方法优化成ACC相关指令,而用户根本就不用关心这些。

使用特权

评论回复
7
huangqi412| | 2009-7-27 12:56 | 只看该作者

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

使用特权

评论回复
8
大漠孤烟| | 2009-7-27 12:57 | 只看该作者

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

你完全能够以你的思路用C描述出来,可能别人的程序较简洁高效,可狠多时候理解不了别人的东西时,还得自己去下功夫。

使用特权

评论回复
9
gunaaaa| | 2009-7-27 13:44 | 只看该作者

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

uchar i 改成 char i;

使用特权

评论回复
10
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上试了下,两者编译的代码一样大,但是执行时间没比较,没仔细研究汇编代码

使用特权

评论回复
11
vwwj| | 2009-7-28 12:07 | 只看该作者

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

  缺点是循环里给数组赋值第一个会赋不到

使用特权

评论回复
12
qqdgc| | 2009-7-28 12:12 | 只看该作者

顶3楼的

使用特权

评论回复
13
有风| | 2009-7-28 12:18 | 只看该作者

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

使用特权

评论回复
14
jerkoh| | 2009-7-28 14:31 | 只看该作者

re

抛开ACC不讲

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

10楼的回答比较同意。


使用特权

评论回复
15
tonylulu168| | 2009-7-28 17:35 | 只看该作者

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

这点也去计较,太小气;

使用特权

评论回复
16
ayb_ice| | 2009-7-28 20:27 | 只看该作者

执行效率不一样

不过有些MCU上效率区别不大

使用特权

评论回复
17
jerkoh| | 2009-7-28 21:52 | 只看该作者

re

在普通51 的11.05926M下
试验过 ,问题如楼主所说一样!

使用特权

评论回复
18
沈洁| | 2009-7-28 23:34 | 只看该作者

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

51下面我们研究过的,--指令要比++指令快,因为有一条特殊的--指令的

使用特权

评论回复
19
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++)不行

还是没完全理解,谁来正解下

使用特权

评论回复
20
原野之狼| | 2009-7-29 00:19 | 只看该作者

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

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

使用特权

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

本版积分规则

31

主题

153

帖子

0

粉丝