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
encore des soucis avec MPASM
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 ;
donne le compte rendu
Alors que celui-ci qui exploite des if emboîtés, plutôt moins jolis
donne celui-ci :
la seule modification, outre la dernière ligne, est celle-ci :
transforné en
Quelqu'un peut-il m'expliquer ?
Merci d'avance.
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+2 & 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+2 & 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+2 & 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+2 & 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.
encore des soucis avec MPASM
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"
Pourquoi ne pas faire :
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
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
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
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
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
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
encore des soucis avec MPASM
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
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
encore des soucis avec MPASM
encore des soucis avec MPASM
, 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 message Bon, vous arrivez à faire du C dans l'assembleur
,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
encore des soucis avec MPASM
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
Bonjour,
Petite précision si je puis me permette; les lignes suivantes ne sont pas du C, du Basic ou autre langage de programmation ...
... 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 ;-)
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 ;-)
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
encore des soucis avec MPASM
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 69 invités