搜索
bottom↓
回复: 7

STVD+COMIS编译后 if语句直接跳转 这是什么原因啊

[复制链接]

出0入0汤圆

发表于 2016-11-24 08:22:05 | 显示全部楼层 |阅读模式
本帖最后由 hollandcy 于 2016-11-24 08:23 编辑

c语言代码
void doLightSensor(void)
{
                RLED_StateReadNow=RLEDInputState();
       
                if(RLED_StateNow!=RLED_StateReadNow)//如果为高说明 无光
                {
                        if(RLED_StateReadNow==0)
                        {
                                //如果524ms*n内一直为高
                                if(newTim2Updated)
                                {
                                        newTim2Updated=0;
                                        if(RLED_HighStateCount<10) //524ms*n
                                        {
                                                RLED_HighStateCount++;
                                        }
                                        else
                                        {
                                                RLED_StateNow=RLED_StateReadNow;
                                                if(relayState==0)
                                                {
                                                                openRelay();
                                                }
                                                RLED_LowStateCount=0;
                                        }                                       
                                }
                        }
                        else
                        {
                               
                                if(newTim2Updated)
                                {
                                        newTim2Updated=0;
                                        if(RLED_LowStateCount<10)
                                        {
                                               
                                                RLED_LowStateCount++;
                                        }
                                        else
                                        {
                                               
                               
                                                RLED_StateNow=RLED_StateReadNow;
                                                if(relayState==1)
                                                {
       
                                                        closeRelay();
                                                       
                                                }
                                               
                                                RLED_HighStateCount=0;
                                        }                                               
                                }

                        }
                       
                       
                }
}
编译后汇编代码
board.c:166                        if(RLED_StateNow!=RLED_StateReadNow)//如果为高说明 无光
0x81e5 <doLightSensor+8>    0xC60101        LD    A,0x0101            LD    A,RLED_StateNow
0x81e8 <doLightSensor+11>   0xC10117        CP    A,0x0117            CP    A,RLED_StateReadNow
0x81eb <doLightSensor+14>   0x2750          JREQ  0x823d              JREQ  0x823d
board.c:168                                if(RLED_StateReadNow==0)
0x81ed <doLightSensor+16>   0x2027          JRT   0x8216              JRT   0x8216  

board.c:171                                        if(newTim2Updated)
0x81ef <doLightSensor+18>   0x725D010C      TNZ   0x010c              TNZ   _newTim2Updated
0x81f3 <doLightSensor+22>   0x2748          JREQ  0x823d              JREQ  0x823d
board.c:173                                                newTim2Updated=0;
0x81f5 <doLightSensor+24>   0x725F010C      CLR   0x010c              CLR   _newTim2Updated
board.c:174                                                if(RLED_HighStateCount<10) //524ms*n
0x81f9 <doLightSensor+28>   0xC60102        LD    A,0x0102            LD    A,RLED_HighStateCount
0x81fc <doLightSensor+31>   0xA10A          CP    A,#0x0a             CP    A,#0x0a
0x81fe <doLightSensor+33>   0x2405          JRNC  0x8205              JRNC  0x8205
board.c:177                                                        RLED_HighStateCount++;
0x8200 <doLightSensor+35>   0x725C0102      INC   0x0102              INC   RLED_HighStateCount
0x8204 <doLightSensor+39>   0x81            RET                       RET
board.c:181                                                        RLED_StateNow=RLED_StateReadNow;
0x8205 <doLightSensor+40>   0x5501170101    MOV   0x0101,0x0117       MOV   RLED_StateNow,RLED_StateReadNow
board.c:183                                                        if(relayState==0)
0x820a <doLightSensor+45>   0xC60103        LD    A,0x0103            LD    A,relayState
0x820d <doLightSensor+48>   0x2602          JRNE  0x8211              JRNE  0x8211
board.c:185                                                                        openRelay();
0x820f <doLightSensor+50>   0xAD36          CALLR 0x8247              CALLR _openRelay
board.c:189                                                        RLED_LowStateCount=0;
0x8211 <doLightSensor+52>   0x725F0104      CLR   0x0104              CLR   RLED_LowStateCount
0x8215 <doLightSensor+56>   0x81            RET                       RET
board.c:202                                        if(newTim2Updated)
0x8216 <doLightSensor+57>   0x725D010C      TNZ   0x010c              TNZ   _newTim2Updated
0x821a <doLightSensor+61>   0x2721          JREQ  0x823d              JREQ  0x823d
board.c:204                                                newTim2Updated=0;
0x821c <doLightSensor+63>   0x725F010C      CLR   0x010c              CLR   _newTim2Updated
board.c:205                                                if(RLED_LowStateCount<10)
0x8220 <doLightSensor+67>   0xC60104        LD    A,0x0104            LD    A,RLED_LowStateCount
0x8223 <doLightSensor+70>   0xA10A          CP    A,#0x0a             CP    A,#0x0a
0x8225 <doLightSensor+72>   0x2405          JRNC  0x822c              JRNC  0x822c
board.c:208                                                        RLED_LowStateCount++;

编译后从汇编 代码看 if(RLED_StateReadNow==0)语句直接变成跳转指令   JRT   0x8216 这是为什么啊

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-11-24 08:35:35 | 显示全部楼层
RLED_StateReadNow=RLEDInputState();

RLEDInputState()返回值一直为0 编译器就会优化成这样

出0入0汤圆

 楼主| 发表于 2016-11-24 08:45:45 | 显示全部楼层
子鱼 发表于 2016-11-24 08:35
RLED_StateReadNow=RLEDInputState();

RLEDInputState()返回值一直为0 编译器就会优化成这样

#define RLEDInputPort                 GPIOB
#define RLEDInputPin                     GPIO_PIN_0
#define RLEDInputState()           RLEDInputPort->IDR & (uint8_t)RLEDInputPin;

宏定义是这样的  编译器认为一直是0吗

出0入0汤圆

 楼主| 发表于 2016-11-24 09:58:45 | 显示全部楼层
有大神能给个方向吗

出0入0汤圆

发表于 2016-11-24 11:38:11 | 显示全部楼层
hollandcy 发表于 2016-11-24 09:58
有大神能给个方向吗

RLEDInputPort->IDR & (uint8_t)RLEDInputPin;

去掉最后的;

RLEDInputPort->IDR & (uint8_t)RLEDInputPin

出0入0汤圆

 楼主| 发表于 2016-11-24 14:45:43 | 显示全部楼层
子鱼 发表于 2016-11-24 11:38
RLEDInputPort->IDR & (uint8_t)RLEDInputPin;

去掉最后的;

这个一样的 原先我 也没加的 后面 找不到原因在那边乱试加上去的

出0入0汤圆

 楼主| 发表于 2016-11-24 15:28:43 | 显示全部楼层
为什么加了 __IO定义就好了 奇怪了

出0入8汤圆

发表于 2016-11-24 15:35:17 | 显示全部楼层
hollandcy 发表于 2016-11-24 15:28
为什么加了 __IO定义就好了 奇怪了

__IO means volatile
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 07:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表