打印

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

[复制链接]
4676|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heweibig|  楼主 | 2021-5-9 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 分两步语句写正常
实在是搞不懂

使用特权

评论回复
沙发
heweibig|  楼主 | 2021-5-9 23:23 | 只看该作者
用的HI-TECH PICC9.83

使用特权

评论回复
板凳
zwll| | 2021-5-9 23:25 | 只看该作者
不应该。看看反汇编代码如何执行的

使用特权

评论回复
地板
juventus9554| | 2021-5-9 23:28 | 只看该作者
优先级的问题..
把你想的那个操作打个括号..
x[n]=(x[n]<<1 ) | 1;
或者就分两步写...

使用特权

评论回复
5
renyaq| | 2021-5-9 23:30 | 只看该作者

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

--》

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

使用特权

评论回复
6
heweibig|  楼主 | 2021-5-9 23:31 | 只看该作者
加括号编译出来的还是一样

使用特权

评论回复
7
jiajs| | 2021-5-9 23:37 | 只看该作者
那么出来是等于几呢

使用特权

评论回复
8
heweibig|  楼主 | 2021-5-9 23:40 | 只看该作者
2 看反汇编后面的|1没有给我|1

使用特权

评论回复
9
yszong| | 2021-5-9 23:41 | 只看该作者

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
dingy| | 2021-5-9 23:43 | 只看该作者
这程序有啥用

使用特权

评论回复
11
supernan| | 2021-5-9 23:45 | 只看该作者
循环太快了,所以没看出来?

使用特权

评论回复
12
heweibig|  楼主 | 2021-5-9 23:47 | 只看该作者

x[0]=x[0]<<1 | 1;
指定x[0]能|1,但[]里是个变量时不能正确|1

使用特权

评论回复
13
jlyuan| | 2021-5-9 23:50 | 只看该作者

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;                      //防止程序跑飞,会不会被编译器优化掉得看情况
        }
    }
}

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

使用特权

评论回复
14
heweibig|  楼主 | 2021-5-9 23:53 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
15
wooda| | 2021-5-10 10:18 | 只看该作者
这个while循环的,瞬间出1,然后后面就飞了吧。
要 看是不是1,得加陷阱吧

使用特权

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

本版积分规则

869

主题

13089

帖子

7

粉丝