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