COURS204.TXT/fr
Jump to navigation
Jump to search
******************************************************************
* *
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST *
* *
* par Le Féroce Lapin (from 44E) *
* *
* Seconde série *
* *
* Cours numéro 4 *
******************************************************************
Après avoir vu le principe des inclusions, nous allons nous
pencher sur celui des MACROS. Ce cheminement peut vous paraître
étrange, dans la mesure où nous n'abordons pas tout de suite la
ligne_A (par ex.) C'est tout simplement parce que ces notions
vont être abondamment reprises dans les chapitres suivants, que je
me suis décidé à les aborder maintenant.
Pour expliquer ce qu'est une MACRO, nous allons partir d'un
exemple simple, celui de l'affichage de BONJOUR à l'écran. Nous
avons déjà vu depuis bien longtemps comment le faire avec la
fonction Gemdos numéro 9.
MOVE.L #MESSAGE,-(SP)
MOVE.W #9,-(SP)
TRAP #1
ADDQ.L #6,SP
MESSAGE DC.B "BONJOUR",0
Le problème (si on peut appeler ça un problème...) c'est qu'il
faut taper 4 lignes d'instructions pour réaliser l'opération.
Nous allons donc créer une grosse instruction qui va les englober
toutes les 4. Micro voulant dire petit et macro voulant dire
gros, nous désignerons cette 'grosse' instruction par le nom
de macro-instruction ou plus couramment macro.
Il va donc falloir définir en premier lieu la macro. Dans cette
exemple nous l'appellerons..... PRINT (original, non ?) Il faudra
lui passer comme paramètre l'adresse de notre phrase à afficher.
Comment définir cette macro ? Là se pose un problème impossible à
résoudre: la méthode de définition d'une macro dépend de
l'assembleur. En effet, les signes et conventions qui permettent
de définir une macro sont propres à votre assembleur.
Vous en voyez tout de suite l'inconvénient: des macros définies
avec Profimat sont inutilisables sous DEVPACK etc...
Voyons la définitions sous DEVPACK, ceux ne possédant pas cet
assembleur ou désirant définir des macros avec un autre assembleur
devront se reporter au mode d'emploi. Le principe reste cependant
le même.
PRINT MACRO ADR_TXT
MOVE.L 1,-(SP)
MOVE.W #9,-(SP)
TRAP #1
ADDQ.L #6,SP
ENDM
Voilà notre macro définie: Tout d'abord son nom est placé tout à
gauche. Ensuite on place la liste des paramètres qu'elle doit
recevoir, après le mot MACRO. Dans le cas présent je l'ai appelée
ADR_TXT. Pour la macro, le fait que ce nom soit le premier après
le mot MACRO fait qu'il est le numéro 1. Il sera donc désigné par
\1. Ensuite vient le corps de mon programme qui utilise \1 comme
si c'était l'adresse de ma phrase. La définition de la macro est
terminée par ENDM (END MACRO).
La définition de la macro est placée au début du programme. Parce
que cette définition contient MACRO et ENDM, l'assembleur sait
très bien qu'il ne faut pas l'assembler. Par contre, lorsqu'il
rencontrera PRINT #MESSAGE, il saura qu'il s'agit d'une macro et
ira recopier cette macro à la place de PRINT.
Voici un exemple:
( recopier ici la définition de la macro print )
VOID_INP2 MACRO
MOVE.W #7,-(SP)
TRAP #1
ADDQ.L #2,SP
ENDM
END_PRG MACRO
MOVE.W #0,-(SP)
TRAP #1
ENDM
PRINT #MESSAGE
VOID_INP2
PRINT #MESSAGE2
VOID_INP2
END_PRG
SECTION DATA
MESSAGE DC.B PREMIERE PHRASE",0
MESSAGE2 DC.B 13,10,"ET LA SECONDE!!!",0
Tapez ce programme, puis assemblez le et lancez le. Ensuite
débugger le et vous verrez que les appels de macro ont été
remplacés par les textes de ces macros. Pour le moment nous
n'avons vu qu'une macro avec 1 passage de paramètre. Le nombre de
ces paramètres 'passables' à une macro est variable et dépend de
l'assembleur. Ainsi dans DEVPACK il est possible de passer
jusqu'à 36 paramètres qui seront repérés par des chiffres (0-9)
puis par des lettres (A-Z ou a-z). Il est également possible
d'appeler une macro à partir d'une autre macro.
Ceci étant, il existe de très nombreux inconvénients à utiliser
les macros. Certains programmeurs en raffolent, j'avoue que ce
n'est pas mon cas. En effet l'énorme avantage de l'assembleur
réside dans le petit nombre d'instructions et donc du petit
nombre de termes à retenir. dès que l'on commence à faire
proliférer les macros, on se trouve coincé entre 2 feux: soit
donner des noms simples et se mélanger entre eux, soit donner des
noms à rallonge et se tromper souvent dans leur orthographe.
Certains poussent même la plaisanterie jusqu'à réaliser des
macros pour les appels du GEMDOS, BIOS ou XBIOS, en appelant les
macros par le nom des fonctions ou par le numéro. Je ne trouve pas
cette solution particulièrement valable car les noms des fonctions
du système d'exploitation ne sont pas très 'causant'. (une macro
nommée setprt ou cprnos.....)
De plus, il faut bien reconnaître que les appels au BIOS XBIOS
GEMDOS se font tous de la même manière et qu'il n'est pas
difficile de s'en rappeler. Nous verrons cependant que l'utili-
sation des macros dans le cas de la line_A ou du GEM est une ex-
cellente solution.
A ce sujet, l'assembleur MAD_MAC est réputé pour son énorme bibli-
othèque de macros. Malheureusement, il subsiste un doute concer-
nant sa disponibilité. Le club STATION Informatique affirme que
c'est un DOMaine PUBlique alors qu'Atari le fournit avec le pack
de développement. De toutes façons le club Station le fournissait
sans sa bibliothèque de macros , ce qui en réduit consi-
dérablement l'intérêt.
Pour finir avec les macros, sachez qu'il est bien évidemment
possible de se définir une bibliothèque de macros puis de
l'inclure avec INCLUDE au début de votre programme. C'est ce que
nous ferons avec le GEM, entre autre.
Exemple d'exercice: réaliser une macro que vous nommerez par
exemple PRINT_AT et que vous appellerez ainsi
PRINT_AT #12,#14,#MESSAGE
Les 2 chiffres désignant l'emplacement auquel vous voulez que le
texte soit affiché.
Une remarque: il serait tout à fait possible de ne pas mettre le #
mais, à ce moment-là, il faudrait le mettre dans la macro. Par
exemple
print macro 1
move.w #\1
move.w #2
trap #1
addq.l #4,sp
endm
Pour afficher le caractère A de code ASCII 65 il faudrait alors
faire PRINT 65
Back to ASM_Tutorial