![]() ![]() ![]() |
Elles sont faciles à réaliser et je vous conseille fortement de les utiliser.
Si vous les utilisez, laissez les en-têtes dans vos programmes sources.
Pour finir, il y a l'index des macros disponibles dans Zguide 3.0, je les ai écrites pour vous faciliter la tâche lors de vos premiers programmes.
![]() ![]() ![]() |
Nous allons donc écrire une fois les lignes qui nous intéresse en faisant apparaître la notion de paramètre. Par la suite nous appellerons la macro autant de fois que nécessaire en lui soumettant un ou plusieurs paramètres. Le premier sera nommé \1, le second sera nommé \2 et ainsi de suite...
Notez que les paramètres n'ont pas d'ordre d'apparition défini dans la macro et peuvent même être utilisés plusieurs fois si besoins.
De plus, je ne pense pas que ce cas soit très fréquent mais vous pouvez tout à fait créer une macro sans paramètre.
A chaque appel de la macro dans notre programme, l'assembleur remplacera son nom par les lignes la composant avec les paramètres donnés, par conséquent nous augmentons la taille de notre programme à chaque fois.
Ceci met en avant un problème évitable, en effet si vous décidez d'utiliser plusieurs fois une même macro et qu'elle contient un label, celui-ci sera recopié à chaque fois et l'assembleur vous signalera qu'il est interdit d'utiliser un même label plus d'une fois.
Intervient alors la notion de label local, vous le définissez juste en ajoutant un \ avant le nom du label initial, dès lors l'assembleur réalisera son travail sans erreur.
Les paramètres peuvent être placés n'importe où, vous êtes totalement libre de votre choix.
Ainsi vous pouvez vous servir d'un paramètre pour 'créer' une instruction, si vous écrivez B\1 vous pouvez par la suite mettre comme paramètre CHG, CLR, SET ou TST pour obtenir BCHG, BCLR, BSET ou BTST !
Pour définir une macro, vous devez lui donner un nom puis mettre le mot clé MACRO.
Ensuite vous tapez les instructions avec les paramètres.
Enfin vous devez terminer votre macro avec le mot-clé ENDM.
(Vous pouvez utiliser indifféremment des minuscules ou des majuscules)
En conclusion, une macro ne sert ni plus ni moins qu'à gagner du temps et de la place dans le programme source, ce qui est très appréciable.
![]() ![]() ![]() |
DESAVANTAGE : la taille
Comme je vous l'ai déjà fait remarqué, l'appel à une macro est remplacé par le contenu de celle-ci, par conséquent vous ne réduisez pas la taille de votre programme final (.92p).
Si c'était votre but, je vous conseille fortement de vous tourner vers les sous-programmes en utilisant la pile pour faire passer les paramètres.
CAS PARTICULIER : aucun paramètre
Pas de paramètre ne veut pas dire pas de macro, loins de là, en fait vous devrez faire un choix entre vitesse et taille suivant les besoins de vos programmes.
![]() ![]() ![]() |
PROGRAMMATION
move.w #4,-(A7) ; empile la couleur pea hello(pc) ; empile le pointeur de la chaîne move.w #2,-(A7) ; empile l'ordonné move.w #5,-(A7) ; empile l'abscisse jsr tios::DrawStrXY ; lance la fonction lea 10(A7),A7 ; restaure la pile de 2+4+2+2=10 octets ; dans les données hello dc.b "Bonjour !",0 ; une chaîne terminée par un caractère nul
SOLUTION
Ecrire les lignes précédentes mais avec des paramètres (dans ce cas il y en a 4), on nomme notre macro WriteStr dans l'exemple suivant.
Attention, vous devez respecter scrupuleusement la casse (majuscules et minuscules) du nom des macros comme vous le faites avec les bibliothèques.
PROGRAMMATION
; Macro de la fonction tios::DrawStrXY syntaxe : WriteStr X,Y,COULEUR,TEXTE WriteStr MACRO ; nom de la macro / mot-clé marquant le départ de la macro MOVE.w \4,-(A7) ; empile le quatrième paramètre (couleur) PEA \3(PC) ; empile le pointeur de la chaîne MOVE.w \2,-(A7) ; empile le deuxième paramètre (adresse de la chaîne) MOVE.w \1,-(A7) ; empile le premier paramètre (couleur) JSR tios::DrawStrXY ; lance la fonction LEA 10(A7),A7 ; restaure la pile de 2+4+2+2=10 octets ENDM ; mot-clé marquant la fin de la macro ; dans le programme WriteStr #4,#5,#5,hello ; X=5, Y=5, COULEUR=4, TEXTE="Bonjour !" WriteStr #4,#2,#6,chaine ; X=2, Y=6, COULEUR=4, TEXTE="Vive l''assembleur" WriteStr #4,#10,#0,exemple ; X=10, Y=0, COULEUR=4, TEXTE="Coucou !" ; dans les données hello dc.b "Bonjour !",0 ; une chaîne terminée par un caractère nul chaine dc.b "Vive l''assembleur",0 ; une chaîne terminée par un caractère nul exemple dc.b "Coucou !",0 ; une chaîne terminée par un caractère nul
![]() ![]() |
Zguide © 1998 - 1999 par Florian DREVET. Tous droits réservés