<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=COURS206.TXT</id>
	<title>COURS206.TXT - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=COURS206.TXT"/>
	<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=COURS206.TXT&amp;action=history"/>
	<updated>2026-07-26T21:25:39Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=COURS206.TXT&amp;diff=11520&amp;oldid=prev</id>
		<title>&gt;Zorro 2: Created page with &quot;&lt;pre&gt;    ******************************************************************    *                                                                *    *             COURS D'ASSEMBL...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=COURS206.TXT&amp;diff=11520&amp;oldid=prev"/>
		<updated>2016-12-22T14:54:13Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt;    ******************************************************************    *                                                                *    *             COURS D&amp;#039;ASSEMBL...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
   ******************************************************************&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *             COURS D'ASSEMBLEUR 68000 SUR ATARI ST              *&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *                 par Le F‚roce Lapin (from 44E)                 *&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *                         Seconde s‚rie                          *&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *                         Cours num‚ro 6                         *&lt;br /&gt;
   ******************************************************************&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   LES AUTO-MODIFICATIONS&lt;br /&gt;
&lt;br /&gt;
   Autre chose simple … utiliser et qui facilite beaucoup la program-&lt;br /&gt;
   mation: les  programmes  auto-modifiables. Comme  tous  les sujets&lt;br /&gt;
   abord‚s  jusqu'ici, celui  n'est pas compliqu‚ mais demande un peu&lt;br /&gt;
   d'attention. Je  dois  cependant  avouer  que le premiŠre fois que&lt;br /&gt;
   j'ai rencontr‚ une telle chose dans un listing, de nombreuses heu-&lt;br /&gt;
   res m'ont ‚t‚ n‚cessaires avant de comprendre ! La principale dif-&lt;br /&gt;
   ficult‚  r‚sidant  non pas dans la compr‚hension du sujet lui-mˆme&lt;br /&gt;
   mais  plut“t  dans  le choix de la m‚thode d'explication, j'espŠre&lt;br /&gt;
   que celle-ci vous donnera satisfaction!&lt;br /&gt;
&lt;br /&gt;
   Il  est  tout … fait possible d'imaginer une addition avec des va-&lt;br /&gt;
   riables. Par  exemple  A=1, B=2 pour  une op‚ration du genre A+B=C&lt;br /&gt;
   Nous  imaginons ‚galement sans mal que les valeurs de A et B puis-&lt;br /&gt;
   sent changer en cours de programme pour devenir par exemple A=2 et&lt;br /&gt;
   B=3 ce  qui  laisse  notre op‚ration A+B=C toujours aussi valable.&lt;br /&gt;
   Mais, comment faire pour que cette op‚ration A+B=C devienne tout …&lt;br /&gt;
   coup A-B=C ou encore A/B=C ?&lt;br /&gt;
&lt;br /&gt;
   L… se fait toute la diff‚rence entre un langage ‚volu‚ et l'assem-&lt;br /&gt;
   bleur. Nous avons vu, dans les premiers cours, que l'assembleur ne&lt;br /&gt;
   faisait que traduire en chiffres les instructions. A la diff‚rence&lt;br /&gt;
   des compilateurs qui 'arrangent' les instructions, l'assembleur ne&lt;br /&gt;
   r‚alise  qu'une traduction, instruction par instruction. Nous nous&lt;br /&gt;
   retrouvons  donc  avec  une  suite de chiffres, ces chiffres ‚tant&lt;br /&gt;
   dans  le  'tube'. Tout  comme  nous  avons ‚crit dans le tube pour&lt;br /&gt;
   modifier  des  valeurs donn‚es … des variables, il est donc tout a&lt;br /&gt;
   fait possible d'‚crire dans le tube pour modifier les chiffres qui&lt;br /&gt;
   sont  en  fait  des  instructions. Il  est ‚vident que la prudence&lt;br /&gt;
   s'impose  car  les  chiffres  que  nous allons ‚crire doivent ˆtre&lt;br /&gt;
   reconnus  par  le  68000 comme une nouvelle instruction et non pas&lt;br /&gt;
   comme  n'importe  quoi, ce  qui  conduirait  …  une erreur. Voyons&lt;br /&gt;
   concrŠtement un exemple simple.Nous avons une liste de lettres co-&lt;br /&gt;
   d‚e  en  word, et nous voulons afficher ces lettres les unes aprŠs&lt;br /&gt;
   les autres.&lt;br /&gt;
&lt;br /&gt;
   Voici un programme r‚alisant cette op‚ration.&lt;br /&gt;
&lt;br /&gt;
            INCLUDE   &amp;quot;B:\START.S&amp;quot;&lt;br /&gt;
            LEA       TABLEAU,A6     dans A6 car GEMDOS n'y touche pas&lt;br /&gt;
   DEBUT    MOVE.W    (A6)+,D0       pr‚lŠve le word&lt;br /&gt;
            CMP.W     #$FFFF,D0      c'est le flag de fin?&lt;br /&gt;
            BEQ       FIN            oui, bye bye&lt;br /&gt;
            MOVE.W    D0,-(SP)       non, donc le passe sur la pile&lt;br /&gt;
            MOVE.W    #2,-(SP)       pour l'afficher&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            ADDQ.L    #4,SP&lt;br /&gt;
            MOVE.W    #7,-(SP)       attend un appui touche&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            ADDQ.L    #2,SP&lt;br /&gt;
            BRA       DEBUT          et on recommence&lt;br /&gt;
   FIN      MOVE.W    #0,-(SP)&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
   *--------------------------------*&lt;br /&gt;
            SECTION DATA&lt;br /&gt;
   TABLEAU  DC.W      65,66,67,68,69,70,$FFFF&lt;br /&gt;
            SECTION BSS&lt;br /&gt;
            DS.L      100&lt;br /&gt;
   PILE     DS.L      1&lt;br /&gt;
            END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Imaginons  maintenant  que cet affichage soit dans une subroutine,&lt;br /&gt;
   et  que  nous voulions afficher une lettre … chaque appel de cette&lt;br /&gt;
   subroutine: On  attend un appui sur une touche, si c'est 'espace',&lt;br /&gt;
   alors  on  s'en va, sinon on saute … la routine qui affiche un ca-&lt;br /&gt;
   ractŠre puis revient. Voici un premier essai:&lt;br /&gt;
&lt;br /&gt;
            INCLUDE   &amp;quot;B:\START.S&amp;quot;&lt;br /&gt;
   DEBUT    MOVE.W    #7,-(SP)&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            ADDQ.L    #2,SP&lt;br /&gt;
            CMP.W     #&amp;quot; &amp;quot;,D0&lt;br /&gt;
            BEQ       FIN&lt;br /&gt;
            BSR       AFFICHE&lt;br /&gt;
            BRA       DEBUT&lt;br /&gt;
&lt;br /&gt;
   FIN      MOVE.W    #0,-(SP)&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
   *------------------------------*&lt;br /&gt;
   AFFICHE  LEA       TABLEAU,A6     adresse du tableau&lt;br /&gt;
            MOVE.W    A6)+,D0        pr‚lŠve le word&lt;br /&gt;
            MOVE.W    D0,-(SP)       le passe sur la pile&lt;br /&gt;
            MOVE.W    #2,-(SP)       pour l'afficher&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            ADDQ.L    #4,SP&lt;br /&gt;
            RTS                      puis on remonte&lt;br /&gt;
   *--------------------------------*&lt;br /&gt;
            SECTION DATA&lt;br /&gt;
   TABLEAU  DC.W      65,66,67,68,69,70,$FFFF&lt;br /&gt;
            SECTION BSS&lt;br /&gt;
            DS.L      100&lt;br /&gt;
   PILE     DS.L      1&lt;br /&gt;
            END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Assemblez et lancez le programme. Constatation: … chaque appui sur&lt;br /&gt;
   une  touche, on  obtient  un  'A' mais  pas  les autres lettres!!!&lt;br /&gt;
   Evidemment, puisqu'…  chaque  fois que nous sautons dans notre su-&lt;br /&gt;
   broutine  AFFICHE, celle-ci  recharge l'adresse du tableau. Le ca-&lt;br /&gt;
   ractŠre pr‚lev‚ est donc toujours le premier. Pour ‚viter cela, il&lt;br /&gt;
   faut donc cr‚er un pointeur qui avancera dans ce tableau. Dans no-&lt;br /&gt;
   tre  exemple, il  suffisait en fait de placer le LEA TABLEAU,A6 au&lt;br /&gt;
   d‚but  du  programme. A6 n'‚tant modifi‚ par personne, cela aurait&lt;br /&gt;
   fonctionn‚.... jusqu'au  7Šme  appui  sur  une touche, A6 pointant&lt;br /&gt;
   alors hors du tableau ! De plus, nous sommes ici pour apprendre et&lt;br /&gt;
   nous envisageons donc le cas o—, en dehors de la routine, tous les&lt;br /&gt;
   registres  sont modifi‚s! Impossible donc de garder A6 comme poin-&lt;br /&gt;
   teur. Voici donc la routine AFFICHE modifi‚e:&lt;br /&gt;
&lt;br /&gt;
   AFFICHE  MOVEA.L   PTN_TAB,A0&lt;br /&gt;
            MOVE.W    (A0)+,D0&lt;br /&gt;
            CMP.W     #$FFFF,D0&lt;br /&gt;
            BNE       .ICI&lt;br /&gt;
            LEA       TABLEAU,A0&lt;br /&gt;
            MOVE.L    A0,PTN_TAB&lt;br /&gt;
            BRA       AFFICHE&lt;br /&gt;
   .ICI     MOVE.L    A0,PTN_TAB&lt;br /&gt;
            MOVE.W    D0,-(SP)&lt;br /&gt;
            MOVE.W    #2,-(SP)&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            ADDQ.L    #4,SP&lt;br /&gt;
            RTS&lt;br /&gt;
&lt;br /&gt;
   De plus il faut rajouter aprŠs le INCLUDE (donc avant le label&lt;br /&gt;
   d‚but)&lt;br /&gt;
            LEA       TABLEAU,A0&lt;br /&gt;
            MOVE.L    A0,PTN_TAB&lt;br /&gt;
   et en section BSS&lt;br /&gt;
&lt;br /&gt;
   PTN_TAB  DS.L      1&lt;br /&gt;
&lt;br /&gt;
   Un  peu d'analyse aprŠs ces changements! Tout d'abord nous consta-&lt;br /&gt;
   tons avec bonheur que ‡a marche! Au d‚but nous mettons en place un&lt;br /&gt;
   pointeur.&lt;br /&gt;
&lt;br /&gt;
            LEA       TABLEAU,A0     met l'adresse du tableau en A0&lt;br /&gt;
            MOVE.L    A0,PTN_TAB     et la sauve dans PTN_TAB&lt;br /&gt;
&lt;br /&gt;
   Nous  avons  donc  maintenant  dans le tube en face de l'‚tiquette&lt;br /&gt;
   PTN_TAB  un  long mot, ce long mot ‚tant l'adresse du d‚but du ta-&lt;br /&gt;
   bleau. Ensuite  dans la routine, nous pr‚levons cette adresse. Ici&lt;br /&gt;
   une  petite  remarque  s'impose car la confusion est fr‚quente: Si&lt;br /&gt;
   nous avons:&lt;br /&gt;
&lt;br /&gt;
   IMAGE    INCBIN    &amp;quot;A:\MAISON.PI1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   et que nous voulons travailler avec cette image, nous ferons &lt;br /&gt;
&lt;br /&gt;
            LEA       IMAGE,A0&lt;br /&gt;
&lt;br /&gt;
   A0 pointera alors sur l'image. Par contre si nous avons :&lt;br /&gt;
&lt;br /&gt;
   PTN_IMAG DC.L      IMAGE&lt;br /&gt;
&lt;br /&gt;
   C'est-…-dire  une  ‚tiquette  pour  un  long  mot se trouvant ˆtre&lt;br /&gt;
   l'adresse  de l'image, en faisant LEA PTN_IMAGE,A0 nous ne r‚cup‚-&lt;br /&gt;
   rons  pas  en  A0 l'adresse  de  l'image mais en fait l'adresse de&lt;br /&gt;
   l'adresse  de  l'image! Pour r‚cup‚rer directement un pointeur sur&lt;br /&gt;
   l'image il faut faire:&lt;br /&gt;
&lt;br /&gt;
            MOVEA.L   PTN_IMAGE,A0&lt;br /&gt;
&lt;br /&gt;
   Cependant, pour r‚cup‚rer l'adresse du tableau il aurait ‚galement&lt;br /&gt;
   ‚t‚ possible de faire:&lt;br /&gt;
&lt;br /&gt;
            MOVEA.L   #TABLEAU,A0&lt;br /&gt;
&lt;br /&gt;
   Ceci  dit, continuons  notre  exploration: Dans PTN_TAB nous avons&lt;br /&gt;
   donc l'adresse du d‚but du tableau. Attente d'un appui touche, hop&lt;br /&gt;
   on  saute  dans  la  routine. Transfert  l'adresse  contenue  dans&lt;br /&gt;
   PTN_TAB  dans  A0 puis  on  pr‚lŠve le word contenu dans le tube …&lt;br /&gt;
   cette  adresse  et on le met en D0. Comme nous avons r‚alis‚ cette&lt;br /&gt;
   op‚ration  avec  (A0)+, A0 point  donc  maintenant sur le prochain&lt;br /&gt;
   word  du tableau. Testons si le word pr‚lev‚ est $FFFF, ce qui in-&lt;br /&gt;
   diquerait  la  fin  du tableau. Si ce n'est pas le cas, on saute …&lt;br /&gt;
   .ICI et on sauve la nouvelle valeur de A0 dans PTN_TAB.&lt;br /&gt;
&lt;br /&gt;
   Si  le  word pr‚lev‚ est $FFFF, on recharge PTN_TAB avec l'adresse&lt;br /&gt;
   du haut du tableau, et c'est reparti comme en 14!!!&lt;br /&gt;
&lt;br /&gt;
   Ce systŠme de pointeur, trŠs fr‚quemment utilis‚, est simple d'em-&lt;br /&gt;
   ploi  et  bien  commode! Voyons  cependant une autre m‚thode, plus&lt;br /&gt;
   tordue! Supprimons  tout  d'abord la routine AFFICHE et rempla‡ons&lt;br /&gt;
   la par la suivante:&lt;br /&gt;
&lt;br /&gt;
   AFFICHE  MOVEA.L   #TABLEAU,A0&lt;br /&gt;
            MOVE.W    (A0)+,D0&lt;br /&gt;
            MOVE.W    D0,-(SP)&lt;br /&gt;
            MOVE.W    #2,-(SP)&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            ADDQ.L    #4,SP&lt;br /&gt;
            RTS&lt;br /&gt;
&lt;br /&gt;
   R‚assemblons  et  lan‡ons. Il  est bien ‚vident que cela ne marche&lt;br /&gt;
   plus puisqu'… chaque appel de la routine, nous rechargeons A0 avec&lt;br /&gt;
   l'adresse  du  TABLEAU, donc le word pr‚lev‚ sera toujours le pre-&lt;br /&gt;
   mier  du tableau. Passons sous MONST avec Alt+D. Descendons sur le&lt;br /&gt;
   label AFFICHE. Nous  trouvons  en face MOVEA.L #TABLEAU,A0 etc....&lt;br /&gt;
   Quittons avec control+C puis r‚assemblons, mais attention avant de&lt;br /&gt;
   cliquer  sur  'assembler', jetons  un coup d'oeil sur les options.&lt;br /&gt;
   Nous  avons  par d‚faut DEBUG INFO indiquant Extend. Cela signifie&lt;br /&gt;
   que  les  noms  des labels vont ˆtre incorpor‚s dans le programme.&lt;br /&gt;
   Cela  nous permet de retrouver les noms de ces labels lorsque nous&lt;br /&gt;
   sommes  sous  MONST. Choisissons l'option NONE pour DEBUG INFO as-&lt;br /&gt;
   semblons et repassons sous MONST. &lt;br /&gt;
&lt;br /&gt;
   Surprise,  les  noms  des labels ont disparu et sont remplac‚s par&lt;br /&gt;
   des  chiffres. C'est logique puisque, de toute fa‡on, l'assembleur&lt;br /&gt;
   traduit  notre  source  en chiffres. Cherchons notre routine AFFI-&lt;br /&gt;
   CHAGE. C'est  un peu plus dur puisque son ‚tiquette n'est plus vi-&lt;br /&gt;
   sible! Pour se rep‚rer, on peut chercher au d‚but (aprŠs le start)&lt;br /&gt;
   CMP.W  #$20,D0 qui  est la comparaison avec la touche espace aprŠs&lt;br /&gt;
   l'appui  touche. Ensuite, un  BEQ vers la fin et le BSR vers notre&lt;br /&gt;
   routine. Relevons  l'adresse situ‚e en face du BSR et allons-y. La&lt;br /&gt;
   premiŠre ligne de notre routine c'est MOVEA.L #$XXXXXXX,A0 XXXXXXX&lt;br /&gt;
   ‚tant  l'adresse  du tableau. Je rappelle que sur un 68000 le pro-&lt;br /&gt;
   gramme peut se trouver n'importe o— en m‚moire, cette adresse sera&lt;br /&gt;
   donc  diff‚rente  suivant les machines. Pour ma part c'est $924C6.&lt;br /&gt;
   J'active  la  fenˆtre 3 avec Alt+3 puis avec alt+a je demande … la&lt;br /&gt;
   fenˆtre  de  se  positionner sur cette adresse. MONST m'affiche au&lt;br /&gt;
   centre les codes ASCII des lettres de mon tableau ($41,$42 etc...)&lt;br /&gt;
   et … droite ces lettres en 'texte'.&lt;br /&gt;
&lt;br /&gt;
   En  avan‡ant  dans  cette routine d'affichage, je vais donc mettre&lt;br /&gt;
   (pour  moi) $924C6 en  A0, cette  adresse ‚tant celle pointant sur&lt;br /&gt;
   le 'A' du tableau. Ce qui m'int‚resserait, c'est que, la prochaine&lt;br /&gt;
   fois, cela  me  permette  de  pointer  sur  le  'B'. Pour  cela il&lt;br /&gt;
   faudrait avoir:&lt;br /&gt;
            MOVEA.L   #$924C6,A0     pour le 'A'&lt;br /&gt;
&lt;br /&gt;
   et ensuite &lt;br /&gt;
            MOVEA.L   #$924C8,A0     pour le 'B'.&lt;br /&gt;
&lt;br /&gt;
   Les  lettres ‚tant sous forme de word dans mon tableau il faut une&lt;br /&gt;
   avance de 2 ! &lt;br /&gt;
&lt;br /&gt;
   Retournons  dans  la  fenˆtre 2, en  face de ce MOVEA.L, regardons&lt;br /&gt;
   l'adresse  …  laquelle  il  se  trouve (colonne de gauche), notons&lt;br /&gt;
   cette adresse, et notons ‚galement l'adresse de l'instruction sui-&lt;br /&gt;
   vante  (MOVE.W (A0)+,D0). Activons la fenˆtre 3, et pla‡ons nous …&lt;br /&gt;
   l'adresse du MOVEA.L.&lt;br /&gt;
&lt;br /&gt;
   Dans mon cas, et puisque j'avais:&lt;br /&gt;
            MOVEA.L   #$924C6,A0     je trouve 207C 0009 24C6&lt;br /&gt;
&lt;br /&gt;
   J'en  d‚duis  que ces 3 words constituent la repr‚sentation de mon&lt;br /&gt;
   instruction  MOVEA.L, puisque l'adresse du word suivant correspond&lt;br /&gt;
   … celle de l'instruction suivante. Or, je retrouve dans ce codage,&lt;br /&gt;
   l'adresse  de  mon  tableau. Avec un peu d'imagination, je con‡ois&lt;br /&gt;
   ais‚ment qu'il est possible d'‚crire directement dans le 'tube' et&lt;br /&gt;
   par  exemple  de modifier le word qui a pour valeur actuelle 24C6.&lt;br /&gt;
   Si  je  lui  ajoute 2, mon instruction deviendra 207C 0009 24C8 ce&lt;br /&gt;
   qui  reviendra  … MOVEA.L #$924C8,A0 et qui me fera pointer sur le&lt;br /&gt;
   second word du tableau!!!!!!!! &lt;br /&gt;
&lt;br /&gt;
   Voici donc la version auto-modifiable de la routine AFFICHE.&lt;br /&gt;
&lt;br /&gt;
   AFFICHE MOVEA.L    #TABLEAU,A0&lt;br /&gt;
            MOVE.W    A0),D0&lt;br /&gt;
            CMP.W     #$FFFF,D0&lt;br /&gt;
            BNE       ICI&lt;br /&gt;
            MOVE.L    #TABLEAU,AFFICHE+2&lt;br /&gt;
            BRA       AFFICHE&lt;br /&gt;
   .ICI     ADD.W     #2,AFFICHE+4&lt;br /&gt;
            MOVE.W    D0,-(SP)&lt;br /&gt;
            MOVE.W    #2,-(SP)&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            ADDQ.L    #4,SP&lt;br /&gt;
            RTS&lt;br /&gt;
&lt;br /&gt;
   Note: PTN_TAB  ne  nous  sert  plus, et  de mˆme le LEA tableau du&lt;br /&gt;
   d‚but.&lt;br /&gt;
&lt;br /&gt;
   Assemblez  avec NONE en DEBUG INFO, puis passez sous MONST, faites&lt;br /&gt;
   avancer pas … pas et regardez la ligne&lt;br /&gt;
&lt;br /&gt;
            MOVEA.L   #TABLEAU,A0    se modifier!&lt;br /&gt;
&lt;br /&gt;
   Expliquons bien clairement ce qui se passe. &lt;br /&gt;
&lt;br /&gt;
   Nous  pla‡ons TABLEAU en A0 puis nous pr‚levons le word. Admettons&lt;br /&gt;
   tout  d'abord  qu'il ne s'agisse pas de $FFFF, nous sautons donc …&lt;br /&gt;
   .ICI. Il  faut  donc ajouter 2 pour augmenter l'adresse et pointer&lt;br /&gt;
   la  prochaine fois sur la seconde lettre du tableau. Nous avons vu&lt;br /&gt;
   qu'en ‚tant cod‚e la ligne MOVEA.L etc... tient sur 3 words donc 6&lt;br /&gt;
   bytes. L'ajout de 2 doit donc porter sur le 3Šme word. Le d‚but de&lt;br /&gt;
   ce word c'est le byte 4. Pour cette raison nous donnons comme des-&lt;br /&gt;
   tination de l'addition AFFICHE+4.&lt;br /&gt;
&lt;br /&gt;
   Si  nous avions pr‚lev‚ $FFFF, il aurait fallu r‚initialiser notre&lt;br /&gt;
   ligne MOVEA.L avec&lt;br /&gt;
&lt;br /&gt;
            MOVE.L    #TABLEAU,AFFICHE+2.&lt;br /&gt;
&lt;br /&gt;
   Pourquoi  +2 ? Parce  que  l'adresse de tableau est un long mot et&lt;br /&gt;
   que, dans  le codage de l'instruction, cela commence sur le second&lt;br /&gt;
   word. Il faut donc sauter un seul word c'est-…-dire 2 bytes.&lt;br /&gt;
&lt;br /&gt;
   Dans  le mˆme ordre de chose, il est tout … fait possible de modi-&lt;br /&gt;
   fier plus profond‚ment un programme. En voici un exemple flagrant.&lt;br /&gt;
   (voir listing num‚ro 4)&lt;br /&gt;
&lt;br /&gt;
   Sachant  que  l'instruction RTS (Return from subroutine) est cod‚e&lt;br /&gt;
   avec  $4E75 et  que l'instruction NOP (No operation) est cod‚e par&lt;br /&gt;
   $4E71, en pla‡ant un NOP ou un RTS, on change en fait la fin de la&lt;br /&gt;
   routine. NOP ne fait rien du tout. C'est une op‚ration qui est bi-&lt;br /&gt;
   don  dans  le  sens  o—  rien  ne  change, mais  cette instruction&lt;br /&gt;
   consomme un peu de temps. Elle nous servira donc pour r‚aliser des&lt;br /&gt;
   petites  attentes (bien utile pour des effets graphiques par exem-&lt;br /&gt;
   ple).&lt;br /&gt;
&lt;br /&gt;
   Suivez bien le d‚roulement de ce programme sous MONST afin de voir&lt;br /&gt;
   les modifications se faire. Un cas plus complexe:&lt;br /&gt;
&lt;br /&gt;
            MOVE.W    #23,D0&lt;br /&gt;
            MOVE.W    #25,D1&lt;br /&gt;
   VARIANTE ADD.W     D0,D1&lt;br /&gt;
            MULU.W    #3,D1&lt;br /&gt;
            SUB.W     #6,D1&lt;br /&gt;
            MOVE.W    D1,D5&lt;br /&gt;
&lt;br /&gt;
   AprŠs  assemblage  de  ce  petit morceau de programme, passez sous&lt;br /&gt;
   MONST  et  jetez  un  coup  d'oeil … la fenˆtre 3. En pointant sur&lt;br /&gt;
   VARIANTE et en regardant les adresses en face des instructions, on&lt;br /&gt;
   en d‚duit que:&lt;br /&gt;
&lt;br /&gt;
            ADD.W     D0,D1     est converti en $D240&lt;br /&gt;
            MULU.W    #3,D1     est converti en $C2FC $0003&lt;br /&gt;
            SUB.W     #6,D1     est converti en $0441 $0006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Si nous prenons maintenant:&lt;br /&gt;
            MOVE.W    #23,D0&lt;br /&gt;
            MOVE.W    #25,D1&lt;br /&gt;
   VARIANTE MULU.W    D0,D1&lt;br /&gt;
            SUB.W     #8,D1&lt;br /&gt;
            ADD.W     #4,D0&lt;br /&gt;
            MOVE.W    D1,D5&lt;br /&gt;
&lt;br /&gt;
   Nous  assemblons,   passons  sous  MONST:&lt;br /&gt;
&lt;br /&gt;
            MULU.W    D0,D1     est converti en $C2C0&lt;br /&gt;
            SUB.W     #8,D1     est converti en $0441 $0008&lt;br /&gt;
            ADD.W     #4,D0     est converti en $0640 $0004&lt;br /&gt;
&lt;br /&gt;
   Donc, si dans un programme utilisant cette 'routine' je fais&lt;br /&gt;
&lt;br /&gt;
            LEA       VARIANTE,A0&lt;br /&gt;
            MOVE.W    #$D240,(A0)+&lt;br /&gt;
            MOVE.L    #$C2FC0003,(A0)+&lt;br /&gt;
            MOVE.L    #$04410006,(A0)+&lt;br /&gt;
&lt;br /&gt;
   J'obtiendrai  la  premiŠre version:&lt;br /&gt;
            ADD.W     D0,D1;&lt;br /&gt;
            MULU.W    #3,D1; &lt;br /&gt;
            SUB.W     #6,D1&lt;br /&gt;
&lt;br /&gt;
   alors que si je fais:&lt;br /&gt;
&lt;br /&gt;
            LEA       VARIANTE,A0&lt;br /&gt;
            MOVE.W    #$C2C0,(A0)+&lt;br /&gt;
            MOVE.L    #$04410008,(A0)+&lt;br /&gt;
            MOVE.L    #$06400004,(A0)+&lt;br /&gt;
&lt;br /&gt;
   j'obtiendrai la seconde version!&lt;br /&gt;
&lt;br /&gt;
   Essayez  avec le programme ci-aprŠs, en le suivant sous MONST: &lt;br /&gt;
   Note: ce programme n'a pas de fin donc quitter avec Control+C:&lt;br /&gt;
&lt;br /&gt;
            LEA       VARIANTE,A0&lt;br /&gt;
            MOVE.W    #$D240,(A0)+&lt;br /&gt;
            MOVE.L    #$C2FC0003,(A0)+&lt;br /&gt;
            MOVE.L    #$04410006,(A0)+&lt;br /&gt;
&lt;br /&gt;
            LEA       VARIANTE,A0&lt;br /&gt;
            MOVE.W    #$C2C0,(A0)+&lt;br /&gt;
            MOVE.L    #$04410008,(A0)+&lt;br /&gt;
            MOVE.L    #$06400004,(A0)+&lt;br /&gt;
&lt;br /&gt;
            MOVE.W    #23,D0&lt;br /&gt;
            MOVE.W    #25,D1&lt;br /&gt;
   VARIANTE MULU.W    D0,D1&lt;br /&gt;
            SUB.W     #8,D1&lt;br /&gt;
            ADD.W     #4,D0&lt;br /&gt;
            MOVE.W    D1,D5&lt;br /&gt;
            END&lt;br /&gt;
&lt;br /&gt;
   Remarques: Il  est tout … fait possible d'envisager plus de 2 ver-&lt;br /&gt;
   sions d'une mˆme partie de programme. Si les tailles de ces diff‚-&lt;br /&gt;
   rentes  versions diffŠrent, ce n'est pas grave car il est toujours&lt;br /&gt;
   possible  de combler avec des NOP. Les applications de ce genre de&lt;br /&gt;
   'ruse' peuvent ˆtre assez nombreuses: raccourcissement de program-&lt;br /&gt;
   mes, rapidit‚  (une  routine  devant  ˆtre appel‚e 15000 fois aura&lt;br /&gt;
   tout  int‚rˆt  …  ˆtre  modifi‚e avant, au lieu d'y incorporer des&lt;br /&gt;
   tests, par exemple), modifications al‚atoires des routines de pro-&lt;br /&gt;
   tection  (un  coup, j'en mets une en place la prochaine fois, j'en&lt;br /&gt;
   mettrai une autre...)....&lt;br /&gt;
&lt;br /&gt;
   Faites cependant bien attention, car une erreur d'un chiffre et le&lt;br /&gt;
   nouveau code mis en place ne voudra plus rien dire du tout! Faites&lt;br /&gt;
   ‚galement  attention  …  vos  commentaires  car l…, ils deviennent&lt;br /&gt;
   hyper  importants, ‚tant  donn‚  que le listing que vous avez sous&lt;br /&gt;
   les yeux ne sera pas forc‚ment celui qui sera ex‚cut‚!!!!!!!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Back to [[ASM_Tutorial]]&lt;br /&gt;
[[Category: ASSEMBLEUR 68000 sur ATARI ST Part 1 ]]&lt;/div&gt;</summary>
		<author><name>&gt;Zorro 2</name></author>
	</entry>
</feed>