Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Bizarrerie avec MPASM
Bonjour à tous,
Je trébuche sur une bizarrerie de MPASM.
Voici quelques extraits du code concerné :
La zone des variables
Le début d'une macro, la suite n'est pas concernée
Un exemple d'invocation qui marche
voici le morceau de .LST généré par MPASM
Un deuxième essai (qui en fait fut le premier et qui m'a alerté)
code généré
Dans la ligne
00000080 M V set low(DataSSP) & 0x80
je m'attendrais à
00000080 M V set low(ZZ) & 0x80
L'un d'entre vous a-t-il une idée, j'avoue avoir passé beaucoup de temps là dessus pour un papier que je prépare pour la rubrique Tutoriel.
Cordialement
Je trébuche sur une bizarrerie de MPASM.
Voici quelques extraits du code concerné :
La zone des variables
Code : Tout sélectionner
CBLOCK 0x020 ; Début de la zone des variables
; sauvegardes pour l'IT
w_temp : 1 ; W
status_temp : 1 ; STATUS
; variables utiles
A : 1
ENDC ; Fin de la zone
CBLOCK 0xD0
VZ : 8
ZZ : 8
Truc : 1
ENDC ; Fin de la zone
CBLOCK 0x140
WZ : 8
AAA:1
ENDC
CBLOCK 0x195
DataSSP : 5
ENDC
Le début d'une macro, la suite n'est pas concernée
Code : Tout sélectionner
COPY macro A,ZZ
variable V, VV, VVV
V set low(A) & 0x80
VV set low(ZZ)& 0x80
VVV set 0
movf A,W
Un exemple d'invocation qui marche
Code : Tout sélectionner
org 0x000 ; Adresse de départ après reset
goto init
;**********************************************************************
init
movlw .100
movwf A
COPY Truc,DataSSP
voici le morceau de .LST généré par MPASM
Code : Tout sélectionner
0000 00124 org 0x000 ; Adresse de départ après reset
0000 2801 00125 goto init
00126
00127 ;**********************************************************************
00128
00129
0001 00130 init
0001 3064 00131 movlw .100
0002 00A2 00132 movwf A
00133
00134 COPY Truc,DataSSP
M
0000 M variable V, VV, VVV
00000080 M V set low(Truc) & 0x80
00000080 M VV set low(DataSSP)& 0x80
00000000 M VVV set 0
Un deuxième essai (qui en fait fut le premier et qui m'a alerté)
Code : Tout sélectionner
org 0x000 ; Adresse de départ après reset
goto init
;**********************************************************************
init
movlw .100
movwf A
COPY ZZ,DataSSP
code généré
Code : Tout sélectionner
0000 00124 org 0x000 ; Adresse de départ après reset
0000 2801 00125 goto init
00126
00127 ;**********************************************************************
00128
00129
0001 00130 init
0001 3064 00131 movlw .100
0002 00A2 00132 movwf A
00133
00134 COPY ZZ,DataSSP
M
0000 M variable V, VV, VVV
00000080 M V set low(DataSSP) & 0x80
00000080 M VV set low(DataSSP)& 0x80
00000000 M VVV set 0
Dans la ligne
00000080 M V set low(DataSSP) & 0x80
je m'attendrais à
00000080 M V set low(ZZ) & 0x80
L'un d'entre vous a-t-il une idée, j'avoue avoir passé beaucoup de temps là dessus pour un papier que je prépare pour la rubrique Tutoriel.
Cordialement
Bizarrerie avec MPASM
Complément au précédent :
Si, dans la déclaration de la macro, je remplace le nom du deuxième paramètre formel par un nom quelconque (en fait qui n'existe pas comme nom de variable), tout rentre dans l'ordre.
Mais je ne trouve pas cela normal, l'utilisateur d'une macro n'a pas à se préoccuper de son code pour s'en servir, juste de sa description, si elle est claire et complète, ce qui complique bien sa documentation.
Qui a déjà rencontré de tels problèmes ?
Cordialement
Si, dans la déclaration de la macro, je remplace le nom du deuxième paramètre formel par un nom quelconque (en fait qui n'existe pas comme nom de variable), tout rentre dans l'ordre.
Mais je ne trouve pas cela normal, l'utilisateur d'une macro n'a pas à se préoccuper de son code pour s'en servir, juste de sa description, si elle est claire et complète, ce qui complique bien sa documentation.
Qui a déjà rencontré de tels problèmes ?
Cordialement
Bizarrerie avec MPASM
Bonjour JJE,
variables utiles
A : 1
COPY macro A,ZZ
V set low(A) & 0x80
endm
Un premier problème, c'est que MPASM laisse passer des noms de variables et des noms de paramètre macro identiques. C'est dangereux. Cela vient sans doute du fait que le macro-processeur ne sait pas que A est une variable, il se contente de traiter du texte. L'assembleur arrive après l'expansion de la macro et ne voit pas le doublon.
COPY ZZ,DataSSP
Lorsque la macro est traitée, elle rencontre A qui est une variable mais aussi un de ses paramètres. Lequel choisit-elle ?
Elle considérer que A est un paramètre plutôt que la variable qu'elle ne connaît pas.
Donc elle remplace A par ZZ.
Hors il se trouve que ZZ est aussi un paramètre, alors elle en tient compte, c'est normal.
Elle remplace ZZ par DataSSP, et ça donne :
V set low(DataSSP) & 0x80
C''est pas vraiment des bugs à la base, mais autoriser les doublons variable et paramètre macro, c'est une belle peau de banane à bug.
variables utiles
A : 1
COPY macro A,ZZ
V set low(A) & 0x80
endm
Un premier problème, c'est que MPASM laisse passer des noms de variables et des noms de paramètre macro identiques. C'est dangereux. Cela vient sans doute du fait que le macro-processeur ne sait pas que A est une variable, il se contente de traiter du texte. L'assembleur arrive après l'expansion de la macro et ne voit pas le doublon.
COPY ZZ,DataSSP
Lorsque la macro est traitée, elle rencontre A qui est une variable mais aussi un de ses paramètres. Lequel choisit-elle ?
Elle considérer que A est un paramètre plutôt que la variable qu'elle ne connaît pas.
Donc elle remplace A par ZZ.
Hors il se trouve que ZZ est aussi un paramètre, alors elle en tient compte, c'est normal.
Elle remplace ZZ par DataSSP, et ça donne :
V set low(DataSSP) & 0x80
C''est pas vraiment des bugs à la base, mais autoriser les doublons variable et paramètre macro, c'est une belle peau de banane à bug.
Bizarrerie avec MPASM
Bonjour à tous,
merci Satinas pour ces explications limpides,
J'en conclue que, si je veux mettre dans la boîte à outils une telle macro, il faut, dans sa documentation, informer l'utilisateur du nom des paramètres formels et de l'impossibilité d'utiliser ces mêmes noms pour les variables lors d'une invocation.
Je te trouve gentil de ne pas considérer ça comme un bug, j'aurais tendance à penser que c'est une sérieuse erreur d'analyse. Il n'était pas très compliqué dans la phase d'expansion de la macro de se rendre compte que le premier paramètre effectif portait le même nom que le second paramètre formel et de prendre des dispositions en conséquence.
Je n'ai rien vu sur ce sujet dans la documentation de MPASM, c'est quand même dommage
Merci encore, je crois que sans ton aide j'aurais passé encore un grand moment sans aucune certitude de succès.
merci Satinas pour ces explications limpides,
J'en conclue que, si je veux mettre dans la boîte à outils une telle macro, il faut, dans sa documentation, informer l'utilisateur du nom des paramètres formels et de l'impossibilité d'utiliser ces mêmes noms pour les variables lors d'une invocation.
Je te trouve gentil de ne pas considérer ça comme un bug, j'aurais tendance à penser que c'est une sérieuse erreur d'analyse. Il n'était pas très compliqué dans la phase d'expansion de la macro de se rendre compte que le premier paramètre effectif portait le même nom que le second paramètre formel et de prendre des dispositions en conséquence.
Je n'ai rien vu sur ce sujet dans la documentation de MPASM, c'est quand même dommage
Merci encore, je crois que sans ton aide j'aurais passé encore un grand moment sans aucune certitude de succès.
Bizarrerie avec MPASM
Je suis d'accord que c'est un comportement un peu étonnant. Il y a peut être des cas où cela devient utile. Faire un macro-processeur, ça doit pas être évident, ça peut vite se mordre la queue. Cela montre qu'il faut prendre beaucoup de précautions dans la programmation des macros, faire court pour pouvoir les contrôler facilement.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 55 invités