[PIC®/AVR®/dsPIC®产品] PICC编译器出来的汇编不是我想要的,是哪出了问题

[复制链接]
 楼主| jsjjccc 发表于 2020-1-20 21:32 | 显示全部楼层 |阅读模式
unsigned char n;
unsigned char x[3];
main()
{
        x[0]=1;
        n=255;
        while (1)
        {
                n++;//这时后n等于0了
                x[n]=x[n]<<1 | 1; //就是把x[0]左移1下再或上1应该等于3,但无论怎么加括号或(unsigned char)都没用,都不等于3
                PORTA=x[n];
        }




}




谁能看出x[0]为什么不等于3,如果把后面的 | 1 分两步语句写正常
实在是搞不懂

 楼主| jsjjccc 发表于 2020-1-20 22:01 | 显示全部楼层
用的HI-TECH PICC9.83
lcczg 发表于 2020-1-21 10:48 | 显示全部楼层
不应该。看看反汇编代码如何执行的
CoolSilicon 发表于 2020-1-21 11:52 | 显示全部楼层
优先级的问题..
把你想的那个操作打个括号..
x[n]=(x[n]<<1 ) | 1;
或者就分两步写...
ayb_ice 发表于 2020-1-21 15:14 | 显示全部楼层
x[n]=x[n]<<1 | 1;

--》

x[n]=(x[n]<<1) | 1;
 楼主| jsjjccc 发表于 2020-1-21 15:16 | 显示全部楼层
加括号编译出来的还是一样
wooda 发表于 2020-1-21 17:03 | 显示全部楼层
那么出来是等于几呢
 楼主| jsjjccc 发表于 2020-1-22 08:06 | 显示全部楼层
wooda 发表于 2020-1-21 17:03
那么出来是等于几呢

2 看反汇编后面的|1没有给我|1
luxuan_006 发表于 2020-1-27 08:19 来自手机 | 显示全部楼层
本帖最后由 luxuan_006 于 2020-1-27 08:34 编辑

unsigned char n;
unsigned char x[3];
main() {         
      x[0]=1;
      //n=255;
      while (1) {
             //n++;
             x[0]=x[0]<<1 | 1;
             PORTA=x[0];
             //while(1);程序到这里结束加死循环
            //delay2s();想看不停移位效果加延时
        }
}
玛尼玛尼哄 发表于 2020-1-29 09:36 | 显示全部楼层
这程序有啥用
玛尼玛尼哄 发表于 2020-1-29 09:37 | 显示全部楼层
循环太快了,所以没看出来?
 楼主| jsjjccc 发表于 2020-1-29 17:24 | 显示全部楼层
luxuan_006 发表于 2020-1-27 08:19
unsigned char n;
unsigned char x[3];
main() {         

x[0]=x[0]<<1 | 1;
指定x[0]能|1,但[]里是个变量时不能正确|1
luxuan_006 发表于 2020-1-30 14:33 | 显示全部楼层
本帖最后由 luxuan_006 于 2020-1-30 14:47 编辑

unsigned char n;
unsigned char x[3];
main(){
    x[0]=1;
    n=255;
    while (1) {
        n++;                      //n此时是在无限循环内,值从0~255不断循环
        x[n]=x[n]<<1 | 1;   //n>2,数组已经溢出了,并且x[1],x[2]都未定义初始值,所以不可能获得正确值
        PORTA=x[n];
    }
}

改正后:
unsigned char n;
unsigned char x[3];
main(){
    x[0]=1;
    n=0;
    while (1) {
        if(n < 3){                      //判断 n 指向是否在定义数组区间内,n<3时执行位移和字节或指令
            x[n]=(x[n]<<1) | 1;   //n<3 时指向定义的数据区间内
            PORTA=x[n];            //向端口A发送数据
            n++;                        //n自加,永远不会大于3,当n=3时,程序进入无限循环的判断语句if(n < 3)中
            if(n < 3)  x[n] = x[n-1];        //将x[n]数值赋予下次做位移和字节或指令的x[n+1]
         }
        else{
            n = 3;                      //防止程序跑飞,会不会被编译器优化掉得看情况
        }
    }
}

再看看书吧!基础有点薄弱了,逻辑思维也不够强悍,呵呵!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

1

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

2

主题

10

帖子

1

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