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
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
@EugenOS: vérifiez ma mise à jour. –