打印
[PIC®/AVR®/dsPIC®产品]

PICC编译器出来的汇编不是我想要的,是哪出了问题

[复制链接]
699|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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;
或者就分两步写...

使用特权

评论回复
5
ayb_ice| | 2020-1-21 15:14 | 只看该作者
x[n]=x[n]<<1 | 1;

--》

x[n]=(x[n]<<1) | 1;

使用特权

评论回复
6
jsjjccc|  楼主 | 2020-1-21 15:16 | 只看该作者
加括号编译出来的还是一样

使用特权

评论回复
7
wooda| | 2020-1-21 17:03 | 只看该作者
那么出来是等于几呢

使用特权

评论回复
8
jsjjccc|  楼主 | 2020-1-22 08:06 | 只看该作者
wooda 发表于 2020-1-21 17:03
那么出来是等于几呢

2 看反汇编后面的|1没有给我|1

使用特权

评论回复
9
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();想看不停移位效果加延时
        }
}

使用特权

评论回复
10
玛尼玛尼哄| | 2020-1-29 09:36 | 只看该作者
这程序有啥用

使用特权

评论回复
11
玛尼玛尼哄| | 2020-1-29 09:37 | 只看该作者
循环太快了,所以没看出来?

使用特权

评论回复
12
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

使用特权

评论回复
13
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

粉丝