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

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

#1 Message par JJE » ven. 15 mars 2019 12:17

bonjour à tous,
je rencontre à nouveau des problèmes avec MPASM.
Le souhaite modifier la routine GOTOX de BigOnOff pour lui permettre de prendre en compte le nombre de pages du processeur (je dois être un peu radin)
Comme je n'ai rien trouvé dans l'assembleur qui permette de le connaître, j'ai introduit une étiquette NbPages que l'utilisateur peut définir en fonction du processeur qu'il utilise. Je suis sur des Mid-range.
Le code suivant ;

Code : Tout sélectionner


    ifndef NbPages
        
#DEFINE NbPages 4
        messg   ""
        messg   "Attention, NbPages n'est pas défini"
        messg   "on lui attribue la valeur 4"
        messg   ""
    endif   ; def NbPages
    
            
; goto inter-banques
            
; ------------------
;
 adapté de BigOnOff
; réalise un goto avec gestion de PCLATH
    if NbPages 
== 4 || NbPages == 3
GOTOX  macro ADRESSE         
    local BIT3 
= (ADRESSE & 0x0800) ; voir bit 11
    local BIT4 
= (ADRESSE & 0x1000)    ; voir bit 12
    local   ICI
ICI    
    local PICI 
= (ICI+& 0x1800) ; page du saut
    IF BIT3                
; si ADRESSE dans page 1 ou 3
        bsf    PCLATH 
, 3        ; b3 de PCLATH = 1
    ELSE                
; sinon
        bcf    PCLATH 
, 3        ; b3 de PCLATH = 0
    ENDIF
    IF BIT4                
; si ADRESSE dans page 2 ou 4
        bsf    PCLATH 
, 4        ; b4 de PCLATH = 1
    ELSE                
; sinon
        bcf    PCLATH 
, 4        ; b4 de PCLATH = 0
    ENDIF
    goto 
(ADRESSE & 0x7FF | PICI)    ; adresse simulée
    endm
    endif
;    else   ; NbPages == 4 || NbPages == 3
    if NbPages 
== 2
GOTOX  macro ADRESSE         
    local BIT3 
= (ADRESSE & 0x0800) ; voir bit 11
    local   ICI
ICI    
    local PICI 
= (ICI+& 0x1800) ; page du saut
    IF BIT3                
; si ADRESSE dans page 1 ou 3
        bsf    PCLATH 
, 3        ; b3 de PCLATH = 1
    ELSE                
; sinon
        bcf    PCLATH 
, 3        ; b3 de PCLATH = 0
    ENDIF
    goto 
(ADRESSE & 0x7FF | PICI)    ; adresse simulée
    endm
    else
GOTOX  macro ADRESSE         
    goto 
(ADRESSE & 0x7FF | PICI)    ; adresse simulée
    endm
    endif   
; NbPages == 2
;    endif   ; NbPages == 4 || NbPages == 3


donne le compte rendu
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F884 "TestUSART.asm" /l"TestUSART.lst" /e"TestUSART.err" /d__DEBUG=1
Warning[206] ../../CALLX/CALLX.INC 52 : Found call to macro in column 1. (GOTOX)
Error[136] ../../CALLX/CALLX.INC 52 : Duplicate macro name (GOTOX)
Error[113] ../../CALLX/CALLX.INC 53 : Symbol not previously defined (ADRESSE)
Error[113] ../../CALLX/CALLX.INC 53 : Symbol not previously defined (PICI)
Error[145] ../../CALLX/CALLX.INC 54 : Unmatched ENDM
Error[118] E:\DOCUMENTS DE JJ\MES PROJETS MPLAB\USART\TESTUSART\TESTUSART.ASM 215 : Overwriting previous address contents (0000)
Error[118] E:\DOCUMENTS DE JJ\MES PROJETS MPLAB\USART\TESTUSART\TESTUSART.ASM 215 : Overwriting previous address contents (0000)


Alors que celui-ci qui exploite des if emboîtés, plutôt moins jolis

Code : Tout sélectionner


    ifndef NbPages
        
#DEFINE NbPages 4
        messg   ""
        messg   "Attention, NbPages n'est pas défini"
        messg   "on lui attribue la valeur 4"
        messg   ""
    endif   ; def NbPages
    
            
; goto inter-banques
            
; ------------------
;
 adapté de BigOnOff
; réalise un goto avec gestion de PCLATH
    if NbPages 
== 4 || NbPages == 3
GOTOX  macro ADRESSE         
    local BIT3 
= (ADRESSE & 0x0800) ; voir bit 11
    local BIT4 
= (ADRESSE & 0x1000)    ; voir bit 12
    local   ICI
ICI    
    local PICI 
= (ICI+& 0x1800) ; page du saut
    IF BIT3                
; si ADRESSE dans page 1 ou 3
        bsf    PCLATH 
, 3        ; b3 de PCLATH = 1
    ELSE                
; sinon
        bcf    PCLATH 
, 3        ; b3 de PCLATH = 0
    ENDIF
    IF BIT4                
; si ADRESSE dans page 2 ou 4
        bsf    PCLATH 
, 4        ; b4 de PCLATH = 1
    ELSE                
; sinon
        bcf    PCLATH 
, 4        ; b4 de PCLATH = 0
    ENDIF
    goto 
(ADRESSE & 0x7FF | PICI)    ; adresse simulée
    endm
;    endif
    else   
; NbPages == 4 || NbPages == 3
    if NbPages 
== 2
GOTOX  macro ADRESSE         
    local BIT3 
= (ADRESSE & 0x0800) ; voir bit 11
    local   ICI
ICI    
    local PICI 
= (ICI+& 0x1800) ; page du saut
    IF BIT3                
; si ADRESSE dans page 1 ou 3
        bsf    PCLATH 
, 3        ; b3 de PCLATH = 1
    ELSE                
; sinon
        bcf    PCLATH 
, 3        ; b3 de PCLATH = 0
    ENDIF
    goto 
(ADRESSE & 0x7FF | PICI)    ; adresse simulée
    endm
    else
GOTOX  macro ADRESSE         
    goto 
(ADRESSE & 0x7FF | PICI)    ; adresse simulée
    endm
    endif   
; NbPages == 2
    endif   
; NbPages == 4 || NbPages == 3

donne celui-ci :
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F884 "TestUSART.asm" /l"TestUSART.lst" /e"TestUSART.err" /d__DEBUG=1
Executing: "C:\Program Files\Microchip\MPASM Suite\mplink.exe" /p16F884 "TestUSART.o" /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /o"TestUSART.cof" /M"TestUSART.map" /W /x
MPLINK 4.49, Linker
Device Database Version 1.14
Copyright (c) 1998-2011 Microchip Technology Inc.
Errors : 0


la seule modification, outre la dernière ligne, est celle-ci :

Code : Tout sélectionner


    endm
;    endif

transforné en

Code : Tout sélectionner

;    endif
    else   
; NbPages == 4 || NbPages == 3


Quelqu'un peut-il m'expliquer ?
Merci d'avance.
Cordialement

JJE

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

encore des soucis avec MPASM
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » ven. 15 mars 2019 15:56

Bonjour JJE et à tous

L'erreur est toute simple, et tu vas encore rager :)
Le programme pose problème pour NbPages = 3 ou NbPages = 4, car dans ces 2 cas il y a tentative de redéfinition de la macro GOTOX.
Première définition derrière le "if NbPages == 4 || NbPages == 3", qui se termine ensuite par un endif.
Seconde définition derrière le "else" qui suit "if NbPages == 2"

Code : Tout sélectionner

  #DEFINE NbPages 4

  if NbPages == 4 || NbPages == 3
GOTOX macro ADRESSE
  ...
  endif

  if NbPages == 2
GOTOX macro ADRESSE         
  ...
  else              ; idem "if NbPages != 2"
GOTOX macro ADRESSE
  ...
  endif


Pourquoi ne pas faire :

Code : Tout sélectionner

  if NbPages == 4 || NbPages == 3
  ...
  else if NbPages == 2
  ...
  else              ; idem "if NbPages < 2 || NbPages > 4"
  ... 
  endif

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

#3 Message par JJE » ven. 15 mars 2019 17:17

Salut Satinas et merci de te pencher sur mon problème mais je ne suis pas trop d'accord :?
si NbPages vaut 3 ou 4, le source qui suit le " if NbPages == 4 || NbPages == 3" est lu par l'assembleur et donc définit la macro GotoX mais alors NbPages ==2 est faux et le code qui suit le "if NbPages == 2" devrait être ignoré, ne créant donc pas de double définition :roll: :mur:
satinas a écrit :Source du message Pourquoi ne pas faire :

c'est ce que je dis m'être résolu à faire mais ça fait des if imbriqués qui ne facilitent pas la lecture.

petit complément
satinas a écrit :Source du message   else              ; idem "if NbPages != 2"

exigerait d'être sûr que NbPages = 1, 2, 3 ou 4 ce que je ne teste pas. Ce serait d'ailleurs plus propre. Là, l'assembleur va indiquer une erreur à la première invocation de GotoX qui sera plus difficile à trouver, je crois que je vais ajouter ça
Cordialement

JJE

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

encore des soucis avec MPASM
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#4 Message par satinas » ven. 15 mars 2019 17:43

Avec NbPages = 4, lorsqu'on arrive sur le "if NbPages == 2", aucun "if" n'est en cours car il y a un "endif" juste avant. La condition "if NbPages == 2" n'étant pas vérifiée, l'assembleur passe aussitôt au "else" correspondant et prend en compte les lignes qui suivent ce "else".

Dans la solution proposée, il n'y a pas de if imbriqué, mais un if complet de type :
if/else if/.../else if/else/endif

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

#5 Message par JJE » ven. 15 mars 2019 17:51

:bravo:
et merci, j'ai honte
Cordialement

JJE

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

encore des soucis avec MPASM
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#6 Message par F6FCO » ven. 15 mars 2019 21:46

Bon, vous arrivez à faire du C dans l'assembleur :geek:
On apprend çà ou ? pas vu dans les cours de Bigonoff, il y a un tuto quelque part ?
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

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

#7 Message par JJE » sam. 16 mars 2019 07:09

F6FCO a écrit :Source du message Bon, vous arrivez à faire du C dans l'assembleur
, tout au plus du basic ou n'importe quoi d'ailleurs, tous les langages évolués ont une manière de if else endif.
F6FCO a écrit :Source du messageOn apprend çà ou ?
,
L'aide de MPLAB, "topic" MPASM Assembler et dans cette nouvelle fenêtre développer MPASM Assembler puis Directives qui donne de nombreuses manières d'intervenir sur le comportement de MPASM.
Ceci dit, du coup, quand on lit un source exploitant ces possibilités, il faut distinguer deux situations, soit on se met à la place de l'assembleur pour savoir quel source il va générer dans sa première phase, soit on se met à la place du Pic pour savoir ce qu'il va faire avec les instructions générées.
Je ne connais pas de tuto mais, pour info, j'ai écrit une macro Si

Code : Tout sélectionner

; Si V1, StrictSup+Signé, V2, jump, Là
; équivalent du Basic
; if V1>V2 then goto Là

qui fait bien un peu la même chose. StrictSup et signé étant des constantes définissant le test à faire. Je croyais avoir fait un post là dessus mais je ne l'ai pas retrouvé. Si ça intéresse quelqu'un, je veux bien m'y coller
Cordialement

JJE

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

encore des soucis avec MPASM
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#8 Message par Claudius » sam. 16 mars 2019 11:22

Bonjour,
F6FCO a écrit :
... Bon, vous arrivez à faire du C dans l'assembleur

JJE a écrit :
... tout au plus du basic ou n'importe quoi d'ailleurs, tous les langages évolués ont une manière de if else endif.

Petite précision si je puis me permette; les lignes suivantes ne sont pas du C, du Basic ou autre langage de programmation ...

Code : Tout sélectionner

  #DEFINE NbPages 4

  if NbPages == 4 || NbPages == 3
  ...
  endif

  if NbPages == 2     
  ...
  else              ; idem "if NbPages != 2"
  ...
  endif

... mais des directives de compilation interprétées dans le cas présent par l'assembleur sur un syntaxe proche du C qui pilotent la façon de générer le code écrit dans les ... si la condition statique est vraie.

Elles ne font pas en particulier (ex: if NbPages == 4 || NbPages == 3) l'objet de génération de code qui serait exécuté par le µC ;-)

encore des soucis avec MPASM
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1413
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#9 Message par F6FCO » sam. 16 mars 2019 22:23

Merci pour vos infos à tous les deux.
J'ai cru voir du C à cause de l'équivalence '==' qu'on ne trouve pas dans le basic.
Je vais aller mettre le nez dans ces directives.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Roger et 39 invités