打印

两种情况赋值

[复制链接]
1465|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwll|  楼主 | 2013-1-3 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一种情况:
void write_byte(uchar *date)//data指向数据首地址     
{ uchar i,j,a[4],b;
i=*date;
for(i=0;i<8;i++)
   
     {
    for(j=0;j<4;j++)
      {
       a[j]=( ( *(date+j) ) >>i ) & 0x01; //分开存放四字节的位值   
        }
         write_bit(a);  
     }
}

第二种情况:
void write_byte(uchar *date)//data指向数据首地址     
{ uchar i,j,a[4],b;
i=*date;
   
}
沙发
zwll|  楼主 | 2013-1-3 16:09 | 只看该作者
为什么在keil软件仿真时候第一情况里面i的数值没有变化,第二种情况里i的数值变为*date。

使用特权

评论回复
板凳
chuxh| | 2013-1-3 16:10 | 只看该作者
keil优化掉了

使用特权

评论回复
地板
llljh| | 2013-1-3 16:10 | 只看该作者
可是这违反了哪个规定,才导致被优化。

使用特权

评论回复
5
juventus9554| | 2013-1-3 16:12 | 只看该作者
"
i=*date;
for(i=0;i<8;i++)
"
上面的i不是重复赋值了吗i = 0

使用特权

评论回复
6
司徒老鹰| | 2013-1-3 16:12 | 只看该作者
i=*date;
for(i=0;i<8;i++)

i被楼主优化了,

使用特权

评论回复
7
dingy| | 2013-1-3 16:14 | 只看该作者
应该把 i放进j的嵌套

使用特权

评论回复
8
zwll|  楼主 | 2013-1-3 16:14 | 只看该作者
我看了keil的优化设置选项,没有发现被优化的理由啊 ,还是麻烦说下这违反了哪个规定,才导致被优化

能说一下

使用特权

评论回复
9
zwll|  楼主 | 2013-1-3 16:16 | 只看该作者
#include<stdio.h>
#define uchar unsigned char


void Loopfortest(uchar *pt)
{
uchar i,;
// uchar b; //如果不定义b,直接进行下面的操作
//那么i的值是不会等于*pt的。只有加上了 uchar b,并且将i进行
//一次操作,就是赋值给另外一个变量。那么i=*pt就会生效。这是为什么呢?
i=*pt;
// b=++i;

for(i=0;i<10;i++);


}

void main()
{
uchar a=0x44;
Loopfortest(&a);

}

我经过调试发现:
当你定义一个变量,并且这个变量是用来循环计数的,那么这个变量就会存储在寄存器R0-R7中间。
当没有定义uchar b的时候
i=*pt在汇编的代码是:
mov  R0,@R7
这个指令keil是不支持的。
所以i的值是不会发生变回的。
那么定义了一个uchar b.并且将i的值付给b后,为什么i=*pt就生效了呢?
这是因为编译器检测到i作为了一次有效的右值,并且是有效的。那么它就会多几条指令出来,即先将*pt的值(在累加器A中)付给i(也是R0),这个时候代码就是mov R0,A,而不是上面的mov  R0,@R7。然后再将MOV b(的地址),R0

使用特权

评论回复
10
renyaq| | 2013-1-3 16:17 | 只看该作者
keil会生成不支持的汇编代码?
i=*pt;
for(i=0;i<10;i++);
相当于
i=*pt;
i=0;
while(i++<10)
这里
i=*pt;
i=0;
当然会被编译器优化成
i=0
如果不想被优化,把i定义成volatile变量

使用特权

评论回复
11
zwll|  楼主 | 2013-1-3 16:19 | 只看该作者
keil生成的汇编代码 到i=*date 那几条指令的时候 确实没有执行

使用特权

评论回复
12
zwll|  楼主 | 2013-1-3 16:19 | 只看该作者
哦,弄懂了,闪人

使用特权

评论回复
13
Shadow_Song| | 2013-1-4 14:20 | 只看该作者
学习了

使用特权

评论回复
14
huanghongxing| | 2013-1-5 22:58 | 只看该作者
这里是变量作用域的所导致的,可以再第一个for循环中把变量改改

使用特权

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

本版积分规则

885

主题

11314

帖子

5

粉丝