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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Bizarrerie avec MPASM
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » mar. 22 mai 2018 19:05

Bonjour à tous,
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
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Bizarrerie avec MPASM
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#2 Message par JJE » mar. 22 mai 2018 19:19

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
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Bizarrerie avec MPASM
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#3 Message par satinas » mer. 23 mai 2018 08:16

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.

Bizarrerie avec MPASM
JJE
Passioné
Passioné
Messages : 399
Âge : 83
Enregistré en : novembre 2017
Localisation : Picardie

#4 Message par JJE » mer. 23 mai 2018 17:13

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 :furieux:
Merci encore, je crois que sans ton aide j'aurais passé encore un grand moment sans aucune certitude de succès.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Bizarrerie avec MPASM
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » mer. 23 mai 2018 18:15

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 50 invités