COURS204.TXT/fr
****************************************************************** * * * 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