COURS204.TXT/fr

From Atari Wiki
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