打印
[STC单片机]

条件表达式不同写法,结果不同。求大神解惑

[复制链接]
1459|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hubo2782|  楼主 | 2014-11-29 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AC, ov, LED, vr, DM
keilc4软件
main()
{
        uchar c,a;
        c=0xfe;
        while(1)
        {
             a=0x10+(~c);
         if(a==0x11)
                 led5=0;
        }               
}这样程序执行是正确的led5点亮
main()
{
        uchar c,a;
        c=0xfe;
        while(1)
        {
         if((0x10+(~c))==0x11)
                 led5=0;
        }               
}这样程序执行就不正确,led5不亮,查了一天资料了,纠结啊,求大神解惑
我自己查了keilc的汇编程序发现keilc是这样编译的
C:0x0005    EF       MOV      A,R7
C:0x0006    F4       CPL      A
C:0x0007    FD       MOV      R5,A
C:0x0008    E4       CLR      A
C:0x0009    F4       CPL      A
C:0x000A    FC       MOV      R4,A
C:0x000B    ED       MOV      A,R5
C:0x000C    2410     ADD      A,#0x10
C:0x000E    FD       MOV      R5,A
C:0x000F    E4       CLR      A
C:0x0010    3C       ADDC     A,R4
C:0x0011    FC       MOV      R4,A
C:0x0012    ED       MOV      A,R5
C:0x0013    6411     XRL      A,#0x11
C:0x0015    4C       ORL      A,R4
C:0x0016    70ED     JNZ      C:0005
    19:                 led5=0;
C:0x0018    C285     CLR      led5(0x80.5)根据这个汇编程序运行到C:0x0016   70ED     JNZ      C:0005 A里面内容是0xff所以没执行led5=0。不知道怎么会这样,是keilc的bug么?


相关帖子

沙发
hubo2782|  楼主 | 2014-11-29 17:54 | 只看该作者
附上第一种c语言写法的keilc汇编程序
C:0x0005    EF       MOV      A,R7
C:0x0006    F4       CPL      A
C:0x0007    2410     ADD      A,#0x10
C:0x0009    FE       MOV      R6,A
    19:          if(a==0x11)
C:0x000A    BE11F8   CJNE     R6,#0x11,C:0005
    20:                 led5=0;
C:0x000D    C285     CLR      led5(0x80.5)

使用特权

评论回复
板凳
hubo2782|  楼主 | 2014-11-29 18:36 | 只看该作者
自己先顶下,求版主和大神啊,想知道什么情况下出现这种情况。

使用特权

评论回复
地板
cuya| | 2014-11-29 22:49 | 只看该作者
0x10+(~c) 使用的是16bit 整数运算, 即:
0x0010+(~0x00FE) != 0x0011

如果不特意指明运算类型, 那么编译器会自动认为是 16bit 或 32bit 整数运算

使用特权

评论回复
评论
hubo2782 2014-11-30 11:12 回复TA
一针见血 
评分
参与人数 1威望 +6 收起 理由
hubo2782 + 6 很给力!
5
hubo2782|  楼主 | 2014-11-30 09:44 | 只看该作者
cuya 发表于 2014-11-29 22:49
0x10+(~c) 使用的是16bit 整数运算, 即:
0x0010+(~0x00FE) != 0x0011

真是这个问题,谢谢。在前面加个(uchar)就行了
我想问下第一个程序的汇编最后干嘛要或呢  ORL      A,R4

使用特权

评论回复
6
cuya| | 2014-11-30 10:29 | 只看该作者
ORL      A,R4 是为了判断 R4R5!= 0x11 逻辑。

(R5 ^ 0x11) | R4

使用特权

评论回复
7
hubo2782|  楼主 | 2014-11-30 11:11 | 只看该作者
cuya 发表于 2014-11-30 10:29
ORL      A,R4 是为了判断 R4R5!= 0x11 逻辑。

(R5 ^ 0x11) | R4

嗯,谢谢你。他的汇编转换很灵活,高8位没做运算直接认为异或结果就是R4

使用特权

评论回复
8
hubo2782|  楼主 | 2014-11-30 11:16 | 只看该作者
cuya 发表于 2014-11-30 10:29
ORL      A,R4 是为了判断 R4R5!= 0x11 逻辑。

(R5 ^ 0x11) | R4

switch语句就能这样不出问题,或把+改成|也没有问题,在什么情况下还会有这类问题出现呢

使用特权

评论回复
9
mazhao141| | 2014-11-30 19:12 | 只看该作者
呃。。这种程序的话,从我个人的角度来说,确实第一种写法程序风格要好一些。如非必要,最好不要用第二种,然后的话。如果真的要用第二种,我也推荐你用按位与的方式,养成习惯会避免很多因为数据宽带带来的错误。

使用特权

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

本版积分规则

2

主题

63

帖子

1

粉丝