C nebo ASM?
Michal HW
michalgregor@centrum.cz
Čtvrtek Květen 21 14:08:44 CEST 2009
Divam se ne preklad Hitech C kompilatoru pro PIC18:
Pom=0;
for (Ukazatel=8;Ukazatel<32+8;++Ukazatel) {
Pom=Pom+Bufer[Ukazatel];
*p_Ukaz++=Bufer[Ukazatel];
}
1268 ;DOHLED.C: 588: for
(Ukazatel=8;Ukazatel<32+8;++
+ Ukazatel) {
1269 00E41E 0E08 movlw 8
1270 00E420 CFE8 F933 movff wreg,_Ukazatel
1271 00E424 D029 goto L1
1272 00E426 l103:
1273 ;DOHLED.C: 589: Pom=Pom+Bufer[Ukazatel];
1274 00E426 C933 FFE8 movff _Ukazatel,wreg
1275 00E42A EE09 F036 lfsr 0,_Bufer
1276 00E42E 26E9 addwf fsr0l,f,c
1277 00E430 0E00 movlw 0
1278 00E432 22EA addwfc fsr0h,f,c
1279 00E434 50EF movf indf0,w,c
1280 00E436 0109 movlb _Pom shr (0+8)
1281 00E438 2730 addwf _Pom& (0+255),f,b
1282 ;DOHLED.C: 590: *p_Ukaz++=Bufer[Ukazatel];
1283 00E43A C933 FFE8 movff _Ukazatel,wreg
1284 00E43E EE09 F036 lfsr 0,_Bufer
1285 00E442 26E9 addwf fsr0l,f,c
1286 00E444 0E00 movlw 0
1287 00E446 22EA addwfc fsr0h,f,c
1288 00E448 50EF movf indf0,w,c
1289 00E44A C0AC FFF6 movff _p_Ukaz,tblptrl
1290 00E44E C0AD FFF7 movff _p_Ukaz+1,tblptrh
1291 00E452 C0AE FFF8 movff _p_Ukaz+2,tblptru
1292 00E456 BAF8 btfsc tblptru,5,c
1293 00E458 D003 bra u517
1294 00E45A 6EF5 movwf tablat,c
1295 00E45C 000C tblwt *
1296 00E45E D005 bra u510
1297 00E460 u517:
1298 00E460 CFF6 FFE9 movff tblptrl,fsr0l
1299 00E464 CFF7 FFEA movff tblptrh,fsr0h
1300 00E468 6EEF movwf indf0,c
1301 00E46A u510:
1302 00E46A 0100 movlb _p_Ukaz shr (0+8)
1303 00E46C 2BAC incf _p_Ukaz& (0+255),f,b
1304 00E46E 0E00 movlw 0
1305 00E470 23AD addwfc (_p_Ukaz+1)& (0+255),f,b
1306 00E472 23AE addwfc (_p_Ukaz+2)& (0+255),f,b
1307 00E474 0109 movlb _Ukazatel shr (0+8)
1308 00E476 2B33 incf _Ukazatel& (0+255),f,b
1309 00E478 L1:
1310 00E478 0E27 movlw 39
1311 00E47A 0109 movlb _Ukazatel shr (0+8)
1312 00E47C 6533 cpfsgt _Ukazatel& (0+255),b
1313 00E47E D7D3 goto l103
1314 ;DOHLED.C: 591: }
1315 00E480 0E13 movlw 19
1316 00E482 C0AC FFF6 movff _p_Ukaz,tblptrl
1317 00E486 C0AD FFF7 movff _p_Ukaz+1,tblptrh
1318 00E48A C0AE FFF8 movff _p_Ukaz+2,tblptru
1319 00E48E BAF8 btfsc tblptru,5,c
1320 00E490 D003 bra u537
1321 00E492 6EF5 movwf tablat,c
1322 00E494 000C tblwt *
1323 00E496 D005 bra u530
1324 00E498 u537:
1325 00E498 CFF6 FFE9 movff tblptrl,fsr0l
1326 00E49C CFF7 FFEA movff tblptrh,fsr0h
1327 00E4A0 6EEF movwf indf0,c
1328 00E4A2 u530:
1329 00E4A2 0100 movlb _p_Ukaz shr (0+8)
1330 00E4A4 2BAC incf _p_Ukaz& (0+255),f,b
1331 00E4A6 0E00 movlw 0
1332 00E4A8 23AD addwfc (_p_Ukaz+1)& (0+255),f,b
1333 00E4AA 23AE addwfc (_p_Ukaz+2)& (0+255),f,b
1334 ;DOHLED.C: 593: *p_Ukaz++=Pom;
1335 00E4AC C0AC FFF6 movff _p_Ukaz,tblptrl
1336 00E4B0 C0AD FFF7 movff _p_Ukaz+1,tblptrh
1337 00E4B4 C0AE FFF8 movff _p_Ukaz+2,tblptru
1338 00E4B8 BAF8 btfsc tblptru,5,c
1339 00E4BA D004 bra u547
1340 00E4BC C930 FFF5 movff _Pom,tablat
1341 00E4C0 000C tblwt *
1342 00E4C2 D006 bra u540
Docela dost dlouhe. V asembleru by to melo byt zhruba takto (par radku tam
chybi):
F7_Typ6_Pocitej
addwf POSTINC0,W
decfsz Rx1_Pocet_B
bra F7_Typ6_Pocitej
(Na novych procesorech je to jeste lepsi, zahlidl jsem nejakou instrukci na
opakovani kodu:
repeat 32
addwf POSTINC0,W
nebo tak nejak)
V Cecku se vzdy vypocitava index na pole a externi pamet, proto je to tak
dlouhe. Jak se s tim poperou jine kompilatory? Ja vim jde to optimalizovat,
ale proc psat v Cecku asembler?
Michal Gregor
Další informace o konferenci Hw-list