2017-05-01 2 views
0

J'ai quelques malentendus dans l'adressage PIC18 (comme je le vois). Il y a donc une partie du fichier lst généré par XC8. À la fin du code, nous pouvons voir le bloc de comparaison commutateur/opérateur de cas, qui se branche ensuite sur les parties de cas. Donc, prenons deux étiquettes cohérentes l884 et l885. Son addreses est 1984h et 1990h (distance de 12 octets ou 6 mots). Mais si l'on regarde le code, ce qui est des branches à eux, nous pouvons voir:PIC18 Un peu étrange dans l'adressage

E0F7 bz l885

et

E0EF bz l884

la la distance est de 8 !!! pas 6, pas 0C, mais 8 ??? !!! je souhaite changer switch()/case case dans cette fonction goto calculé, car ce point est critique pour la vitesse (c'est la raison pour laquelle je regarde cette liste) mais maintenant je ne sais pas quel multiplicateur je dois utiliser 6, 8 ou 12?

addr hex code  label disasm 
    001984    l884: 

          ;main.c: 405: Run(canIdCheckers[1].func); 
    001984 C102 F03C   movff _canIdCheckers+2,[email protected] 
    001988 C103 F03D   movff _canIdCheckers+3,[email protected]+1 
    00198C ECB2 F014   call _Run ;wreg free 
    001990    l885: 

          ;main.c: 407: Run(canIdCheckers[0].func); 
    001990 C100 F03C   movff _canIdCheckers,[email protected] 
    001994 C101 F03D   movff _canIdCheckers+1,[email protected]+1 
    001998 EFB2 F014   goto _Run ;wreg free 
    00199C    l5504: 
    00199C 501E     movf _canIdCheckerCount,w,c 

          ; Switch size 1, requested type "space" 
          ; Number of cases is 48, Range of values is 1 to 48 
          ; switch strategies available: 
          ; Name   Instructions Cycles 
          ; simple_byte   145 73 (average) 
          ; Chosen strategy is simple_byte 
    00199E 0A01     xorlw 1 ; case 1 
    0019A0 E0F7     bz l885 
    0019A2 0A03     xorlw 3 ; case 2 
    0019A4 E0EF     bz l884 

Répondre

0

Quelques instructions assembleur PIC18, comme: movff, call, goto sont double mot et non seulement seul mot, donc au calcul de saut prendre soin de ces instructions! Et bien sûr, il n'y a pas de multiplicateur, juste des instructions qui comptent.

explication Ajouté:

001984    l884:           << 
    001984 C102 F03C   movff _canIdCheckers+2,[email protected]  -2 
    001988 C103 F03D   movff _canIdCheckers+3,[email protected]+1 -2 
    00198C ECB2 F014   call _Run ;wreg free   -2 
    001990    l885:            << 
    001990 C100 F03C   movff _canIdCheckers,[email protected]  -2 -2 
    001994 C101 F03D   movff _canIdCheckers+1,[email protected]+1 -2 -2 
    001998 EFB2 F014   goto _Run ;wreg free   -2 -2 
    00199C    l5504: 
    00199C 501E     movf _canIdCheckerCount,w,c  -1 -1 
    00199E 0A01     xorlw 1 ; case 1     -1 -1 
    0019A0 E0F7     bz l885        -1 >>-1  
    0019A2 0A03     xorlw 3 ; case 2     -1 
    0019A4 E0EF     bz l884       >>-1 
                    ========= 
                (sum of words)) -17 -9 

Calcul de la ligne: bz l884 -17 = (256-17) = 238 ou 0xF7 CODE Asm: E0F7

Calcul de la ligne: bz l885 -9 = (256 -9) = 247 ou 0xEF CODE Asm: E0EF

Si vous utilisez l'habitude de sauter PCLAT puis mettre la première valeur à PCLATU et PCLATH, et enfin à PCLATL ce qui mettra à jour le PC et passer à l'adresse PCLAT, vous pouvez utiliser la table pour stocker les adresses. Si vous utilisez le saut calciné, toutes les routines doivent avoir la même taille que ce que vous pouvez atteindre avec nop.

+0

Je sais à ce sujet. Comme vous pouvez le voir à partir de ce fichier LST, les trois commandes de cette partie (entre les étiquettes décrites) sont ces types. tout prend deux mots. Mais, la question n'était pas à ce sujet, mais à propos de POURQUOI LA DIFFÉRENCE ENTRE ARGUMENTS BZ COMMANDS était HUIT, quand la différence d'adresse était de 12 octets (6 mots)? Et à propos de la multiplication. donc le bloc de commande (qui serait totalement de 48) est 3 commandes deux movff et un appel, donc pour exécuter juste quelques derniers blocs je dois utiliser la multiplication avant d'ajouter à PCLATH (U), PCL. – EugenOS

+0

@EugenOS: vérifiez ma mise à jour. –