ASSEMBLEUR

 

 
COURS D'ASM 68000
(par le Féroce Lapin)

retour au VOLUME 2

            
******************************************************************
*                                                                *
*             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