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)是一样的。
功能正常? 直接看汇编代码分析啊 总能给出合理解释的 本帖最后由 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:
你也在用这个IC吗?我也是在用
页:
[1]