home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / asm_programming / GEMA_FRA.DOC < prev    next >
Text File  |  1995-12-06  |  37KB  |  1,030 lines

  1.  
  2.                                      -(G)-(E)-(M)-(A)-
  3.                             [G]enPC [E]lite [M]acro [A]ssembler
  4.  
  5.                               (C)oderite SECTOR ONE 1994-95
  6.  
  7.                          Documentation francaise de la version 2.5
  8.  
  9.  
  10. I. Introduction
  11.     1. Shareware
  12.     2. Credits
  13.     3. Greetings
  14.  
  15. II. Generalites
  16.     1. Modes d'adressage
  17.     2. Arithmetique
  18.     3. Directives d'assemblage
  19.  
  20. III. Mnemoniques
  21.  
  22.  
  23. IV. Conclusion
  24.                                           --==--
  25.  
  26. I. Introduction
  27. _______________
  28.  
  29.  
  30.         GenPC alias GEMA est un nouvel assembleur symbolique pour MS-DOS. Il est
  31. tres largement inspire de la reference en matiere d'assembleur : GenST sur Atari. De
  32. plus les normes et mnemoniques Intel ont etees un peu adaptes a la norme Motorola 680x0
  33. qui est beaucoup plus simple et logique. Contrairement a TASM qui se donne un style
  34. pseudo-structure qu'on doit trainer comme un boulet, qui buggue a mort sur les
  35. instructions 386+, et qui ne nous laisse pas vraiment controler l'assemblage des
  36. mnemoniques, GEMA vous laisse libre de coder comme des porcs et doit bugger un peu
  37. moins. Il supporte desormais tous les opcodes des processeurs Intel, du 8086 au P6, y
  38. compris les opcodes non documentes !
  39.     De plus il est beaucoup plus rapide que TASM, ne necessite pas de linker, et
  40. possede des directives d'assemblages tres pratiques, en particulier le INCBIN qui a
  41. toujours fait atrocement defaut sur TASM et MASM.
  42.     Si vous ne codez pas encore en assembleur, GEMA est celui qu'il vous faut pour
  43. vous initier a la joie (heu...) des 80x86. De plus vous n'aurez aucun mal a passer au
  44. 680x0 par la suite.
  45.     Si vous codez deja en 680x0 vous n'aurez pas a vous prendre la tete pour
  46. ingurgiter les bizarreries d'Intel et ne serez pas degoutes que TASM soit aussi lourd a
  47. utiliser que les 80x86 sont complexes.
  48.     Si vous codez deja en 80x86, vous devez en avoir marre de TASM et MASM. GEMA
  49. est l'assembleur qu'il vous faut ! Il est particulierement adapte a la programmation en
  50. mode flat (V86) ou protege et est tres simple a utiliser en 32-bits contrairement aux
  51. assembleurs cites precedemment.
  52.     Un environnement avec un editeur sympa du style Borland C++ et la possibilite
  53. d'assembler et de debugguer directement en memoire, est en finition.
  54.  
  55.  
  56. I.1 Shareware
  57. _____________
  58.  
  59.  
  60.     GEMA est un SHAREWARE. L'installer sur votre disque dur implique de votre part
  61. l'acceptation des conditions suivantes :
  62.  
  63.     - Si vous travaillez au Centre de Facturation et de Recouvrement de France-
  64. Telecom a Savigny, vous devez faire sauter ma derniere facture, ainsi que les suivantes
  65. si possible,
  66.  
  67.         - Si vous aimez le COBOL vous devez vous tirer une balle,
  68.  
  69.     - Si vous etes surveillant a l'Epita, vous ne devez pas m'accuser a tort de
  70. gruger pendant les interros,
  71.  
  72.     - Si vous etes un coder, graphiste, zikos ou courrier solitaire, vous devez
  73. entrer dans Sector One,
  74.  
  75.         - Si vous etes une jeune fille d'une vingtaine d'annees, vous devez
  76. etre folle amoureuse de moi,
  77.  
  78.         - Si vous pouvez avoir du matos pas cher, vous devez m'en faire part,
  79.  
  80.     - Si vous trouvez des bugs vous devez aussi m'en faire part,
  81.  
  82.     - Si vous n'en trouvez pas c'est que vous ne l'avez jamais utilise, c'est mal,
  83.  
  84.     A propos, cette version n'est qu'une beta donc si il reste des bugs c'est normal
  85. mais n'hesitez pas a me les signaler en precisant bien ce que vous avez fait, ce qui
  86. aurait du se passer et ce que vous avez a la place, ainsi que la date de votre version de
  87. GEMA.
  88.     Les points suivants en particulier ne fonctionnent pas encore (c'est pas un bug
  89. c'est la flemme), mais ne sauraient tarder :
  90.  
  91.     - Instruction CMPXCHG que je n'ai jamais reussi a assembler avec TASM,
  92.  
  93.         - Macros : uniquement presentes dans les versions enregistrees :
  94.  
  95.         Si vous desirez vous enregistrer en tant qu'utilisateur legal de GEMA, envoyez
  96. la modique somme de 50 F a l'adresse figurant plus bas. Vous beneficierez alors des
  97. avantages suivants :
  98.  
  99.         - Vous aurez bonne conscience,
  100.  
  101.         - Vous encouragerez l'auteur a continuer de coder des sharewares,
  102.  
  103.         - Vous recevrez en avant-premiere les mises a jour par InterNet ou par courrier,
  104.  
  105.         - Votre nom ou pseudo sera cite dans les prochaines versions.
  106.  
  107.         Ca me ferait aussi tres plaisir de recevoir des programmes codes avec GEMA...
  108.  
  109. I.2 Credits
  110. ___________
  111.  
  112.  
  113.         Assembleur : Doc, code, gfx (Heu...), musique (Ou ca ?) ...... Jedi/Sector One
  114.         Support moral : .................................................... Stephanie
  115.         Correction des fautes d'orthographe de la doc francaise ................ Mogar
  116.         Softs utilises : Qedit, Gema, Hacker's View, DJGPP
  117.         Beta-testeurs : MJS, Altomcat/Sector One, ODC/Sector One,
  118.                         Createur/Eko, Oxygene, Keops/Equinox,
  119.                         Alexey Voinov
  120.  
  121.     Vous pouvez nous contacter a l'adresse suivante :
  122.  
  123.                 Frank DENIS
  124.         2, Rue Madeleine Laffite
  125.                 F-93100 MONTREUIL
  126.  
  127.     Ou sur RTEL, bal SECTOR ONE, JEDI/SECTOR ONE ou ODC,
  128.  
  129.         Ou par Email : j@nether.net
  130.         Vous pouvez recevoir la derniere version de l'assembleur par InterNet en
  131. envoyant un E-Mail avec le sujet GET GEMA a l'adresse precedente, ou par ftp sur
  132. ftp.nether.net dans le repertoire /pub/dos-windows/gema* . Il est aussi disponible en
  133. telechargement gratuit sur ACE BBS au [+33] (1) 45 88 75 48 et par FidoNet avec le
  134. mot-cle GEMA sur la node 2:320/305. Vous pouvez aussi le telecharger par Minitel au
  135. prix d'un simple appel sur Paris sur RTC-One au (1) 48 70 10 29 ou (1) 48 58 46 17
  136. ( acces V34 possible au (1) 49 88 76 91 ) . GEMA doit trainer sur d'autres BBS et
  137. FTP mais c'est avec les moyens precedents que vous avez le plus de chances d'avoir
  138. la derniere version le plus rapidement possible.
  139.  
  140.         Mais par pitie ne me telephonez pas...
  141.  
  142.  
  143. I.3 Greetings
  144. _____________
  145.  
  146.  
  147.     Un gros bisou a : Infiny (LCA), Eclipse (Hacker Croll), CyberPunk (qui m'a tout
  148. appris d'Unix et du C), Gerald (merci pour les bouquins sur le C++), Trash, Dream
  149. Syndicate, Underground Tectonics (Sexo, Online, Clocky), Eko (Maxx, McDo, Createur),
  150. Eagles (Ard), Equinox (Checksum, Al Cool, Keops), Lego System (Skill),
  151. Dune (Meerclaw, Evil Metal, Chuck, Floopy...), Fantasy (Deneb, Remalon : Hep faut vous
  152. mettre a l'asm), Genesis (Lachez le TP), DBA (Bonus Software), Sentry (Eagle), Isiolis,
  153. Imphobia, Dead Hacker Society, Control Team, Quicky, Anixter, Fantasy, Live!,
  154. Fongus, Bresil, DSK, Alexey Voinov, et a vous...
  155.  
  156.         Une liste plus complete est disponible dans la version anglaise de la doc.
  157.  
  158. II. Generalites
  159. _______________
  160.  
  161.  
  162.         GEMA necessite un 386, un 486, un Pentium ou un P6 (32 bits oblige). Il prend un
  163. ou deux parametres qui sont le nom du fichier source et eventuellement le nom du fichier
  164. executable.
  165.  
  166.         Genre : gema youpla.s
  167.            ou : gema youpla.s yahoga.exe
  168.  
  169.         Si il n'y a pas de second parametre, le fichier cree sera le nom du fichier
  170. source avec l'extension EXE ou COM.
  171.  
  172.         Quelques options peuvent preceder les noms de fichiers :
  173.  
  174.         -E ou --preprocess : affiche chaque ligne traitee
  175.         -v ou --verbose    : affichage etendu
  176.         -q ou --quiet      : affichage reduit
  177.         -o ou --optimize   : optimisations automatiques ( 3 passes necessaires )
  178.         -nw ou --nowarning : n'affiche plus les warnings
  179.         -86, -88, --cpu=86 ou --cpu=88,
  180.         -186 ou --cpu=186,
  181.         -286 ou --cpu=286,
  182.         -386 ou --cpu=386,
  183.         -486 ou --cpu=486,
  184.         -586, -pentium, --cpu=586 ou --cpu=pentium,
  185.         -686, -p6, --cpu=686 ou --cpu=p6 : assemble uniquement les opcodes
  186. reconnus par le type de processeur designe. Par default, toutes les instructions
  187. du 8086 au p6 sont reconnues.
  188.  
  189.  
  190. II.1 Modes d'adressage
  191. ______________________
  192.  
  193.  
  194.     Les modes d'adressage sont au format Motorola 680x0, a savoir :
  195.  
  196.     Designation        Intel            GEMA
  197.     ------------------------------------------------------------------
  198.     Immediat court        12            #12.b
  199.     Immediat (mot)        32000            #32000.w
  200.     Immediat (mot long)     99999            #99999.l
  201.  
  202.     .b, .w et .l sont facultatifs, il permettent en fait de forcer un
  203. type, par exemple pour faire reconnaitre une valeur qui se coderait sur un octet comme
  204. un mot long, indispensable pour le code automodifiant. Si on ne precise pas la taille,
  205. GEMA determine automatiquement la plus petite.
  206.  
  207.     Designation        Intel            GEMA
  208.     ------------------------------------------------------------------
  209.     Direct            Ah, Bx, Ecx, Si, Cs    Ah, Bx, Ce, Si, Cs
  210.  
  211.     Sous GEMA, les registres ont la meme designation que sous TASM en dehors des
  212. registres 32-bits qui sont de la forme : Ae, Be, Ce, De, Sie, Die, Bpe et Spe. C'est
  213. plus logique comme ca. MAIS dans la plupart des cas, les seules lettres A, B, C ou D
  214. suffisent. Car comme en 680x0, c'est dans l'instruction qu'on determine la taille des
  215. operandes et GEMA adapte les operandes automatiquement.
  216.  
  217.     Ainsi :    NEG.B A sous GEMA equivaut a NEG AL sous TASM
  218.  
  219. Par defaut une instruction .B sur un registre indetermine equivaut a AL,BL,CL ou DL. Si
  220. c'est AH, BH, CH ou DH, il faut evidemment mettre le registre complet,
  221.     Ex: NEG.B AH
  222.  
  223.         NEG.W A sous GEMA equivaut a NEG AX sous TASM
  224.  
  225.     Sauf pour les instructions qui ne prennent pas de mots comme operandes, la taille
  226. par defaut est le mot. Par consequent NEG.W A ou NEG A sont identiques. C'est valable
  227. pour la quasi-totalite des instructions.
  228.  
  229.         NEG.L A sous GEMA equivaut a NEG EAX sous TASM
  230.  
  231.     Dans tous les cas on peut bien entendu mettre le registre en entier a la place du
  232. registre indetermine. Par exemple NEG.L EAX marche impec. Par contre NEG.L AX va vous
  233. balancer une erreur car la taille du registre est incoherente avec la taille de
  234. l'instruction.
  235.  
  236.     Si vous trouvez que c'est plus complique de preciser la taille dans l'instruction
  237. que de la sous-entendre avec la taille des operandes, vous n'avez rien compris a la vie.
  238.     Car d'une part c'est plus clair comme ca, d'autre part vous n'avez pas a vous
  239. taper des WORD PTR et autres en cas d'ambiguite.
  240.  
  241.     Ainsi :    NEG.L (SI,DI) sous GEMA equivaut a NEG DWORD PTR [SI+DI] sous TASM
  242.  
  243.     Ah tiens j'allais oublier ... A la place de .b vous pouvez utiliser .s c'est
  244. pareil ... C'est juste histoire de rester dans les normes de GenST.
  245.  
  246.         Designation        Intel            GEMA
  247.     ------------------------------------------------------------------
  248.     Absolu court            [12]            12.b
  249.     Absolu (mot)            [32000]            32000.w
  250.     Absolu long            [99999]            99999.l
  251.  
  252.     La encore les .b .w et .l sont facultatifs, ils ne sont utiles que pour forcer
  253. un type. Autrement l'assembleur les determine tout seul comme un grand. Sous GEMA comme
  254. en 680x0, et etant donne que l'immediat est prefixe, une adresse absolue n'a pas de
  255. prefixe. C'est aussi valable pour les labels :
  256.  
  257.     NEG label sous GEMA equivaut a NEG WORD PTR [label] sous TASM.
  258.  
  259.         Designation        Intel            GEMA
  260.     ------------------------------------------------------------------
  261.     Indirect            [Si]            (Si)
  262.     Indirect avec registre        [Si+Bx]            (Si,Bx) ou (Si,B)
  263.  
  264.     La taille par defaut des registres d'index indetermines est un mot.
  265.  
  266.         Designation        Intel            GEMA
  267.     ------------------------------------------------------------------
  268.     Indirect avec reg et offset.b    [Si+Bx+12]        12.b(Si,Bx)
  269.     Indirect avec reg et offset.w    [Si+Bx+32000]        32000.w(Si,Bx)
  270.     Indirect avec reg et offset.l    [Esi+Ebx+99999]        99999.l(Sie, Be)
  271.  
  272.     Comme d'habitude les .b .w et .l sont pour le forcage uniquement.
  273.     Par exemple 12(Si,Bx) est strictement equivalent a 12.b(Si,Bx). C'est donc
  274. inutile de le preciser la plupart du temps, on peut balancer l'offset tel quel, GEMA se
  275. debrouillera.
  276.  
  277.         Designation        Intel            GEMA
  278.     ------------------------------------------------------------------
  279.     Indirect reg/off/facteur    [Esi+Ebx*facteur+off]    off(Sie,Be*facteur)
  280.  
  281.     Bon la je precise pas mais l'offset ca peut etre un .b un .w ou un .l comme au
  282. dessus ... Au passage le facteur ne marche qu'avec des registres 32-bits ainsi que les
  283. offsets longs ...
  284.  
  285.     L'ARGUMENT SOURCE EST TOUJOURS LE PREMIER, L'EVENTUEL ARGUMENT DESTINATION
  286. TOUJOURS APRES.
  287.  
  288.     Ainsi sous GEMA, pour mettre le contenu de AX dans BX il faut faire :
  289.  
  290.     MOVE A,B (ou MOV A,B) et non pas l'inverse comme dans TASM.
  291.  
  292.     Evidemment pour des instructions genre ENTER ou il n'y a pas d'argument source
  293. et destination, l'ordre est le meme que dans TASM. Pour toutes les autres c'est au
  294. format motorola soit l'inverse de TASM.
  295.  
  296. II.2. Arithmetique
  297.  
  298.     Tous les operateurs classique sont utilisables pour les offsets et immediats.
  299.     Par ordre de priorite decroissante (Ouaip ca gere meme les priorites) :
  300.  
  301.     []: Ce sont les parentheses ...
  302.         - : Oppose d'un nombre
  303.     < : Decalage gauche. Ex : 3<2 renvoit 12
  304.     > : Decalage droit. 6>1 renvoit 2
  305.     ^ : OU exclusif
  306.     & : ET logique
  307.     | : OU logique
  308.     / : Division
  309.     * : Multiplication
  310.     - : Soustraction (Ouaip il distingue les deux types de '-')
  311.     + : Addition
  312.     % : Modulo
  313.     = : Egalite : renvoit 0 si fausse et 1 si vraie.
  314.         @ : Divise par 16 ce qui suit. Par exemple @Toto donne l'offset de segment du
  315. Label Toto. Les @ sont accumulables, par ex @@Toto renvoit Toto divise par 256.
  316.         ~ : NON logique
  317.         \ : Retourne l'adresse de segment ce qui suit. La valeur sera forcement traitee
  318. comme un mot et sera relogee si le programme est un .EXE . C'est un peu l'equivalent du
  319. prefixe SEG sous MASM et TASM.
  320.         : : (Oui c'est le signe ':')
  321.             Versions < 2.5b : retourne les 4 bits de poids faibles de ce qui
  322. suit, un peu comme le prefixe OFFSET de MASM et TASM.
  323.             Versions >=2.5b : retourne ce qui suit modulo la taille de segment
  324. courante. Ceci a ete modifie par soucis de compatibilite avec A2G. Cet operateur n'a en
  325. pratique pas grand interet ...
  326.  
  327.     Exemple: 2+3*4/[-5-7]<[~3^5]
  328.  
  329.     En dehors des nombres on peut utiliser bien d'autres choses au sein d'operations
  330. arithmetiques :
  331.  
  332.     * : L'asterisque peut aussi representer l'adresse de l'instruction, ou tout au
  333. moins son offset par rapport au debut du programme.
  334.  
  335. {    Exemple :
  336.  
  337.         bra.s *    equivaut a :
  338.              toto jmp toto }
  339.  
  340.  
  341.         '': Code ASCII d'un ou de plusieurs caractere.
  342.  
  343. {    Exemple :
  344.                 'A' est equivalent a 65.
  345.                 'AB' est equivalent a $4142             }                                                         }
  346.  
  347.     Bases :
  348.  
  349.     Un nombre entre directement est toujours interprete en decimal.
  350.  
  351. {    Exemple :
  352.  
  353.         12 comme ca, c'est en base 10 pour GEMA.    }
  354.  
  355.     Pour l'hexa, il suffit de le faire preceder d'un $ (c'est moins debile qu'un
  356. 'h' a la fin avec quelque fois un 0 au debut pour eviter des confusions).
  357.  
  358. {    Exemple :
  359.  
  360.         Sous GEMA, $ABCD1234 est equivalent a 0ABCD1234h sous TASM.     }
  361.  
  362.     Un nombre binaire doit commencer par un %,
  363.  
  364. {    Exemple :
  365.  
  366.          %101 vaut 5.    }
  367.  
  368.     Un nombre octal doit commencer par un signe 'paragraphe' que je n'ai malheureu-
  369. sement pas sur mon clavier actuel. Bah de toutes facons ca sert a rien l'octal.
  370.  
  371.     On peut bien evidemment faire des operations melangeant plusieurs bases. Le
  372. forcage est possible sur toute expression,
  373.  
  374. {    Exemple :
  375.  
  376.         [1+$12A/%10001001].b  }
  377.  
  378.     Mais peut aussi etre fait sur un seul terme au sein de l'expression,
  379.  
  380. {    Exemple :
  381.  
  382.         $1234.b+1 vaut non pas $1235 mais $35 car le .b a reduit le terme $1234 a un
  383.         octet. }
  384.  
  385.     GEMA peut donc evaluer des operations tordues dans toutes les bases avec des
  386. forcages de types dans tous les sens, no problemo. Les resultats obtenus peuvent etre
  387. utilises n'importe ou en tant que constantes, offsets ou immediats. Mais GEMA ne traite
  388. pas que des nombres, il peut aussi evaluer des symboles.
  389.  
  390.     Symboles :
  391.  
  392.     Il en existe 3 types sous GEMA :
  393.  
  394.     - Les labels.
  395.  
  396.     Le format d'une ligne d'instruction sous GEMA est :
  397.  
  398. [Label]    [Instruction]    [Arguments]    [Commentaire]
  399.  
  400.     Si on declare un label, il faut le faire imperativement en debut de ligne. Les
  401. deux points qui suivent sont facultatifs.
  402.     Une instruction ne doit jamais se trouver en debut de ligne, mais au moins
  403. apres des espaces et/ou tabulations. Une instruction qui se trouve en debut de ligne
  404. sera interpretee comme un LABEL (Oui on peut utiliser des mots reserves comme labels ou
  405. variables, pas de probleme).
  406.         Le commentaire n'a pas toujours besoin d'etre precede d'un point virgule, mais une
  407. ligne de commentaires sans instruction doit commencer (donc a la place du label) par un
  408. asterisque, un point virgule, un pourcent ou un slash.
  409.  
  410. {    Exemples :
  411.  
  412.     Toto    move.l a,b        ceci est un commentaire
  413.         addx (si,bx),c
  414.     Tut
  415.         bra.s Tut        youpla
  416.  
  417.     * Ligne de commentaire
  418.     / Autre ligne de commentaire
  419.  
  420.     Pouet:    nop }
  421.  
  422.  
  423.         Parfois, un point virgule est neanmoins necessaire pour un commentaire
  424. place a la fin d'une ligne d'instruction.
  425.  
  426.         Ainsi :
  427.  
  428.                 rts tititata
  429.  
  430.         cherchera a evaluer tititata, vu que l'instruction rts peut etre utilisee
  431. aussi bien seule qu'avec un argument.
  432.  
  433.         Contrairement a :
  434.  
  435.                 rts ; tititata
  436.  
  437.         Ou tititata sera ignore comme tout bon commentaire digne de ce nom.
  438.  
  439.         On peut mettre des espaces un peu partout, GEMA va les ignorer,
  440.  
  441. {     Exemple :
  442.  
  443.     addx.l 4 + 3 / [ 1 + 2 ] (   sie   ,   be  *  8   )  ,  d }
  444.  
  445.     Par contre on ne met jamais d'espace entre une instruction et un eventuel
  446. indicateur de taille (addx.l et pas addx .  l) .
  447.  
  448.         Le label START est toujours defini comme label nul, il represente le debut du
  449. programme et peut etre utilise par les maniaques au meme titre que NULL en C ...
  450.  
  451.     Un label peut etre utilise au sein d'une expression arithmetique. Il a dans ce
  452. cas pour valeur son offset par rapport au debut du programme, moins la valeur d'ASSUME
  453. (On verra ASSUME plus tard) + la valeur du dernier ORG (Ca aussi on verra plus tard) .
  454.  
  455. {    Exemple :
  456.  
  457.     Toto    move.l #Toto-Tata/2,Toto+2
  458.     Tata    flush }
  459.  
  460.     Un tel label ne peut etre defini qu'une fois dans le source faute de quoi GEMA
  461. vous signalera l'erreur. Il a une valeur constante pendant tout l'assemblage, contrai-
  462. rement aux labels locaux et aux variables.
  463.  
  464.     - Les labels locaux :
  465.  
  466.     C'est pareil que les labels globaux sauf qu'on peut les redefinir. Leur nom doit
  467. commencer par un point. C'est assez utile pour les boucles,
  468.  
  469. {     Exemple :
  470.  
  471.         move #$1234,c
  472.     .wait    dec c
  473.         bne .wait            identique a jnz
  474.  
  475.         ...plein d'instructions...
  476.  
  477.         move a,c
  478.     .wait    nop
  479.         cmps.b
  480.         dbeq .wait            identique a loopnz }
  481.  
  482.     Ils peuvent etre employes au sein d'expressions arithmetiques et ont pour valeur
  483. la derniere fois ou ils ont ete definis avant le calcul.
  484.     On peut aussi leur assigner une valeur constante grace a la directive SET :
  485.  
  486. {    Exemple :
  487.  
  488.     .wait    set    $1234  }
  489.  
  490.     Et zou, le label local .wait vaut $1234. Par contre avant d'etre affecte par la
  491. constante, il vaut la valeur de l'offset de l'instruction comme tout bon label. Et alors
  492. me direz-vous ? Bin si vous faites par exemple:
  493.  
  494. {    .wait    set    .wait+2 }
  495.  
  496.     Vous pouvez faire ca plusieurs fois de suite, .wait va toujours valoir deux
  497. octets de plus que sa derniere declaration. C'est hyper utile pour le code automodifie.
  498.     Imaginons maintenant une autre situation, ou vous devez faire une table des
  499. multiples de 3. On verra plus bas que les instructions REPT...ENDR permettent de
  500. repeter un bout de code et que DC.L permet d'inserer dans l'objet un mot long constant
  501. (comme DD sous TASM). Ce qui serait interessant c'est que .wait vale eventuellement la
  502. valeur de l'endroit ou il se trouve lors de sa premiere declaration, et qu'il ne soit
  503. plus affecte que par la valeur du set par la suite.
  504.     GEMA le permet et ce sont les variables d'assemblage.
  505.  
  506.     - Les variables d'assemblage
  507.  
  508.     Leur nom commence par un point d'exclamation. Elles peuvent etre utilisees
  509. comme les labels. Ce sont des labels locaux qui ne sont affectes par l'offset ou ils se
  510. trouvent qu'au premier assignement. Ainsi pour faire notre table de 3 sur 256 mots
  511. longs.
  512.  
  513. {    Exemple:
  514.  
  515.     !Toto    set 0
  516.         rept 256
  517.         dc.l !Toto
  518.     !Toto      set !Toto + 3
  519.         endr }
  520.  
  521.     Merveilleux non ? Dans une meme expression on peut bien entendu melanger les
  522. trois types de symboles et peut forcer leur type.
  523.  
  524.     Les mots reserves sont utilisables et tous les caracteres sont significatifs.
  525.     Majuscules et minuscules sont differenciees. Les caracteres admis sont les
  526. lettres, les chiffres, l'underscore (_), le point d'exclamation et le point.
  527.  
  528.  
  529. II.3. Directives d'assemblage
  530.  
  531.     Elles se placent en seconde position comme toute instruction.
  532.  
  533.     - REPT <constante>...ENDR
  534.  
  535.     Permet de repeter plusieurs fois un bout de code.
  536.  
  537. {    Exemple:
  538.  
  539.         rept 5
  540.           nop
  541.           xlat
  542.         endr  }
  543.  
  544.     Et zou on aura : nop xlat nop xlat nop xlat nop xlat nop xlat
  545.  
  546.     - SET
  547.  
  548.     Deja vu.
  549.  
  550.     - ORG <constante>
  551.  
  552.     Permet de fixer un offset de base. Bah c'est comme sous TASM ou n'importe quel
  553. assembleur, sauf que sous GEMA vous pouvez en mettre ou vous voulez meme si ca n'a
  554. d'interet qu'au debut d'un programme.
  555.  
  556. {    Exemple :
  557.  
  558.      org $100  (GEMA accepte aussi org #$100) }
  559.  
  560.  
  561.     - TITLE titre
  562.  
  563.     Donne un titre au fichier source en cours. Actuellement inutilise.
  564.  
  565.     - USE16
  566.  
  567.     Indique que le code qui suit sera dans un code en 16 bits par defaut
  568. ( necessite d'employer des prefixes pour les acces 32 bits ) - Par defaut.
  569.  
  570.     - USE32
  571.  
  572.     Le code qui suit est suppose se trouver dans un segment de code en
  573. 32 bits. Ceci n'est possible qu'en mode protege.
  574.  
  575.     - OPT
  576.  
  577.     Active ou desactive certaines options. Prioritaire par rapport aux
  578. options entrees en ligne de commande.
  579.  
  580.         OPT o+ : active les optimizations automatiques
  581.         OPT o- : les desactive
  582.         OPT w+ : active tous les warnings
  583.         OPT w- : desactive tous les warnings
  584.         OPT v+ : mode verbose
  585.         OPT v- : mode abbrege
  586.         OPT q+ : mode silencieux
  587.         OPT q- : mode normal
  588.  
  589.     - INCLUDE <fichier>
  590.  
  591.     Insere le fichier a cet endroit du source et continue la procedure
  592. d'assemblage ( comme #include en C ) . Un source peut en include d'autres qui peuvent
  593. eux-memes en inclure d'autres qui peuvent... Il n'y a pas de limite de profondeur,
  594. mais un controle elementaire de references circulaires est realise. Le nom du fichier
  595. peut etre encadre de ' ou de " ( ou de rien du tout ) .
  596.  
  597.         - ONCE
  598.  
  599.         Comme #pragma once qui est implemente sur la plupart des compilateurs C.
  600. Inclue le fichier uniquement si il ne l'a pas deja ete auparavant.
  601.  
  602.         - INCBIN <fichier>
  603.  
  604.     Voici LA commande qui manque cruellement sur TASM et MASM... Elle permet
  605. d'inclure un fichier binaire au milieu d'un code ... Plus besoin de galerer a faire des
  606. conversions hexa. Pour inserer la photo de votre copine a poil au label 'tut' il suffit
  607. desormais de faire :
  608.  
  609. {    Exemple :
  610.  
  611.         tut    incbin cindy.jpg }
  612.  
  613.     ou
  614.  
  615. {    Exemple :
  616.  
  617.         tut    incbin "cindy.jpg"    c'est pareil... }
  618.  
  619.     - DC
  620.  
  621.     Inclue un octet, un mot, un mot long ou une chaine.
  622.  
  623. {    Exemple :
  624.  
  625.         dc.b 1,2,3,4,"Tototata",'t',10
  626.         dc.w $1234,"tuttut",4 }
  627.  
  628.         Dans ce cas, la chaine est inseree en tant qu'octets comme si on avait
  629. fait :
  630.  
  631. {    Exemple :
  632.         dc.w $1234
  633.         dc.b "tuttut"
  634.         dc.w 4    }
  635.  
  636.     - DS
  637.  
  638.     Inclue un certain nombre d'octets nuls.
  639.  
  640. {     Exemple :
  641.  
  642.     ds.b 4    equivaut a dc.b 0,0,0,0
  643.     ds.l 3    equivaut a dc.l 0,0,0 }
  644.  
  645.         - EVEN, ALIGN, SEGMENT, PAGE, DPAGE, PPAGE
  646.  
  647.     Insere des nops de facon a ce que ce qui suive soit aligne:
  648.  
  649.     EVEN = 2 octets
  650.     ALIGN.B / .W / .L /.Q = Devinez (.Q = Quad)
  651.     SEGMENT = 16 octets
  652.     PAGE = 256 octets
  653.         DPAGE = 512 octets
  654.         PPAGE = 2048 octets
  655.  
  656.         - MIN ou MINI xxx
  657.  
  658.         Taille minimale de RAM necessaire au programme. Exprime en blocs de 16 octets.
  659.  
  660.         - LIMIT xxx ou MAX xxx
  661.  
  662.     Limite la taille maximale d'un .EXE a <xxx> octets. Utile pour les programmes
  663. residents et les overlays. Exprime en blocs de 16 octets.
  664.  
  665.         - OVERLAY xxx
  666.  
  667.         Fixe l'overlay.
  668.  
  669.     - STACK
  670.  
  671.     Indique ou est placee la pile (SS:SP) au debut de l'execution d'un .EXE, ex:
  672.  
  673. {    Exemple:
  674.     header
  675.     * plein d'instructions
  676.     prout    stack
  677.     * plein d'instructions }
  678.  
  679.     - HEADER
  680.  
  681.     Insere le header d'un fichier .EXE avec la table de relocation et tout le bordel.
  682. Generalement c'est toujours la premiere instruction d'un programme ... Mais bon on peut
  683. en mettre n'importe ou, on peut meme en mettre plusieurs (ca peut etre pratique pour des
  684. petits .EXE qui sont inclus dans un autre) ... IMPORTANT: La taille de ces header
  685. n'influe pas sur la taille logique d'un fichier. C'est logique mais bon pour les barges
  686. qui s'amusent a en mettre plusieurs et n'importe ou dans le source, ca peut etre utile.
  687.  
  688.     - ASSUME <Constante>
  689.  
  690.     Permet de fixer la reference par rapport a laquelle sera calculee l'offset de
  691. tous les labels. TASM permet d'"assumer" une valeur differente par rapport a chaque
  692. descripteur de segment. Mouuuaaiiiiss... J'en vois pas trop l'utilite vu qu'on peut faire
  693. ce qu'on veut de nos pointeurs de segment a forciori mais je rajouterai peut-etre cette
  694. possbilite dans la prochaine version.
  695.  
  696.     - FATAL
  697.  
  698.         Arrete l'assemblage et vous ejecte. Ca ne sert absolument a rien (mais c'est
  699. rigolo...)
  700.  
  701.     - SECTION BSS ou simplement BSS
  702.  
  703.     Ce qui suit sera interprete pour calculer les offsets des labels contenus,
  704. mais pas integre dans le programme executable.
  705.  
  706.     - SECTION TEXT, SECTION DATA, TEXT ou DATA
  707.  
  708.     Annule l'effet des directives precedentes.
  709.  
  710.         - REAL ou REALMODE
  711.  
  712.         Indique que la taille de tous les segments qui vont suivre ( a partir de
  713. l'endroit ou se trouve cette directive ainsi qu'apres chaque SEGMENT, PAGE, DPAGE
  714. ou PPAGE ) est de 64Ko, comme c'est le cas par defaut en mode reel. Ces directives
  715. ne servent qu'a produire une erreur dans le cas ou l'on depasserait cette limite.
  716. Elles n'ont pas d'influence sur le code genere.
  717.  
  718.         - UNREAL ou UNLIMIT ou FLAT
  719.  
  720.         Contrairement aux directives precedentes, ce jeu de directives indique que
  721. le code qui suit est dans un segment de taille supposee infinie. Sous GEMA, tous les
  722. segments sont supposes avoir une taille infinie par defaut.
  723.  
  724.         - SEGSIZE <taille>
  725.  
  726.         Les segments qui suivent auront pour taille maximale <taille>.
  727.  
  728.  
  729.         Ces trois ensembles de directives peuvent etre prefixees d'une directive
  730. d'alignement ( SEGMENT, PAGE, DPAGE, PPAGE ) ou servir elles-memes de prefixes a une
  731. instruction quelconque.
  732.  
  733.         Exemple :
  734.  
  735.                 SEGMENT:REAL
  736.  
  737.         est equivalent a :
  738.  
  739.                         SEGMENT
  740.                         REAL
  741.  
  742.  
  743.  
  744.                 SEGSIZE 4096:PAGE
  745.  
  746.         est equivalent a :
  747.  
  748.                         SEGSIZE 4096
  749.                         PAGE
  750.  
  751.  
  752.         Dans ces deux cas, l'ordre n'a absolument aucune importance. Ainsi
  753. DPAGE:UNREAL aura le meme effet que UNREAL:DPAGE .
  754.  
  755.         Ces directives ne sont generalement utiles qu'en mode reel ou protege avec
  756. des segments de tailles folkloriques. Dans tous les autres cas, elles sont inutiles,
  757. GEMA ne travaillant normalement qu'avec des segments infinis.
  758.  
  759.  
  760. III. Mnemoniques
  761. ________________
  762.  
  763.  
  764.     Toutes (a part deux) les mnemoniques de TASM peuvent etre utilisees telles
  765. quelles sous GEMA, y compris tous les synonymes (JZ et JE par exemple). Les instructions
  766. qui different sous TASM et MASM (exemple XLAT et XLATB) sont accessibles sous les deux
  767. formes par GEMA et ont bien entendu le meme effet.
  768.     Mais il y a de nouveaux synonymes, qui sont pour la plupart les equivalents
  769. 680x0. Il y a aussi des formes plus logiques.
  770.     La liste qui suit represente quelques instructions synonymes et celles qui
  771. necessitent un commentaire :
  772.  
  773.     LEAVE = UNLINK
  774.     MOV = MOVE
  775.     MOVSX = MOVESX
  776.     MOVZX = MOVEZX
  777.     TRAPV = INTO
  778.     WINBD = FLUSH
  779.     TRAP = INT
  780.  
  781. Tolere des absolus. Par exemple TRAP #14 est identique a TRAP 14 ou INT 14.
  782.  
  783.         RTED = RTID = IRETD
  784.         RTE = RTI = IRET
  785.     BRAF ~ JMPF
  786.  
  787. JMPF est la version FAR de JMP. Il prend deux arguments qui sont respectivement le
  788. segment et l'offset, exemple JMPF $14c9,$418db2a.
  789. Mais comme on utilise bien souvent un Far Jump avec l'adresse d'un label ou une adresse
  790. absolue et qu'il est alors lourd de faire JMPF \label,:label , il vaut mieux utiliser
  791. BRAF qui est exactement comme JMPF en dehors du fait qu'elle ne prend qu'un seul
  792. argument qui est une adresse 32-bits qu'elle se debrouille pour convertir en segment et
  793. offset. Par exemple BRAF $12345 equivaut a JMPF $1234,5
  794.  
  795. Ces instructions peuvent etre utilisees en word ou en long (sur 386+ uniquement).
  796.  
  797.     BRA ~ JMP
  798.  
  799. BRA est exactement comme JMP sauf qu'en toute logique, JMP label sous GEMA equivaut a un
  800. JMP [label] sous TASM, ce qui signifie un saut a l'adresse contenue dans label et non pas
  801. un saut a label.Toujours en toute logique, il conviendrait de faire JMP #label. Et c'est
  802. effectivement ce qu'il faut faire avec JMP. Mais etant donne qu'on fait beaucoup
  803. plus souvent des JMP #label que des JMP label, mieux vaut utiliser BRA qui est identique
  804. sauf dans ce mode d'adressage. BRA label equivaut a BRA #label ou JMP #label. En dehors
  805. de ce mode d'adressage, BRA peut prendre tous les arguments qu'encaisse un JMP, par
  806. exemple BRA (si,dx) . Un BRA ou un JMP peut etre suivi de .s ou .b s'il est court, ou de
  807. .l s'il doit s'effectuer en 32-bits (en mode protege uniquement sinon vous allez avoir
  808. des surprises a moins de defragmenter la Ram avant et de proteger un segment, par exemple
  809. via l'interface DPMI de QEMM... Mais c'est une autre histoire...) .
  810.     REP = REPE = REPZ
  811. Les prefixes du type REP et les prefixes de segment CS DS etc... peuvent etre utilises
  812. de deux manieres :
  813.  
  814. Soit independemment sur une ligne, ils sont alors consideres comme des instructions a
  815. part entiere.
  816.  
  817. Soit en tant que prefixes qui doivent alors comme tout bon prefixe PRECEDER
  818. l'instruction. Ils doivent alors etre suivis de deux points (dans le cas precedent, pas
  819. de deux points, ca m'enerve de mettre des deux points alors qu'il n'y a rien derriere)
  820.  
  821. {    Exemple :
  822.  
  823.     toto    ds
  824.         gs:move.l (si),a
  825.         rep  : outs.b
  826.         repne
  827.         ins.l }
  828.  
  829. Comme on peut le voir, on peut mettre des espaces a cote des deux points, comme
  830. d'habitude ca pose aucun probleme.
  831.  
  832.     HLT = STOP
  833.     XOR = EOR
  834.     CMC = NGC
  835.     CLD = D+    ('+' comme : incremente)
  836.         STD = D-        ('-' comme : decremente)
  837.     CLI = INTOFF
  838.     STI = INTON    (Les coders en Saturn apprecieront)
  839.     ADDX = ADC
  840.     BS+ = BSF    (pareil, c'est plus clair de mettre + que (F)orward)
  841.     BS- != BSR
  842.  
  843. ATTENTION, BSR N'A PAS LE MEME SENS SOUS GEMA QUE SOUS TASM ET MASM
  844.  
  845. En effet il est utilise pour appeller des sous-programmes comme nous le verrons plus bas
  846. par consequent pour scanner les bits a l'envers, il faut faire BS- imperativement.
  847.  
  848.     BTSTC = BTSTN = BTC
  849.     BTSTR = BTR
  850.     TAS = BTS = BTSTS
  851.     BTST = BT
  852.     (BSRF = JSRF) ~ CALLF
  853.  
  854. C'est la version Far de Call. Le principe est le meme que pour JMPF et BRAF sauf que
  855. les instructions qui ne prennent qu'un argument sont BSRF et JSRF, l'instruction CALL
  856. FAR telle que nous la connaissions reste logiquement CALLF.
  857. C'est parfaitement ridicule de declarer les sous-programmes avec PROC NEAR ou FAR machin
  858. en assembleur. L'assembleur est fait pour ceux qui codent comme des porcs pour faire
  859. cracher les tripes de leur becanes et pas par des abrutis revant au PASCAL et au
  860. COBOL ou autres LOGO. Par consequent sous GEMA vous faites BSRF ou BSR suivant le type
  861. d'appel que vous voulez, au moins vous savez comment ca va etre assemble.
  862.  
  863.     (BSR = JSR) ~ CALL
  864.  
  865. Version near de CALL. Memes remarques que pour les BRA et JMP.
  866.  
  867.      RTS = RTN
  868.     RTSF = RTNF
  869.  
  870. Retour d'un sous programme near ou far. Peuvent etre suivis d'un immediat.
  871.  
  872.     EXTA.Q = EXT.Q = CDQ
  873.     EXTA = EXT ou EXT.W = CBW
  874.     CWD = EXT.L = EXTA.L
  875.     DIVS = IDIV
  876.     DIVU = DIV
  877.     LINK = ENTER
  878.     WAIT = FWAIT (Microsoft/Borland)
  879.     MULS = IMUL
  880.     MULU = MUL
  881.     INS, OUTS, MOVES, LODS et compagnie :
  882.  
  883. Les instructions sur les strings doivent suivre la logique de GEMA, a savoir
  884. l'instruction suivie eventuellement de la taille, avec .W par defaut.
  885. Ainsi au lieu de OUTSD sous TASM, il suffit de faire OUTS.L.
  886.  
  887.     BHI = JNBE
  888.     BCC = JAE = JNB = JNC
  889.     BCS = JNAE
  890.     BLS = JBE = JNA
  891.     BGE = JGE = JNL
  892.     BVC = JNO
  893.     BLT = JNGE
  894.     BLE = JLE = JNG
  895.     BCXZ = JCXZ
  896.     BEQ = JE = JZ
  897.     BGT = JNLE
  898.     BECXZ = JECXZ = JCEZ = BCEZ
  899.     BPL = JNS
  900.     BNE = JNE = JNZ
  901.     BPO = JPO = JNP
  902.     BVS = JO
  903.     BPE = JPE = JP
  904.     BMI = JS
  905.  
  906. J'en ai peut-etre oublie, mais sont equivalentes :
  907.  
  908. Toutes les equivalences reconnues par MASM et TASM
  909. Leurs equivalents Motorola.
  910.     SETxx = Sxx
  911. C'est comme au dessus ... Par exemple SZ c'est identique a SEQ ... Tous les synonymes
  912. Microsoft, Borland et Motorola sont reconnus.
  913.  
  914.     LOOPE = LOOPZ = DBEQ
  915.     LOOPNE = LOOPNZ = DBNE
  916.     LOOP = DBF = DBRA
  917.     ROXL = RCL
  918.     ROXR = RCR
  919.     SAHF = SAF
  920.     ASL = SAL = SHL (L'instruction SAL n'existe donc pas sur un 486 ! C'est du
  921. pipeau !!!)
  922.     ASR = SAR = SHR
  923.     SUBX = SBB
  924.     XLAT = XLATB
  925.  
  926.     Evidemment quelque soit les synonymes choisis, les modes d'adressage gardent
  927. toujours la norme GEMA :
  928.     Dans les cas ou un immediat est systematiquement attendu, on peut se
  929. permette de ne pas mettre de #,
  930.     Lorsque la taille des registres depend de l'instruction (95% des cas) on peut
  931. utiliser des registres indetermines,
  932.     Lorsqu'un argument source et un argument cible sont en jeu, ils doivent toujours
  933. etre dans cet ordre respectif.
  934.     Les instructions qui possedent une variante 32-bits doivent etre activees par .L
  935. ou le sont automatiquement lorsqu'il s'agit d'immediats ou d'offsets constants 32-bits.
  936.  
  937.     Quoi qu'il en soit, lorsqu'il n'y a pas d'ambiguite possible, GEMA reconnait un
  938. certain nombre d'abus (comme le INT 14 qui devrait normalement n'accepter que INT #14),
  939. et dans tous les cas les solutions les plus logiques sont rentenues. En cas de probleme
  940. il y a tout plein de messages d'erreurs et de warnings assez precis.
  941.  
  942.         AAM et AAD
  943.  
  944.         Ces instructions peuvent etre suivies d'un nombre immediat (avec ou sans le #)
  945. et permettent une decomposition selon n'importe quel diviseur (et non pas seulement 10).
  946. Cela marche sur tous les processeurs actuels, mais n'est pas documente.
  947.  
  948.         SALC
  949.         ICEBP = ICE01 = TRAP01
  950.         UMOV = UMOVE
  951.         LOADALL
  952.  
  953.         Instructions non documentees des 386+. Voir www.x86.org pour plus d'informations.
  954. Tous ces opcodes sont implementes dans GEMA, mais un warning a lieu lorsque l'option
  955. verbose (-v ou --verbose) est activee.
  956.  
  957.         CMOV = CMOVE
  958.         RDPMC
  959.         UD
  960.         UD2
  961.  
  962.         Nouvelles instructions du P6, implementees dans GEMA. UD et UD2 semblant
  963. fonctionner sur tous les processeurs, ils ne generent jamais de warning.
  964.  
  965.  
  966.  
  967.  
  968.         Voici un exemple de programme tres complexe et original puisqu'il affiche la
  969. phrase "Hello world !" ...
  970.  
  971. {       org $100
  972.  
  973.     push cs
  974.         pop ds                          ds = cs
  975.         move #plouf,d                   offset de plouf dans dx
  976.         move.b #9,ah                    9 dans ah
  977.         trap #$21                       appel de l'exception $21
  978.         move #$4c00,a                   exit(0)
  979.         trap #$21                       et hop
  980. plouf   dc.b "Hello world !",13,10,'$'  le texte a afficher     }
  981.  
  982.         Oh miracle quand on assemble ce petit bout de code on obtient un fichier COM
  983. qui affiche avec la fonte immonde du DOS un truc dans une langue etrangere...
  984.  
  985.         Voici une autre version beaucoup plus longue et sans interet. Mais elle
  986. contient la structure d'un programme executable complexe. La moitie des instructions
  987. est inutile pour afficher un texte, mais si vous attaquez des choses un peu plus
  988. serieuses elles vous semblera beaucoup plus interessante.
  989.  
  990. {       header                          cree un fichier .EXE et non un .COM
  991.         overlay $1234                   numero d'overlay (inutile)
  992.         min 1+@fin                      memoire minimum necessaire (inutile)
  993.         max 1+@fin                      ici pareil que la memoire maximum
  994.  
  995.         move cs,a                       adresse de segment code
  996.         move a,ds                       ...dans ds
  997.         move.b #9,ah                    fonction 9
  998.         move #plouf,d                   offset du label plouf dans DX
  999.         trap #$21                       appel de l'exception
  1000.         move #$4c00,a                   code de fin de programme DOS
  1001.         trap #$21                       qu'on appelle
  1002. plouf   dc.b "Hello world !",13,10,'$'  texte a afficher
  1003.  
  1004.         segment                         alignement a un multiple de 16
  1005.         ds.l 128                        128 mots longs d'espace pour la pile
  1006. fin     stack                           defini la nouvelle pile }
  1007.  
  1008.         Si malgre tout certaines choses vous semblent encore obscures n'hesitez pas a me
  1009. contacter, la solution la plus rapide etant par E-Mail a l'adresse : j@nether.net
  1010.  
  1011. IV. That's all folks
  1012.  
  1013.     J'espere que vous arriverez a utiliser ce fabuleux (n'ayons pas peur des mots)
  1014. outil et que vous en verrez l'interet par rapport a TASM et MASM... Toutes vos
  1015. suggestions, critiques, remarques et bug-reports seront les bienvenus...
  1016.  
  1017.  
  1018. (Note du correcteur: Demandez lui encore et encore de completer sa doc au maximum, en
  1019. lui foutant un paquet d'exemples etc etc ... -flemmard comme il est il ne le fera
  1020. surement pas sinon- a vous de jouer !
  1021.                             Mogar Slayer Of Potatoes)
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.