liuqian 发表于 2014-8-3 09:32:12

PIC16F1704 XC8V1.32Pro 编译器优化真的不可思议

一段算一个数组中最大最小值的子程序
1)
void MaxMin(U32 *max, U32 *min)
{
    U8 i;
    U32 _max;
    U32 _min;
    U32 d;
    i=Settings-1;
    _max=0;
    _min=0xFFFFFFFF;
    while(i!=0xFF)
    {
      d=Lux;                // 用一个临时变量代替Lux
      if(d>_max)_max=d;
      if(d<_min)_min=d;
      i--;
    }
    *max=_max;
    *min=_min;
}

2)
void MaxMin(U32 *max, U32 *min)
{
    U8 i;
    U32 _max;
    U32 _min;
    i=Settings-1;
    _max=0;
    _min=0xFFFFFFFF;
    while(i!=0xFF)
    {
      if(Lux>_max)_max=Lux; // 直接用Lux
      if(Lux<_min)_min=Lux;
      i--;
    }
    *max=_max;
    *min=_min;
}


在XC8 pro V1.32中编译, 1)比2)小59个word
但是同样程序放在AVRstudio里面(GCC),编译出来,1)和2)是一样的。

abutter 发表于 2014-8-4 14:00:18

功能正常?

yklstudent 发表于 2014-8-4 16:42:09

直接看汇编代码分析啊 总能给出合理解释的

liuqian 发表于 2014-8-5 08:26:23

本帖最后由 liuqian 于 2014-8-5 08:34 编辑

对比lst文件,真的不一样

1)程序空间0650-068F,用64 words
9592                           ;TaskLight.c: 57: d=*lptr++;
959306500820                       movf        MaxMin@lptr,w
959406510086                       movwf        6
959506520821                       movf        MaxMin@lptr+1,w
959606530087                       movwf        7
959706543F40                       moviw fsr1
9598065500AC                       movwf        MaxMin@d
959906563F41                       moviw fsr1
9600065700AD                       movwf        MaxMin@d+1
960106583F42                       moviw fsr1
9602065900AE                       movwf        MaxMin@d+2
9603065A3F43                       moviw fsr1
9604065B00AF                       movwf        MaxMin@d+3
9605065C3004                       movlw        4
9606065D07A0                       addwf        MaxMin@lptr,f
9607065E1803                       skipnc
9608065F0AA1                       incf        MaxMin@lptr+1,f
9609                           
9610                           ;TaskLight.c: 58: if(d>_max)_max=d;
96110660082F                       movf        MaxMin@d+3,w
961206610227                       subwf        MaxMin@_max+3,w
961306621D03                       skipz
961406632E6E                       goto        u4255
96150664082E                       movf        MaxMin@d+2,w
961606650226                       subwf        MaxMin@_max+2,w
961706661D03                       skipz
961806672E6E                       goto        u4255
96190668082D                       movf        MaxMin@d+1,w
962006690225                       subwf        MaxMin@_max+1,w
9621066A1D03                       skipz
9622066B2E6E                       goto        u4255
9623066C082C                       movf        MaxMin@d,w
9624066D0224                       subwf        MaxMin@_max,w
9625066E                     u4255:       
9626066E1803                       skipnc
9627066F2E78                       goto        l169
96280670082F                       movf        MaxMin@d+3,w
9629067100A7                       movwf        MaxMin@_max+3
96300672082E                       movf        MaxMin@d+2,w
9631067300A6                       movwf        MaxMin@_max+2
96320674082D                       movf        MaxMin@d+1,w
9633067500A5                       movwf        MaxMin@_max+1
96340676082C                       movf        MaxMin@d,w
9635067700A4                       movwf        MaxMin@_max
96360678                     l169:       
9637                           
9638                           ;TaskLight.c: 59: if(d<_min)_min=d;
96390678082B                       movf        MaxMin@_min+3,w
96400679022F                       subwf        MaxMin@d+3,w
9641067A1D03                       skipz
9642067B2E86                       goto        u4265
9643067C082A                       movf        MaxMin@_min+2,w
9644067D022E                       subwf        MaxMin@d+2,w
9645067E1D03                       skipz
9646067F2E86                       goto        u4265
964706800829                       movf        MaxMin@_min+1,w
96480681022D                       subwf        MaxMin@d+1,w
964906821D03                       skipz
965006832E86                       goto        u4265
965106840828                       movf        MaxMin@_min,w
96520685022C                       subwf        MaxMin@d,w
96530686                     u4265:       
965406861803                       skipnc
965506872E90                       goto        l4120
96560688082F                       movf        MaxMin@d+3,w
9657068900AB                       movwf        MaxMin@_min+3
9658068A082E                       movf        MaxMin@d+2,w
9659068B00AA                       movwf        MaxMin@_min+2
9660068C082D                       movf        MaxMin@d+1,w
9661068D00A9                       movwf        MaxMin@_min+1
9662068E082C                       movf        MaxMin@d,w
9663068F00A8                       movwf        MaxMin@_min
96640690                     l4120:       


2)程序空间064D-06CB,用127 words
9583                           ;TaskLight.c: 60: if(Lux>_max)_max=Lux;
9584064D0831                       movf        MaxMin@i,w
9585064E00A0                       movwf        ??_MaxMin
9586064F3023                       movlw        35
9587065001A1                       clrf        ??_MaxMin+1
9588065135A0                       lslf        ??_MaxMin,f
958906520DA1                       rlf        ??_MaxMin+1,f
9590065335A0                       lslf        ??_MaxMin,f
959106540DA1                       rlf        ??_MaxMin+1,f
9592065501A2                       clrf        ??_MaxMin+2
9593065600A3                       movwf        ??_MaxMin+3
959406570820                       movf        ??_MaxMin,w
959506580722                       addwf        ??_MaxMin+2,w
959606590086                       movwf        6
9597065A0821                       movf        ??_MaxMin+1,w
9598065B3D23                       addwfc        ??_MaxMin+3,w
9599065C0087                       movwf        7
9600065D3F40                       moviw fsr1
9601065E00A4                       movwf        ??_MaxMin+4
9602065F3F41                       moviw fsr1
9603066000A5                       movwf        ??_MaxMin+5
960406613F42                       moviw fsr1
9605066200A6                       movwf        ??_MaxMin+6
960606633F43                       moviw fsr1
9607066400A7                       movwf        ??_MaxMin+7
96080665022C                       subwf        MaxMin@_max+3,w
960906661D03                       skipz
961006672E72                       goto        u4255
961106680826                       movf        ??_MaxMin+6,w
96120669022B                       subwf        MaxMin@_max+2,w
9613066A1D03                       skipz
9614066B2E72                       goto        u4255
9615066C0825                       movf        ??_MaxMin+5,w
9616066D022A                       subwf        MaxMin@_max+1,w
9617066E1D03                       skipz
9618066F2E72                       goto        u4255
961906700824                       movf        ??_MaxMin+4,w
962006710229                       subwf        MaxMin@_max,w
96210672                     u4255:       
962206720831                       movf        MaxMin@i,w
9623067300A0                       movwf        ??_MaxMin
962406743023                       movlw        35
9625067501A1                       clrf        ??_MaxMin+1
962606761803                       skipnc
962706772E90                       goto        L2
9628067835A0                       lslf        ??_MaxMin,f
962906790DA1                       rlf        ??_MaxMin+1,f
9630067A35A0                       lslf        ??_MaxMin,f
9631067B0DA1                       rlf        ??_MaxMin+1,f
9632067C01A2                       clrf        ??_MaxMin+2
9633067D00A3                       movwf        ??_MaxMin+3
9634067E0820                       movf        ??_MaxMin,w
9635067F0722                       addwf        ??_MaxMin+2,w
963606800086                       movwf        6
963706810821                       movf        ??_MaxMin+1,w
963806823D23                       addwfc        ??_MaxMin+3,w
963906830087                       movwf        7
964006843F40                       moviw fsr1
9641068500A9                       movwf        MaxMin@_max
964206863F41                       moviw fsr1
9643068700AA                       movwf        MaxMin@_max+1
964406883F42                       moviw fsr1
9645068900AB                       movwf        MaxMin@_max+2
9646068A3F43                       moviw fsr1
9647068B00AC                       movwf        MaxMin@_max+3
9648                           
9649                           ;TaskLight.c: 61: if(Lux<_min)_min=Lux;
9650068C0831                       movf        MaxMin@i,w
9651068D00A0                       movwf        ??_MaxMin
9652068E3023                       movlw        35
9653068F01A1                       clrf        ??_MaxMin+1
96540690                     L2:       
9655069035A0                       lslf        ??_MaxMin,f
965606910DA1                       rlf        ??_MaxMin+1,f
9657069235A0                       lslf        ??_MaxMin,f
965806930DA1                       rlf        ??_MaxMin+1,f
9659069401A2                       clrf        ??_MaxMin+2
9660069500A3                       movwf        ??_MaxMin+3
966106960820                       movf        ??_MaxMin,w
966206970722                       addwf        ??_MaxMin+2,w
966306980086                       movwf        6
966406990821                       movf        ??_MaxMin+1,w
9665069A3D23                       addwfc        ??_MaxMin+3,w
9666069B0087                       movwf        7
9667069C3F40                       moviw fsr1
9668069D00A4                       movwf        ??_MaxMin+4
9669069E3F41                       moviw fsr1
9670069F00A5                       movwf        ??_MaxMin+5
967106A03F42                       moviw fsr1
967206A100A6                       movwf        ??_MaxMin+6
967306A23F43                       moviw fsr1
967406A300A7                       movwf        ??_MaxMin+7
967506A40830                       movf        MaxMin@_min+3,w
967606A50227                       subwf        ??_MaxMin+7,w
967706A61D03                       skipz
967806A72EB2                       goto        u4265
967906A8082F                       movf        MaxMin@_min+2,w
968006A90226                       subwf        ??_MaxMin+6,w
968106AA1D03                       skipz
968206AB2EB2                       goto        u4265
968306AC082E                       movf        MaxMin@_min+1,w
968406AD0225                       subwf        ??_MaxMin+5,w
968506AE1D03                       skipz
968606AF2EB2                       goto        u4265
968706B0082D                       movf        MaxMin@_min,w
968806B10224                       subwf        ??_MaxMin+4,w
968906B2                     u4265:       
969006B21803                       skipnc
969106B32ECC                       goto        l4108
969206B40831                       movf        MaxMin@i,w
969306B500A0                       movwf        ??_MaxMin
969406B63023                       movlw        35
969506B701A1                       clrf        ??_MaxMin+1
969606B835A0                       lslf        ??_MaxMin,f
969706B90DA1                       rlf        ??_MaxMin+1,f
969806BA35A0                       lslf        ??_MaxMin,f
969906BB0DA1                       rlf        ??_MaxMin+1,f
970006BC01A2                       clrf        ??_MaxMin+2
970106BD00A3                       movwf        ??_MaxMin+3
970206BE0820                       movf        ??_MaxMin,w
970306BF0722                       addwf        ??_MaxMin+2,w
970406C00086                       movwf        6
970506C10821                       movf        ??_MaxMin+1,w
970606C23D23                       addwfc        ??_MaxMin+3,w
970706C30087                       movwf        7
970806C43F40                       moviw fsr1
970906C500AD                       movwf        MaxMin@_min
971006C63F41                       moviw fsr1
971106C700AE                       movwf        MaxMin@_min+1
971206C83F42                       moviw fsr1
971306C900AF                       movwf        MaxMin@_min+2
971406CA3F43                       moviw fsr1
971506CB00B0                       movwf        MaxMin@_min+3
971606CC                     l4108:       

retome 发表于 2015-7-23 15:06:04

你也在用这个IC吗?我也是在用
页: [1]
查看完整版本: PIC16F1704 XC8V1.32Pro 编译器优化真的不可思议