Assembleur i8086

Philippe Preux IUT Informatique du Littoral Ann´e universitaire 95 – 96 e

1

Avertissement
Ce document d´crit le langage d’assemblage ´tudi´ et utilis´ dans le cadre des TP d’architecture. Il est e e e e avant tout ` consid´rer comme un manuel de r´f´rence. Il ne s’agit pas d’en effectuer une lecture s´quentielle a e ee e du d´but ` la fin. Les chapitres 1, 2 et 4 pr´sentent les principes de base. Les chapitres 3 et 5 sont ` utiliser e a e a en cas de besoin. Le chapitre 6 pr´sente des ´tudes de cas montrant comment ´crire un programme en e e e assembleur, depuis la sp´cification du probl`me, jusqu’` son ex´cution. e e a e Une r`gle d’or (valable pour la programmation en assembleur mais aussi dans n’importe quel langage et e mˆme en toute g´n´ralit´ en informatique) : e e e e L’ordinateur ne se trompe jamais : il ne fait que ce qu’on lui demande de faire. Aussi, la programmation en assembleur ´tant quelque peu subtile, il s’agit de r´fl´chir avant de commencer e e e a ` taper un programme, de continuer ` r´fl´chir pendant qu’on le tape, ` poursuivre l’effort pendant qu’on a e e a l’assemble et que l’on corrige les erreurs de syntaxe, et de ne pas se laisser aller quand enfin, on en arrive ` son a ex´cution qui donnera rarement le r´sultat attendu du premier coup avant une bonne p´riode d’entraˆ e e e ınement. Pendant tout ce temps, rappelez-vous la r`gle d’or et gardez votre calme. Ca ne sert ` rien de s’´nerver : e ¸ a e l’ordinateur a tout son temps et c’est lui qui (( d´cide )) si votre programme marche ou pas ! e On se reportera au document intitul´ (( M´thodologie de programmation en assembleur )) o` est d´cortie e u e qu´e la mani`re de concevoir et d’´crire des programmes en assembleur. e e e Afin de simplifier l’expos´ qui suit, nous nous en sommes tenus ` la programmation dans le mod`le e a e m´moire dit SMALL (ou TINY). Pour la programmation dans des mod`les m´moires plus ´tendus, on se e e e e r´f´rera au manuel de l’assembleur. ee

2

en deux mots Sans entrer dans les d´tails qui seront vus en cours. adresse et e registre et d´crivons le codage des valeurs num´riques. en les combinant. Les ee e registres sont en nombre tr`s limit´. e e Pour ex´cuter un programme.2 La m´moire e æ La m´moire est une s´quence d’octets. une par une. on donne quelques d´finitions : e – un bit est une valeur binaire qui. e Les instructions agissent sur des donn´es qui sont situ´es soit en m´moire. e e – un Koctet est un ensemble de 1024 octets. On appelle adresse effective (AE) d’un octet en m´moire le num´ro qui lui est associ´ (cf.1). – un octet est une donn´e cod´e sur 8 bits . tous num´rot´s de mani`re unique par un entier compris entre 0 e e e e e et N − 1.3 Chapitre 1 Introduction Dans ce premier chapitre. il faut sp´cifier son nom (chaque e e e e registre poss`de un nom qui est une chaˆ de caract`res).1 Un processeur. e e 1. ou assembleur) sont tr`s simples e mais n’en permettent pas moins. Pour acc´der une donn´e en m´moire. le processeur lit les instructions en m´moire. e e e e e il faut sp´cifier son adresse. Il connait ` tout e e a instant l’adresse (l’endroit dans la m´moire) ` laquelle se trouve la prochaine instruction ` ex´cuter car il e a a e m´morise cette adresse dans son compteur ordinal. a e e Pour terminer. Un processeur constitue le cœur de tout ordinateur : il ex´cute les instructions qui composent les proe grammes que nous lui demandons d’ex´cuter. . m´moire. 1. c’est-`-dire qu’il traite des donn´es cod´es sur 16 bits. nous pr´sentons le minimum ` savoir sur ce qu’est e e a un processeur. de r´aliser n’importe quelle op´ration programmable. peut prendre la valeur 0 ou 1 . e e e fig 1. 14 en l’occurence pour le 8086. Ces instructions (dont l’ensemble compose le langage d’assemblage. nous introduisons rapidement les notions de processeur. e e – un mot est une donn´e cod´e sur 16 bits . soit dans des registres du e e e processeur. On dit alors que la capacit´ de la m´moire est de N octets. par convention. Les instructions sont stock´es en m´moire (en dehors du proe e e cesseur). On a toujours N qui est une puissance e e de 2 (N = 2m ). Un registre est un ´l´ment de m´morisation interne au processeur et contenant une valeur. e ıne e Le 8086 est un processeur 16 bits. Pour acc´der une donn´e dans un registre.

Leur attribution en m´moire est g´n´ralement r´alis´e automatiquement par le syst`me d’exe e e e e e ploitation sans que le programmeur ait a s’en soucier. un programme utilise plusieurs segments m´moire (cf. d´placement) sous la forme de l’´quation : e e adresse effective = 16 × segment + d´placement e æ Une cons´quence de la relation ´nonc´e plus haut entre adresse effective et adresse segment´e est qu’un e e e e octet d’adresse effective donn´e peut ˆtre acc´d´ de plusieurs mani`res. Plus pr´cis´ment.5). Le d´placement (ou offset) sp´cifie un octet e e e particulier dans un segment (cf. un octet est d´sign´ par un couple e e ( num´ro de segment. d´placement dans le segment ) e e qui constituent une adresse segment´e (AS). fig. . – un segment contient les donn´es du programme (le segment de donn´es) .4) : e e – un segment contient les instructions du programme (le segment de code) . Ce segment tr`s important sera d´crit e e au chapitre 4. Ce sont : e ax registre d’usage g´n´ral contenant des donn´es. fig. fig.3). Ces trois segments peuvent se situer n’importe o` en m´moire et mˆme se recouvrir partiellement ou u e e totalement. Segment et d´placement sont cod´s sur 16 bits et peuvent donc e e prendre une valeur comprise entre 0 et 65535. e e – un segment contient la pile du programme (le segment de pile).1 – Une m´moire de N octets. 1. ee e 1. 1. 1. 1. INTRODUCTION N − 1 = 2m − 1 Fig. e Un segment est un ensemble de 64 Koctets cons´cutifs. e æ Lors de son ex´cution. e Pour le 8086. on est certain de r´f´rencer le bon segment sans se poser de questions trop compliqu´es. ` chaque AE e e e e e e e a correspond 212 = 4096 AS diff´rentes (cf. On a une relation entre adresses effectives et couple (segment.2).3 Les registres du 8086 æ Le 8086 poss`de 14 registres de 16 bits (cf. et donc pour nous programmeurs du 8086. 1.4 Adresses effectives 0 1 2 CHAPITRE 1. fig. Les 8 bits de poids faible se nomment al et les 8 bits de e e e poids fort se nomment ah. En respectant un certain protocole (suivi dans ce ` manuel).

4). s doit ˆtre un multiple de 16 pour ˆtre le 1er octet d’un segment. LES REGISTRES DU 8086 5 Adresses effectives 0 1 2 s0 1 d  octet ` l’offset d du segment N = s/16 a 65535 2m − 1 Fig. 1. Comme ax.3. Il sera d´crit plus loin (cf.4). Comme ax. section 3.2) e e Z le bit de z´ro est positionn´ par la plupart des instructions arithm´tiques pour indiquer que le e e e r´sultat du calcul est 0 e . e bx registre d’usage g´n´ral contenant des donn´es. e e sp registre pointeur de pile.6) e S le bit de signe est positionn´ par la plupart des instructions arithm´tiques pour indiquer le signe du e e r´sultat (positif ou n´gatif – cf. cx se d´compose en cl et ch. e e e e cx registre d’usage g´n´ral contenant des donn´es. section 1. Ce registre indique la prochaine instruction ` ex´cuter.4. e e e e e e bp registre utilis´ pour adresser des donn´es dans la pile (cf.2 – Adressage segment´.1. on a repr´sent´ le segment commen¸ant a l’adresse effective e e e c ` s e e s dont le num´ro est donc N = 16 . e e e e e e di registre d’usage g´n´ral contenant g´n´ralement le d´placement dans un segment d’une donn´e.3. e e e e dx registre d’usage g´n´ral contenant des donn´es. e e e e si registre d’usage g´n´ral contenant g´n´ralement le d´placement dans un segment d’une donn´e. a e flags registre d’indicateurs de l’´tat du processeur. En traits gras. e ip registre pointeur d’instruction (compteur ordinal ). Ce sont e tous des indicateurs binaires : O le bit d’overflow est positionn´ par la plupart des instructions arithm´tiques pour indiquer s’il y a e e eut un d´bordement de capacit´ lors du calcul (un nombre trop grand ou trop petit) e e D bit de direction. dx se d´compose en dl et dh. section 4. Ce registre sera d´crit plus loin (cf. section 4. bx se d´compose en bl et bh.2. Comme ax. Certains bits de ce registre portent des noms.

e e – d´cimal compact´. Si l = 8. sur 8 bits : e e Valeur 0 1 2 3 . e a e e L’ordinateur ne sait pas quel est le codage utilis´. on peut donc coder 256 valeurs e diff´rentes. e e Nous d´crivons ces codages et quelques notions qui leur sont li´es. section 3) e e e A le bit dit auxiliary carry (retenue auxiliaire) est positionn´ par la plupart des instructions arithm´e e tiques pour indiquer une retenue entre bits de poids faible et bits de poids forts d’un octet. ds et ss sont automatiquement initialis´es par le syst`me d’exploitation au e e lancement du programme. On peut ´tablir le codage suivant. 11111110 11111111 Ce codage permet de repr´senter tout nombre entier entre 0 et 255 (0 et 2l − 1) avec 8 bits (l bits). un double mot ou un e e e e e nombre quelconque de bits. 1. e e e Nous d´crivons ici le codage des nombres entiers. ces segments sont implicites. section 3) P le bit de parit´ est positionn´ par la plupart des instructions arithm´tiques. Nous distinguons quatre types de codage : e – non sign´ pour des nombres entiers forc´ment positifs . Il indique si les 8 bits e e e de poids faible du r´sultat comportent un nombre pair de 1. e e e . e e e a 1...4. Il ex´cute simplement des instructions. 01010100 . c’est-`-dire que si l’on d´sire acc´der ` une e a e e a donn´e en m´moire. D`s lors. il est possible de coder 2l valeurs diff´rentes.4 Le codage des nombres Les instructions du 8086 manipulent des valeurs num´riques enti`res cod´es sur 1 ou 2 octets.. Tout ce qui est dit e e peut-ˆtre adapt´ imm´diatement pour des donn´es qui seraient cod´es sur un mot.6 CHAPITRE 1. d’un mot ou d’un double mot (cf. 84 . Du e fait que l’on ne repr´sente que des nombres positifs.. ou d´cimal cod´ binaire e e e e – d´cimal non compact´ e e C’est au programmeur de d´cider du codage qu’il utilise et ` ´crire son programme en cons´quence. e Le 8086 comporte ´galement des registres 16 bits pour contenir des num´ros de segment : e e cs code segment segment contenant le programme en cours d’ex´cution e ds data segment segment contenant les donn´es e es registre segment auxiliaire pour adresser des donn´es e ss stack segment segment contenant la pile Les valeurs des registres cs. ce codage est qualifi´ de non sign´. INTRODUCTION C le bit de carry (retenue) est positionn´ par la plupart des instructions arithm´tiques pour indiquer e e si le calcul a engendr´ une retenue qui devra ˆtre report´e sur les calculs suivants (cf. il suffit de sp´cifier son offset sans avoir ` se soucier du segment. e e Nous supposerons dans ce qui suit que les donn´es sont cod´es sur un octet (8 bits). e e – sign´ pour des nombres entiers positifs ou n´gatifs.. 254 255 Codage 00000000 00000001 00000010 00000011 ..1 Repr´sentation non sign´e des nombres entiers e e Avec l bits...

4 bits codant e e e en principe 16 valeurs diff´rentes. e e e a e inf´rieure ` 0 en codage sign´.. Il faut bien prendre garde que si le bit de signe vaut 0..4.. Aussi... on parle aussi de binaire cod´ d´cimal e e .. plutˆt qu’` e e e o a coder des nombres compris entre 0 et 255.1. Le codage est le suivant : e 1. ce bit se nomme le bit de e signe. ceci est tr`s important pour que le processeur traite indiff´remment des nombres en codage e e sign´ ou non. 01010100 . ` repr´senter des nombres entre -128 et +127.2 Repr´sentation sign´e des nombres entiers e e Si l’on veut pouvoir repr´senter des nombres positifs et n´gatifs. LE CODAGE DES NOMBRES 7 1.. Faire la somme au niveau du codage binaire ou au niveau des nombres repr´sent´s donne e e e le mˆme r´sultat... la valeur repr´sent´e est la mˆme en codage sign´ e e e e ou non sign´. la valeur cod´e est sup´rieure ` 127 en codage non sign´. l’id´e naturelle consiste.3 Codage d´cimal e En codage d´cimal 1 . 11010011 .. un chiffre d´cimal (compris donc entre 0 et 9) est cod´ sur 4 bits. e On constate.4. Ce bit indique donc le signe du nombre cod´. si le bit de signe vaut 1.. 01111110 01111111 Ce codage se nomme codage par compl´ment a deux. e e Prenons 25 + 36 61 un exemple : → 00011001 → 00100100 ← 00111101 Dans le codage sign´. les autres n’ayant alors pas de sens. -1 0 1 2 ... 0 pour e e tous les nombres positifs.. que le fait de faire une op´ration (par exemple ajouter 1 ` une valeur) fonctionne quel que soit e e a le codage utilis´. L’obtention du codage par compl´ment ` deux d’un e ` e a nombre est indiqu´ plus bas. 84 .. 11111111 00000000 00000001 00000010 . 126 127 Codage 10000000 10000001 . -45 . on constate que le bit de poids fort vaut 1 pour tous les nombres n´gatifs.. Par contre. e a e 1. ce qui repr´sente a e e toujours 256 valeurs diff´rentes ` coder avec 8 bits. seules 10 de ces 16 combinaisons sont effectivement utilis´es en codage e e d´cimal. e a Valeur -128 -127 .4.

4. Ce codage porte le nom de codage d´cimal compact´. Soit ` calculer le compl´ment ` deux de -23 : e a e a – la repr´sentation binaire sur 8 bits de 23 est 00010111 e – par compl´ment des bits.4.6). a Nous pr´sentons cet algorithme sur un exemple. e e e 1. lors du transfert de la valeur d’un octet dans un mot ` recopier e a le bit de signe de l’octet sur tous les bits de l’octet de poids fort du mot. On effectue les op´rations suivantes : u e – ´crire n sous forme binaire e – en compl´menter tous les bits (0 → 1. 1 → 0) e – ajouter la valeur 1 ` ce nombre binaire. Cette m´thode donne la repr´e a e e sentation binaire sign´e d’un nombre n´gatif. 19 se code : d´cimal compact´ e e 00011001 d´cimal non compact´ 00000001 e e 00001001 Deux octets sont n´cessaires dans la repr´sentation non compact´e. L’algorithme est simple. l’extension du signe de 10011110 en mot donne 1111111110011110. e e On reverra plus loin ces codages (cf.3. Le codage d´cimal est tr`s utile pour passer de la repr´sentation cod´e d’un nombre dans sa repr´sentation e e e e e en chaˆ de caract`res ASCII.8 Valeur 0 1 2 3 4 5 6 7 8 9 Codage 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 CHAPITRE 1. 3. on obtient : 11101000 e – en ajoutant 1. On e e e peut ´galement ne mettre qu’un seul chiffre par octet. INTRODUCTION On distingue deux types de repr´sentation.4 Compl´ment ` deux d’un nombre e a Nous indiquons ici comment obtenir le compl´ment ` deux d’un nombre. On e e e qualifie ce codage de d´cimal non compact´.5 Extension du signe ´ Etendre le signe d’une donn´e consiste. compact´e ou non. 1. ıne e Par exemple. on peut repr´senter deux chiffres par octet. . La repr´sentation binaire sign´e de -23 est donc e a e e 11101001. on obtient : 11101001 Le compl´ment ` deux de 00010111 est donc 11101001. les 4 bits de poids fort de l’octet ´tant inutilis´s. Par exemple. Soit ` calculer la repr´sentation du e e a e nombre −n (o` n est un nombre positif). Un chiffre n´cessitant 4 bits pour son e e e codage.

1. nous utiliserons la notation suivante : – 10 indique la valeur num´rique 10 e – AX indique la valeur contenue dans le registre AX – (10) indique la valeur qui se trouve ` l’offset 10 dans le segment de donn´es a e – (SI) indique la valeur qui se trouve ` l’offset dont la valeur se trouve dans le registre SI a – (DS:SI) indique la valeur qui se trouve ` l’offset contenu dans le registre SI et le segment dans le a registre DS .5 Notation Dans ce document.5. NOTATION 9 1.

d ). selon que l’on consid`re qu’il se trouve dans le segment s.. ( s + 2. . s + 1.10 CHAPITRE 1. d − 32 ). l’adresse segment´e de l’octet α est ( s. 1.3 – Les segments : on a repr´sent´ quelques segments pour montrer leur chevauchement et le fait e e qu’un octet-m´moire poss`de plusieurs adresses segment´es. . d − 16 ). Par exemple. ( s + 1. INTRODUCTION 0 / 1 / / / a + 16 16 / / / / a + 32 32 / / α d / / / a \ \ \ \ \ \ \ \ \ \ \ \ \ / / segment s = / a 16 / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ \ \ segment s + 1 \ / \ / segment s + 2 \ / \ Fig. e Notons que chaque octet-m´moire appartient a 212 = 4096 segments diff´rents. e ` e . s + 2... l’octet d’adresse effective α peut e e e ˆtre adress´ de multiples fa¸ons.. e e c e Dans chacun de ces cas.

5. e e . de donn´es et de e e e e pile qui sont cr´´s lors du d´clenchement de l’ex´cution d’un programme (de haut en bas – en r´alit´. On a repr´sent´ en traits gras les segments de code. Chaque segment est r´f´renc´ par un registre de e e u e ee e segment. Les diff´rents segments peuvent se recouvrir partiellement ou compl´tement. ils ee e e e e peuvent bien entendu ˆtre situ´s n’importe o` en m´moire). NOTATION 11 (cs) (ip) instruction suivante ` ex´cuter a e (ds) (ss) 0 : fond de la pile 1 2 (sp) dernier octet utilis´ dans la pile e Fig.1. 1.4 – Structure de la m´moire.

INTRODUCTION ax bx cx dx si di sp bp ip cs ds es ss flags ah bh ch dh al bl cl dl offset du sommet de pile offset de la prochaine instruction ` ex´cuter a e num´ro du segment d’instructions e num´ro du segment de donn´es e e num´ro du segment de pile e Fig.12 CHAPITRE 1. 1. Chaque registre contient 16 bits.5 – Les registres du 8086 et leur utilisation. .

. chiffres et de caract`res $. _ et ? Quelques e e e exemples d’´tiquettes valides : boucle. e e a soit en sp´cifiant l’adresse m´moire (l’emplacement en m´moire) o` se trouve la donn´e. et se termine en fin de ligne. e e e Un commentaire commence par un caract`re .. Les op´randes d’une instruction indiquent les donn´es ` traiter. LOOP. e Bien que la syntaxe soit assez souple. soit le nom d’un e e e u e registre contenant la donn´e ou contenant l’adresse m´moire de la donn´e. qui peut ˆtre vide e Une ´tiquette est un identificateur compos´ de lettres. g´n´ralement. qui peut ˆtre vide e e – le champ mn´monique (le nom de l’instruction) e – le champ op´rande (les arguments de l’instruction). fin_de_tant_que. soit sous la forme de valeurs constantes. Chaque ligne est compos´e de champs. . le . e Un mn´monique est. nous respecterons toujours les r`gles suivantes : e – une instruction par ligne – le mn´monique de l’instruction commence ` la colonne 10 e a – une d´finition d’´tiquette commence en colonne 1 e e – les op´randes des instructions commencent en colonne 20 e – les commentaires en fin de ligne commencent en colonne 35 – les blocs de commentaires sont align´s sur les mn´moniques et commencent donc en colonne 10 (c’este e a `-dire.. %. de d´but de commentaire se trouve en colonne 10) e . On pourra indiff´remment ´crire les mn´moniques avec des lettres e e e minuscules ou majuscules.. Chaque ligne d’un source assembleur come porte une instruction. qui peut ˆtre vide e e – le champ commentaire.. De gauche ` droite.13 Chapitre 2 Anatomie d’un programme en assembleur Un programme en assembleur a une forme bien particuli`re. on a : e a – le champ ´tiquette. compos´ uniquement de lettres. CMP. Quelques mn´moniques que nous e e e e e retrouverons souvent : MOV.

dans l’instruction mov ah. 1993 Objet : indiquer ici a quoi sert le ` programme.1 Exemple . la date de r´alisation du programme ainsi que son utilit´ et utilisation...CODE.... d´finition des donn´es du programme e e . fin du source Un programme en assembleur commencera donc.... le deuxi`me qui indique une u e e e e e e donn´e. Par exemple.asm Date d’ecriture : 15 Nov. 4ch la donn´e source. ... . .1.DATA. mov int . e Parmi ces instructions. .. dans le squelette de programme ci-dessus... e e e On trouve ensuite une zone de d´finition des donn´es qui d´bute par la pseudo-instruction 1 . ou directive d’assemblage... ah est la e destination de l’instruction... comment on l’utilise. ANATOMIE D’UN PROGRAMME EN ASSEMBLEUR 2..DATA DB .4ch 21h . .. small 200h . est une commande en langage d’assemblage qui n’est pas une instruction du processeur. taille de la pile . Forme g´n´rale d’un fichier source en assembleur 8086 e e Nom du fichier : modele. .. e 2. .. Elle est seulement utilis´e pour donner des informations a l’assembleur.MODEL .CODE .. . . lesquelles d´butent par une pseudo-instruction .14 CHAPITRE 2. 4ch. END donnee1 .. e On notera que la plupart des instructions ont leur premier op´rande qui indique une donn´e et l’endroit e e o` il faut ranger le r´sultat (donn´e et r´sultat sont stock´s au mˆme endroit). . e e On trouve ensuite quelques lignes sp´cifiant des informations qui seront d´taill´es plus tard. terminaison du programme .. . par un bloc de commentaire indiquant l’auteur du programme...1 Sp´cifier une donn´e en m´moire (une variable) e e e Il y a 16 mani`res de sp´cifier le d´placement dans un segment m´moire : e e e e – ´tiquette e – [bx] – [si] – [di] – bx+´tiquette e 1. une pseudo-instruction. d´finit le mod`le m´moire e e e . on trouvera g´n´ralement la s´quence indiqu´e qui termine l’ex´cution du programme. e ` ..STACK .. .. par convention. . les instructions composant le programme ah. . e e e e e Enfin... e e e On trouve ensuite les instructions du programme.. la derni`re ligne du programme est la pseudo-instruction END qui indique la fin du source.

2 Les constantes Les constantes num´riques e On peut sp´cifier les constantes num´riques dans les bases 2.data du programme (cf. 5. il suffit de la doubler. 10 et 16. plus bas). A priori. Il faut noter que toutes les r´f´rences ` des op´randes en m´moire sont implicitement situ´es ee a e e e dans le segment dont le num´ro est contenu dans le registre DS. Si on veut mettre un caract`re ’ dans une ıne e e e constante. 8. 14 et 15 et se terminer e e par la lettre h. Pour l’exprimer en base 2. Pour l’exprimer en e e base 8. e cela sera mentionn´ explicitement. Exemples : – ’hello world’ – ’l’’arbre’ . une constante ne doit comporter que des chiffres de 0 ` 9 ou des lettres de a ` f a a pour les valeur hexad´cimales correspondant aux nombres d´cimaux 10. Par exemple : – 100110b est une constante binaire dont la valeur d´cimale est 38 e – 37o est une constante octale dont la valeur d´cimale est 31 e – 4ch est une constante hexad´cimale dont la valeur d´cimale est 76 e e Puisqu’une constante num´rique doit toujours commencer par un chiffre. e une constante ne doit comporter que des chiffres 0 et 1 et ˆtre termin´e par la lettre b. Ainsi. u e e Notons au passage que l’on peut r´cup´rer la valeur des adresses de d´but de segment de donn´es et de e e e e code en utilisant les symboles @data et @code respectivement.1. e 2. Les constantes chaˆ ınes de caract`res e Une chaˆ de caract`res est une suite de caract`res entre ’. 4. 2. une constante est not´e en base 10.1. EXEMPLE – bx+si+´tiquette e – bx+di+´tiquette e – [bx+si] – [bx+di] – [bp+si] – [bp+di] – bp+´tiquette e – bp+si+´tiquette e – bp+di+´tiquette e – si+´tiquette e – di+´tiquette e 15 e ´tiquette indique l’´tiquette d’une donn´e d´finie dans la section . 3. 11. une constante hexad´cimale e e dont le premier caract`re est une lettre sera pr´c´d´e d’un 0. 6 ou 7 et se terminer par la lettre o.2. 1. une constante ne doit comporter que des chiffres 0. Lorsque cela n’est pas le cas. Pour l’exprimer en base 16. 13. la valeur c3 sera not´e 0c3h dans un e e e e e source assembleur. e e e o` d´placement est une constante cod´e sur 16 bits. 12. Une constante num´rique e e e commence toujours par un chiffre.

. ’r’. ’ ’. ANATOMIE D’UN PROGRAMME EN ASSEMBLEUR La directive EQU associe une valeur ` un symbole qui pourra ˆtre ensuite utilis´ dans le programme ` la a e e a place de la constante qu’elle d´finit. Une fois cette d´claration effectu´e. toute chaˆ de caract`res devant ˆtre affich´e a l’´cran se e ıne e e e ıne e e e ` e terminera par un caract`re ’$’.1. Avant d’employer une variable. Par exemple.16 D´claration d’une constante e CHAPITRE 2. On peut consid´rer que DEUX_OCTETS r´f´rence un tableau de 2 octets . ee e e e – CHAINE r´f´rence une chaˆ de caract`res compos´e des caract`res ’h’. les caract`res de code 13 et 10 plac´s en fin de chaˆ entraˆ e e ıne ınent le passage a la ligne apr`s l’affichage du message . valeurs num´riques. dont la valeur est 3. des caract`res de code 13 (retour en d´but de ligne) et 10 (aller ` la ligne suivante) et e e a enfin du caract`re ’$’ 3 . la commande : TROIS EQU 3 d´finit une constante qui s’appelle TROIS. ’$’ 10 dup (0) d´finissent 5 symboles comme suit : e – NB_OCTET r´f´rence une donn´e cod´e sur un octet dont la valeur sera initialis´e ` 36 ee e e e a – DEUX_OCTETS r´f´rence une donn´e cod´e sur un octet dont la valeur sera initialis´e ` 43. ’!’. ’e’. les 4 e e a lignes suivantes : OCTET DEUX_OCTETS LETTRE CHAINE TABLEAU DB DB DB DB DB 36 43. ’ ’. e e 2. mais c’est un e peu cach´) revient toujours ` r´server un emplacement en m´moire pour y stocker la valeur de cette variable..) e e ou des variables. l’octet suivant ee e e e a ´tant initialis´ avec 26. ’d’. 10. nom est un symbole permettant d’acc´der ` cet octet 2 . e a e e La directive DB [nom] DB constante [. ee ıne e e e ’l’. e . ’w’. toute e e e occurence de l’identificateur TROIS sera remplac´e par la valeur indiqu´e. e e e ee – LETTRE r´f´rence une donn´e dont la valeur sera initialis´e avec le code ASCII du caract`re ’e’ . il faut pr´alablement la d´clarer (comme dans tout langage). 26 ’e’ ’hello world !’. e nom EQU constante Par exemple. e e D´clarer une variable (et ceci est vrai aussi dans les langages de haut niveau comme Pascal. constante] R´serve et initialise un octet. e – TABLEAU r´f´rence un tableau de 10 octets dont la valeur initiale des ´l´ments est 0 ee ee On constate donc que la valeur initiale d’un symbole peut ˆtre exprim´e de diff´rentes mani`res : e e e e – une valeur – plusieurs valeurs s´par´es par des virgules e e 2. 13. ’l’. En g´n´ral. ’o’. la notation [xxx] indique que xxx est facultatif 3. ’o’. ’l’.3 Les d´clarations de variables e L’espace m´moire est utilis´ pour stocker des constantes (chaˆ e e ınes de caract`res. le ` e caract`re ’$’ indique la fin de la chaˆ de caract`res. .

Pour un programme ´crit en assembleur. on peut indiquer e que la valeur d’une expression est calculable ` l’assemblage si elle ne comporte que des valeurs num´riques ou a e des constantes d´finies par des pseudo-instructions EQU ou une adresse. Par analogie avec un programme Pascal. le poids fort dans le deuxi`me octet. L’ASSEMBLAGE – le code d’un caract`re e – une chaˆ de caract`res. Sans entrer dans les d´tails ici. cette e phase se nomme la compilation. La directive DW [nom] DW constante [. en argument. . chacun des caract`res initialisant un octet ıne e e 17 On pourra g´n´ralement utiliser l’une de ces formes dans toute instruction. A ce propos. le nom du fichier ` assembler. Il faut alors r´aliser une ´dition de liens.. la valeur se trouvant ` l’adresse OCTET pourra ˆtre modifi´e. il est tr`s important de e e bien noter la diff´rence entre un symbole d´fini par une directive EQU et un symbole d´fini par une directive e e e DB ou DW. e a e e Notons que les octets composant un mot sont stock´s de la mani`re suivante : le poids faible est mis dans e e le premier octet.. cette transformation se nomme e assemblage. Pour cela. alors que les autres symboles (OCTET. ..2.2 L’assemblage Une fois un programme source assembleur saisi sous ´diteur de textes dans un fichier dont l’extension est e ASM. Une fois que e e e l’assemblage a eu lieu sans d´tection d’erreur.. constante] R´serve et initialise un mot (16 bits). nous pouvons dire que TROIS est une constante. Des a erreurs de syntaxe seront ´ventuellement d´tect´es qu’il faudra corriger avant de continuer. on obtient un fichier de mˆme nom que le fichier source et e e avec une extension OBJ. – OCTET. nom est un symbole permettant d’acc´der ` ce mot. Celles-ci sont tout aussi e e e valides pour n’importe quelle instruction. On verra ´galement d’autres mani`res de sp´cifier des valeurs par la suite. sont des constantes dont la valeur est l’adresse ` laquelle seront stock´es a e les valeurs 36. 43.. MOT. e e e e du moment que celle-ci est calculable lors de l’assemblage. ee e e e – le symbole TMOT qui r´f´rence un tableau de 20 mots initialis´s avec la valeur 0 ee e On voit donc sur cet exemple qu’une valeur constante peut ˆtre sp´cifi´e avec une expression num´rique. du moment qu’elles ont un sens. si on d´clare : e e M DW 1234h la valeur 34h est mise ` l’adresse M et la valeur 12h ` l’adresse M+1. Ainsi. Pour un langage de haut niveau comme Pascal. – le symbole MOT2 qui r´f´rence une donn´e cod´e sur un mot et qui est initialis´e avec la valeur 138 . Au cours e e de l’ex´cution du programme. a a 2.. Si nous consid´rons les exemples pr´c´dents : e e e – TROIS est une constante dont la valeur est 3 . MOT. 26. les lignes e e a suivantes d´finissent : e MOT MOT2 TMOT DW DW DW 1559 ((45 * 23) / 9 + 23) 20 DUP (0) – le symbole MOT qui r´f´rence une une donn´e cod´e sur un mot et qui sera initialis´e avec la valeur ee e e e 1559 . du moment que cela a un e e sens. il faut le transformer en un programme ex´cutable. on utilise la commande TASM2 avec. Ainsi. DEUX_OCTETS. 1559. . Pour cela.) sont des variables qui seront initialis´es avec les valeurs indiqu´es.2. on utilise la commande TLINK2 e e .

on obtient un fichier portant le mˆme nom que le fichier source et d’extension EXE. sans extension. chaque e ee e instruction est cod´e par un octet ou une succession d’octets cons´cutifs en m´moire (segment de code). Ce fichier est ex´cutable.18 CHAPITRE 2.1 – Le codage d’une instruction . Ainsi. A l’issue de ce processus. en argument. registre. ANATOMIE D’UN PROGRAMME EN ASSEMBLEUR avec. le nom du fichier. 2. e e e Dans le codage d’une instruction. on trouve le code-op´ration qui indique le mn´monique (1 ou 2 octets) e e suivi du ou des op´randes (valeur imm´diate. les instructions ont ´t´ cod´es. e e Il est bon de noter que dans le programme ex´cutable. adresse). e e Code op´ration e Codes op´randes e Fig.

. e Mod`le de description d’une instruction e Pour toutes les instructions poss´dant plusieurs modes d’adressage des op´randes.code du proe a e gramme La plupart des instructions modifient les indicateurs du registre FLAGS. AH. SI ou DI. un registre particulier – registre un registre 8 ou 16 bits parmi AL. on trouvera un tableau e e pr´sentant ces modes de la forme suivante . On note : * le bit est modifi´ en fonction du r´sultat de l’ex´cution de l’instruction e e e ? le bit a une valeur ind´finie apr`s l’ex´cution de l’instruction e e e 1 le bit est mis ` 1 a 0 le bit est mis ` 0 a Une case vide indique que l’indicateur n’est pas modifi´ par l’instruction.. Un tableau indique l’effet de l’instruction couramment d´crite sur ces indicateurs. BX. La deuxi`me ligne (vide ici) indique e e e l’effet de l’instruction sur un bit en particulier.19 Chapitre 3 Les instructions du 8086 Dans ce chapitre..data du programme e e e – registre/variable un registre ou une ´tiquette de donn´e e e – constante une constante – etiquette une ´tiquette correspondant ` une instruction. e xxx .. AX. e . Dans la colonne suivante.. donc d´finie dans la section. AH.. operande1. DL. on trouve e le mode d’adressage des op´randes. donnent quelques e informations compl´mentaires.. DH. on trouve le mn´monique de l’instruction. . CX. CH. e Les modes d’adressage sont indiqu´s de la mani`re suivante : e e – AL. – variable une ´tiquette de donn´e d´finie dans la section . commentaire Dans la colonne de gauche. BL. CL. DX. nous pr´sentons une par une les instructions du 8086. . operande2. BH.. e O D I T S Z A P C La premi`re ligne indique le nom des bits int´ressants de FLAGS. La colonne de droite absente dans certaines tables. Il a la forme suivante . .

constante D I T S * Z * A * P * C * L’instruction SUB effectue la soustraction du contenu du registre source au registre destination.20 CHAPITRE 3. le 8086 poss`de des instructions +. Pour faire des op´rations sur des donn´es plus complexes e e e e e (des nombres flottants par exemple). le bit C est mis ` 0.1. constante D I T S * Z * A * P * C * L’instruction ADD effectue l’addition du contenu du registre source au registre destination. a Si nous consid´rons les deux instructions suivantes . sans report de retenue. a a SUB soustraction sans retenue SUB SUB SUB O * registre/variable. registre registre. sans report de retenue. e mov add ax. LES INSTRUCTIONS DU 8086 3. registre registre. 72h alors le registre AX contient la valeur 1bh.1 Les instructions arithm´tiques et logiques e Les instructions arithm´tiques e Comme dans de nombreux processeurs. e e mov add ax. a9h ax. −. 3ah alors le registre AX contient la valeur 43h. ADD addition sans retenue ADD ADD ADD O * registre/variable. la retenue auxiliaire A est ea mise ` 0.source . destination ← source + destination La retenue est positionn´e en fonction du r´sultat de l’op´ration. registre/variable registre/variable.1 3. e e e Par exemple. registre/variable registre/variable. destination ← destination . 09h ax. si les instructions suivantes sont ex´cut´es . soit . soit . × et ÷ qui traitent des e donn´es enti`res cod´es sur un octet ou un mot. le bit C est positionn´ ` la valeur 1. on devra les programmer. la retenue auxiliaire A est mise ` 1.

produit de 4 par 25. 26h ax. a e a IMUL MUL Les multiplications en assembleur IMUL O * D I registre/variable T S ? Z ? A ? P ? C * Les deux instructions IMUL et MUL effectuent des multiplications. e e mov sub ax. Le r´sultat est plac´ dans le registre ax. e e Les indicateurs de retenue (C) et de d´bordement (O) sont mis ` un si le r´sultat ne peut pas ˆtre stock´e e a e e e dans l’op´rande destination. Le r´sultat est plac´ dans la paire de registres dx et ax. e ee Si nous consid´rons les deux instructions suivantes . e Pour bien comprendre la diff´rence entre les instructions imul et mul. ax le poids faible. le registre AH contient la valeur 100. une multiplication de e e deux donn´es de n bits donne un r´sultat sur 2n bits. e Une addition ou une soustraction de donn´es cod´es sur n bits donne un r´sultat sur au plus n + 1 bits. e mov sub ax. Les bits C. e e Dans leur premi`re forme qui prend une donn´e 8 bits en op´rande (donc le r´sultat est sur 16 bits). Le bit Z est mis ` z´ro. L’instruction MUL effectue la multiplicae e tion d’op´randes non sign´s. e e e Par exemple. 39h ax. e e e Le bit suppl´mentaire est la retenue et est stock´ dans le bit C de flags. 59h le registre AX contient ensuite la valeur cdh. son signe est positif et aucune retenue n’est g´n´r´e. 25 ah ` A l’issue de l’ex´cution de ces 3 instructions. 4 ah.1. Par contre. dx contient le poids fort du e e e r´sultat. LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES La retenue est positionn´e en fonction du r´sultat de l’op´ration. 2372 imul bx . S et C du registre FLAGS sont mis ` 0 car le r´sultat a e n’est pas nul. si les instructions suivantes sont ex´cut´es . regardons les exemples suivants : e mov bx. e e e e les instructions mul et imul effectuent le produit de la valeur contenue dans le registre al avec la valeur de l’op´rande fourni. A et S sont mis ` 1. L’instruction IMUL effectue la multiplication d’op´randes sign´s. e e e e les instructions mul et imul effectuent le produit de la valeur contenue dans le registre ax avec la valeur de l’op´rande fourni. e e e Dans leur deuxi`me forme qui prend une donn´e 16 bits en op´rande (donc le r´sultat est sur 32 bits). 18h 21 le registre AX contient ensuite la valeur 21h. e Exemple de multiplication sur 8 bits : soient les instructions suivantes : mov mov imul al. 435 mov ax.´ 3. Les bits Z.

le reste a le mˆme signe que le dividende et sa valeur absolue est e e toujours inf´rieure au diviseur. le registre ax contiendra la valeur 5 qui est le e e quotient de 2372 par 435. le e a e e r´sultat est le mˆme que l’on utilise l’instruction imul ou l’instruction mul. 2. Le reste est toujours inf´rieur au diviseur. le r´sultat n’a pas de sens. e Dans le cas d’une division sign´e IDIV. DIV l’effectue e e sur des donn´es non sign´es. le produit de 435 par 2372. e e Si l’on consid`re maintenant la s´quence : e e mov bx. LES INSTRUCTIONS DU 8086 ` A l’issue de l’ex´cution de ces 3 instructions. le registre AX contient la valeur 7. – la division d’une donn´e 32 bits stock´e dans la paire de registres DX (poids fort) et AX (poids faible) e e par une donn´e 16 bits qui fournit un quotient dans AX et un reste dans DX sur 16 bits. 37 dx. Pour les deux instructions. 5 dl Apr`s leur ex´cution.22 CHAPITRE 3. le dividende est implicite. 2372 idiv bx on aura ensuite ax qui contient la valeur -5 (soir fffb en hexad´cimal) et dx la valeur 197. Le diviseur est fourni en op´rande. Les deux donn´es ´tant positives. prenons l’exemple suivant : mov bx. c’est-`-dire 1031820. Le r´sultat se compose e e du quotient et du reste de la division. Si on remplace div par idiv. Si l’on remplace e idiv par div. 435 mov ax. soit la valeur e hexad´cimale fbe8c. IDIV sur des donn´es sign´es. 2372 div bx ` A l’issue de l’ex´cution de cette s´quence d’instructions. quotient de 37 par 5 et le registre DX contient le e e reste de la division. e IDIV DIV Les divisions en assembleur IDIV O ? D I registre/variable T S ? Z ? A ? P ? C ? Les deux instructions DIV et IDIV r´alisent les op´rations de division et de calcul de reste. -435 mov ax. un message Division par zero sera affich´ automatiquement. e e e e Dans tous les cas. ax contient la valeur be8c et dx la valeur f. le r´sultat est inchang´ puisque le diviseur et le dividende sont tous deux positifs. On a le choix entre : e – la division d’une donn´e 16 bits stock´e dans AX par une donn´e 8 bits qui fournit un quotient dans AL e e e et un reste dans AH sur 8 bits. et le registre dx vaudra 197 qui est le reste de la division. A e Si l’on remplace imul par mul. ax contient la valeur 4174 et dx contient la valeur fff0. 2372 imul bx ` l’issue de leur ex´cution. si le diviseur de la division est nul. e e Consid´rons maintenant la s´quence d’instructions : e e mov bx. -435 mov ax. e . soit la valeur -1031820. e Soient les quelques lignes d’assembleur suivantes : mov mov div ax. e Pour bien comprendre le fonctionnement de ces deux instructions. le r´sultat n’a pas de sens.

LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES 23 3.3 NEG Oppos´ d’un nombre e N´gation par compl´ment ` 2 e e a NEG O * D I registre/variable T S * Z * A * P * C * NEG transforme la valeur d’un registre ou d’un op´rande m´moire en son compl´ment ` deux. e DEC d´cr´mentation e e DEC O * D I registre/variable T S * Z * A * P * C DEC soustrait 1 au contenu de l’op´rande. mov inc al. P. Ainsi. a e e e 3. l’india e e cateur de retenue auxiliaire bit A est mis ` 1 (passage de retenue entre les bits 3 et 4 lors de l’incr´mentation). alors que d´cr´menter signifie (( retirer 1 )). 3fh al AL contient ensuite la valeur 40h. a a INC incr´mentation e INC O * D I registre/variable T S * Z * A * P * C INC ajoute 1 au contenu de l’op´rande. a e les bits bit O et bit S mis ` 0 (pas de d´bordement de capacit´. e mov neg ax.2 Incr´mentation. le signe du r´sultat est positif). sans modifier l’indicateur de retenue.1.1. A et S mis ` 0. apr`s e e e a e ex´cution des instructions . en g´n´ral lorsque e e e e e e e e e e la variable modifi´e est un compteur. . 01h al AL contient ensuite la valeur 00. e Soient les instructions assembleur suivantes . l’incr´mentation et la d´cr´mentation. e Soient les instructions assembleur suivantes . Le bit Z est mis ` 1. les bits O. Notons cependant que l’on utilise souvent les termes e e incr´menter et d´cr´menter mˆme si les quantit´s ajout´es ou retir´es sont diff´rentes de 1. sans modifier l’indicateur de retenue. Le bit Z est mis ` 0 (le r´sultat de l’incr´mentation n’est pas nul). Incr´menter signifie e e e e (( ajouter 1 )).´ 3. mov dec al. d´cr´mentation e e e Nous voyons ici deux types d’instructions tr`s fr´quemment utilis´es et qui sont en fait des cas particuliers e e e des instructions d’addition et de soustraction.1. 35 ax le registre AX contient la valeur -35.

36h al. Le r´sultat est rang´ e a e e e e dans l’op´rande destination. 5ch Le registre AL contient ensuite la valeur 7eh obtenue de la mani`re suivante . constante D I T S * Z * A ? P * C 0 AND r´alise un et-logique bit ` bit entre l’op´rande source et l’op´rande destination. e a e AND et-logique AND AND AND O 0 registre/variable. 36h al. e 36h ∧ 5ch 14h 0011 0101 0001 0110 1100 0100 Les bits S et Z sont mis ` z´ro et le bit P ` 1. registre regisre. a e a XOR ou-exclusif . LES INSTRUCTIONS DU 8086 3. e Consid´rons les deux lignes suivantes : e mov and al.24 CHAPITRE 3. constante D I T S * Z * A ? P * C 0 OR r´alise un ou-logique bit ` bit entre l’op´rande source et l’op´rande destination. 5ch Le registre AL contient ensuite la valeur 14h obtenue de la mani`re suivante . registre/variable registre/variable. e 36h ∨ 5ch 7eh 0011 0101 0111 0110 1100 1110 Les bits S et Z sont mis ` z´ro et le bit P ` 1. registre regisre. a e a OR ou-logique OR OR OR O 0 registre/variable.4 Les instructions bool´ennes et logiques e Ces instructions disponibles sur tous les processeurs travaillent sur les donn´es au niveau des bits (et non e sur des valeurs num´riques comme les instructions vues jusqu’` pr´sent). e Consid´rons les deux lignes suivantes : e mov or al.1. Le r´sultat est rang´ e a e e e e dans l’op´rande destination. registre/variable registre/variable.

e ¬ 36h c9h 0011 1100 0110 1001 Les bits S et P sont mis ` 1. constante D I T S * Z * A ? P * C 0 25 XOR r´alise un ou-exclusif bit ` bit entre l’op´rande source et l’op´rande destination.5 Les instructions de d´calage et rotation e Nous d´crivons ici des op´rations classiques des langages d’assemblage qui se nomment d´calages et e e e rotations. a a 3. a e a NOT N´gation logique e NOT O D I registre/variable T S Z A P C NOT transforme la valeur d’un registre ou d’un op´rande m´moire en son compl´ment logique bit ` bit. registre regisre. 36h al. Le r´sultat est rang´ e a e e e e dans l’op´rande destination. RCL ROL RCR ROR Les rotations en assembleur . 5ch Le registre AL contient ensuite la valeur 6ah obtenue de la mani`re suivante .´ 3. e 36h ⊕ 5ch 6ah 0011 0101 0110 0110 1100 1010 Les bits S et Z sont mis ` z´ro et le bit P ` 1. On les rencontre couramment car leur utilisation simplifie grandement certains traitements.1. registre/variable registre/variable. e e e a Consid´rons les deux lignes suivantes : e mov not al. e Consid´rons les deux lignes suivantes : e mov and al. 36h al Le registre AL contient ensuite la valeur c9h obtenue de la mani`re suivante . le bit Z ` 0.1. LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES XOR XOR XOR O 0 registre/variable.

e e e e l’instruction RCL.ROL retenue 6 6 6 6 6 6 6 6 b. quelques d´tails diff`rent .RCL retenue 6 Les rotations sont des op´rations logiques binaires fr´quemment utilis´es. ROL et ROR.d) e æ Les op´randes des instructions RCL. e Le contenu de la retenue est mis dans le bit de poids faible de l’op´rande destination. en prenant en compte a e e le contenu de l’indicateur de retenue. Lors du d´calage. e Le contenu de la retenue est mis dans le bit de poids fort de l’op´rande destination. 1 registre/variable.1. Elles consid`rent un op´rande e e e e e (octet ou mot) comme un tore dont elles d´calent les bits.SAR retenue - Op´rande e  Op´rande e retenue 6 6 6 6 6 6 6 d.e) ROL le bit de poids fort est mis dans l’indicateur de retenue C et dans le bit de poids faible de l’op´rande. 1 ou CL fois.SHL (´quivalent ` SAL) e a Fig. e L’ancienne valeur de l’indicateur de retenue n’est pas utilis´e (cf. Selon le cas.1 – D´calages et rotations en assembleur e 6 6 6 6 6 6 6 e. 3. figure 3. 1 ou CL fois. Le bit de poids faible de l’op´rande destination est mis dans la retenue.SHR Op´rande e  retenue  Op´rande e  0 6 6 6 6 6 6 6 c. e RCR effectue une rotation ` droite de l’op´rande destination indiqu´.1. e . a e e RCL le bit de poids fort est mis dans l’indicateur de retenue C.26 CHAPITRE 3. la valeur de cet indicateur ´tant pr´alablement e e mise dans le bit de poids faible (cf. ´tant les mˆmes. figure 3. un bit d´borde d’un cˆt´. nous n’en pr´sentons qu’une. LES INSTRUCTIONS DU 8086 Op´rande e 6 6 6 6 6 6 6 a. CL I T S Z A P C * RCL effectue une rotation ` gauche de l’op´rande destination indiqu´. ` e e e oe a gauche ou ` droite. RCR. selon le sens de la rotation. en prenant en compte a e e le contenu de l’indicateur de retenue. Le bit de poids fort de l’op´rande destination est mis dans la retenue. RCL RCL O * D registre/variable.

Le bit de poids faible est mis dans l’indicateur de retenue lors de la rotation ainsi que dans le bit de poids fort de l’op´rande.1. e Consid´rons les deux lignes suivantes : e mov mov xxx al.a). figure 3. le bit de poids fort est conserv´ (cf. cl . ainsi. nous ne pr´sentons qu’une seule e e e e instruction. 3 al.b). SAL. nous obtenons les r´sultats u e suivants . SHL et SHR ´tant les mˆmes. SAR. figure 3. sans prendre en compte a e e le contenu de l’indicateur de retenue. 16h cl.c). a e e e e figure 3. e Par ailleurs (et c’est l` toute la diff´rence avec l’instruction pr´c´dente). le bit qui (( d´borde )) de la retenue est perdu. e ROR effectue une rotation ` droite de l’op´rande destination indiqu´.1. Selon le choix de cette instruction.1. un d´calage consid`re la donn´e e e e e e comme une file .´ 3. Le bit de poids fort est mis dans l’indicateur de retenue lors de la rotation ainsi que dans le bit de poids faible de l’op´rande. 1 registre/variable. e SAR effectue un d´calage vers la droite. e e Consid´rons les deux lignes suivantes : e mov mov sal al. xxx al C SAL SHL SAR SHR rcl b0h 0 rcr 85h 1 rol b0h 0 ror 85h 1 Les d´calages en assembleur e Une op´ration de d´calage consiste simplement ` d´caler tous les bits d’une donn´e. sauvegardant le bit de poids fort dans l’indicateur de retenue et mettant un 0 e dans le bit de poids faible (cf. sans prendre en a e e compte le contenu de l’indicateur de retenue. SAL SAL O * D registre/variable. 3 al. 1 ou CL fois. sauvegardant le bit de poids faible dans l’indicateur de retenue. Contrairement aux e e a e e rotations qui consid`rent une donn´e (un octet ou un mot) comme un tore. LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES 27 ROL effectue une rotation ` gauche de l’op´rande destination indiqu´. 16h cl. Un 0 est mis dans e le bit de poids fort de la donn´e (cf. cl o` xxx est une instruction de rotation. CL I T S * Z * A ? P * C * SAL et SHL sont des synonymes et peuvent ˆtre utilis´es l’une pour l’autre indiff´remment. SAL effectue e e e un d´calage vers la gauche.1. e Les op´randes des instructions SAL. SHR effectue un d´calage vers la droite. Le bit de poids faible est mis dans la retenue. 1 ou CL fois. Le bit de poids fort de la donn´e initiale est donc dupliqu´.

registre registre. a e 3. un d´calage de l positions vers la gauche correspond ` une multiplication par 2l et e e e a un d´calage de l positions vers la droite correspond ` une division par 2l . Ceci correspond donc ` l’affectation des langages de haut niveau A:= B. un d´calage d’une position vers la gauche correspond ` une multiplie a cation de ce nombre par 2 et qu’un d´calage d’une position vers la droite correspond ` une division enti`re e a e par 2. soit b0h Le bit C est mis ` 0. es ou ss.1. ou entre un e e e registre et la m´moire. cl Le registre AL contient ensuite la valeur 05h.6 MOV Les instructions de transfert transfert d’une valeur Ces instructions r´alisent des transferts de donn´es entre 2 adresses m´moire. les op´rations de d´calage ´tant connues comme des op´rations logiques binaires et non des e e e e op´rations arithm´tiques. 16h s’´crit 00010110 en binaire. L’instruction MOV effectue le transfert d’une donn´e vers un registre ou une adresse m´moire. En effet. nous devrons effectuer le transfert en e deux ´tapes. a Consid´rons les deux lignes suivantes : e mov mov sar al. En g´n´ralisant. et c’est ce qui e a justifie l’existence des deux instructions sar et shr et leur subtile diff´rence. Si on d´cale cette e e valeur de trois positions vers la gauche. 1 f0 f8 78 70 38 38 Il faut noter que pour un nombre. Aussi. e e Transfert de la valeur d’un registre de segment vers un autre registre de segment Aucun mode d’adressage de la commande MOV ne permet de transf´rer la valeur d’un registre de segment e dans un autre registre de segment. constante D I T S Z A P C registre de segment indique l’un des registres cs. e Bien entendu. Il faut bien noter. Le bit C est mis ` 1. 3 al. pour deux valeurs de la donn´e (mise dans le registre AL). ds. en utilisant un registre de donn´es interm´diaire : e e e – transf´rer la valeur du registre de segment source dans un registre de donn´es sur 16 bits e e . registre/variable registre. registre de segment registre de segment. a La diff´rence entre les instructions SAR et SAL n’apparait que si le bit de poids fort de la donn´e vaut e e 1. Le tableau suivant donne. on prendra garde ` l’interpr´tation des indicateurs de d´bordement ou de retenue e e a e e que l’on fera ` l’issue d’une instruction de d´calage. 1 shr al. on obtient 10110000. pour atteindre notre but. e a MOV MOV MOV MOV MOV O registre/variable. registre registre/variable. 2 registres. Nous disposons uniquement de la possibilit´ de transf´rer la valeur d’un e e registre de segment vers un registre de donn´es et de la possibilit´ de transf´rer la valeur d’un registre de e e e donn´es vers un registre de segment. l’effet des diff´rents e e d´calages. que sar effectue une division e sur un nombre en repr´sentation sign´e tandis que shr effectue une division sur un nombre en repr´sentation e e e non sign´e. 36h cl. LES INSTRUCTIONS DU 8086 Le registre AL contient ensuite la valeur b0h. e al sar al.28 CHAPITRE 3.

registre registre. Supposons que le e e registre AX contienne la valeur 20 et le registre DX la valeur 10. e e a LEA Chargement de l’offset d’une donn´e e LEA O registre/variable. Cependant. registre/variable D I T S Z A P C L’instruction XCHG ´change le contenu de deux emplacements m´moire ou registres.2.2 Les tests en assembleur En assembleur. Ceci peut poser un probl`me qui pourra ˆtre r´solu en utilisant les techniques e e e e pr´sent´es ` la section 4. 3.2.3. en g´n´ral. e ee e e e e e une donn´e d´clar´e dans le segment de donn´es. supposons que nous voulions transf´rer le contenu du registre DS dans le registre ES. ds es. LES TESTS EN ASSEMBLEUR – transf´rer la valeur de ce registre de donn´es dans le registre de segment destination e e 29 Par exemple. etiquette ´ D I T S Z A P C Ctte instruction charge l’offset de la donn´e r´f´renc´e dans le deuxi`me op´rande qui est. ax Remarquons qu’au cours de cette op´ration. On utilise pour cela les bits du registre FLAGS comme condition e de test et une instruction de branchement conditionnelle (saut si certains bits du registre FLAGS valent 0 ou 1) pour d´clencher la partie alors ou la partie sinon du test.3. l’ex´cution de l’instruction : e xchg ax. e e e e ´ Echange de valeurs XCHG XCHG XCHG O registre/variable. il est bien entendu possible de r´aliser des tests. dx entraˆ ınera : AX contient la valeur 10 et DX la valeur 20. la valeur du registre AX a ´t´ perdue lors de l’ex´cution e ee e de la premi`re instruction. Nous e pouvons l’´crire sous la forme suivante : e mov mov ax. e . il n’existe pas de tests comme dans les langages de haut niveau tel Pascal.

LES INSTRUCTIONS DU 8086 3. une instruction dite de saut conditionnel teste un bit ou une combie naison de bits de FLAGS et. cela indique e a e e que les deux donn´es sont diff´rentes (sinon. En utilisant des raisonnements du mˆme genre. logiques.). L’indicateur de z´ro Z valant 0. . en fonction du r´sultat : e – effectue une rupture de s´quence (un saut) vers un endroit pr´cis dans le code o` l’ex´cution se poursuit e e u e normalement. la soustraction d’un nombre ` lui-mˆme donne 0. CMP CMP CMP O * registre/variable. si le r´sultat de la soustraction est nul.30 CHAPITRE 3. e Une fois les indicateurs positionn´s. constante D I T S * Z * A * P * C * CMP permet de comparer deux valeurs. e e Ainsi. L’indicateur de retenue C est positionn´ ` 1. mais en positionnant les indicateurs en fonction du r´sultat. on peut savoir si les e e e deux valeurs sont diff´rentes. registre/variable registre/variable. Pour cela CMP soustrait le second op´rande du premier. – continue en s´quence si le test ne donne pas un r´sultat positif. Ils sont ´galement positionn´s par des instructions sp´cialement con¸ues pour e e e e c r´aliser des tests et qui n’ont d’autres effets que de positionner les bits de FLAGS en fonction de certaines e conditions sur leurs op´randes. sans e cependant modifier l’op´rande destination. registre registre. les instructions de sauts conditionnels et inconditionnels puis pr´sene e tons sur des exemples le codage des tests. Le bit de signe S est ´galement mis ` 1 car 29 − 34 est un nombre n´gatif. 3.. 23 al. donc le bit Z e e a e est positionn´ ` 1). Ces instructions sont CMP et TEST.2. cela signifie que les e ee ea deux valeurs compar´es sont ´gales. ce qui indique que le deuxi`me op´rande de e a e e l’instruction CMP est sup´rieur ` la valeur du premier op´rande. ea e a e Jxx Les instructions de saut conditionnel . e e Nous pr´sentons l’instruction CMP.2 CMP Les instructions de comparaison comparaison C’est l’instruction la plus utilis´e pour positionner les indicateurs avant d’effectuer une instruction de e saut conditionnel. 34 le registre AL n’est pas modifi´ par l’ex´cution de l’instruction CMP et contient toujours la valeur affect´e e e e auparavant 23.1 Principe g´n´ral e e Les bits du registre FLAGS sont positionn´s par les instructions que nous avons d´j` vues (instructions e ea arithm´tiques. ordonn´es strictement ou non. donc l’indicateur Z a ´t´ positionn´ ` 1.2. e e ` A l’issue de l’ex´cution des deux instructions suivantes : e mov cmp al..

. une erreur d’assemblage est d´clench´e et le message : e e Relative jump out of range by xxx bytes est affich´. . c’est-`-dire (( saut si plus grand )).2. faire suivre l’instruction de saut conditionnel par une instruction de saut inconditionnel jmp (voir 3. Supposons que l’instruce e a e e tion : je etiquette provoque l’erreur en question. LES TESTS EN ASSEMBLEUR 31 Toutes les instructions de saut conditionnel prennent le mˆme type d’op´rande (attention.. d´clarer ensuite la nouvelle ´tiquette apr`s l’instruction jmp e e e . il faut proc´der de la mani`re suivante. ea e a e e e e Notons que les tests d’ordre (inf´rieur. L’op´rande de cette e e e nouvelle instruction est une nouvelle ´tiquette. Pour rem´dier ` cette erreur. e 2. sup´rieur. Sinon.3. saut si le bit Z vaut 1 est remplac´ par saut si le bit Z vaut 0).2) dont l’op´rande est l’´tiquette de l’instruction de saut conditionnel originale e e 3. Il faut transformer cette instruction dans la s´quence d’instructions : e jne nouvelle-etiquette jmp etiquette nouvelle-etiquette: C’est-`-dire : a 1. bien distinguer e e la valeur z´ro 0 du bit O du registre d’´tat) : e e JA JAE JB JBE JC JCXZ JE JG JGE JL JLE JNC JNE JNO JNP JNS JO JP JS etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ etiquette ´ O D saut saut saut saut saut saut saut saut saut saut saut saut saut saut saut saut saut saut saut I si si si si si si si si si si si si si si si si si si si sup´rieur (C =0 et Z =0) e sup´rieur ou ´gal (C =0) e e inf´rieur (C =1) e inf´rieur ou ´gal (C =1 ou Z =1) e e retenue (C =1) CX vaut 0 ´gal (Z =1) e sup´rieur (Z =0 ou S =O) e sup´rieur ou ´gal (S =O) e e inf´rieur (S =O) e inf´rieur ou ´gal (Z =1 ou S =O) e e pas de retenue (C =0) non ´gal (Z =0) e pas de d´bordement (O =0) e pas de parit´ (P =0) e pas de signe (S =0) d´bordement (O =1) e parit´ (P =1) e signe (S =1) S Z A P C T Toutes ces instructions fonctionnent selon le sch´ma suivant. Quand la condition est vraie. remplacer l’instruction de saut conditionnel par l’instruction de saut correspondant ` la condition a oppos´e (ici. Supposons e e e que nous comparions deux donn´es par une instruction CMP et que nous ex´cutions ensuite une instruction e e JG.2. Il y aura alors saut si la valeur du deuxi`me op´rande de l’instruction a e e CMP est sup´rieur ` la valeur du premier op´rande. un saut est e effectu´ ` l’instruction situ´e ` l’´tiquette sp´cifi´e en op´rande.) se comprennent de la mani`re suivante. e a e L’´tiquette r´f´renc´e dans l’instruction de saut conditionnel ne doit pas se trouver trop loin de l’instruce ee e tion de saut.

32 JMP : saut inconditionnel JMP O D I T

CHAPITRE 3. LES INSTRUCTIONS DU 8086

etiquette ´ S Z A P C

L’instruction JMP effectue un saut inconditionnel ` l’´tiquette sp´cifi´e. Contrairement ` un saut condia e e e a tionnel, le saut est toujours effectu´, le registre FLAGS n’intervenant en rien dans cette op´ration. e e

3.2.3

Exemples de codage de tests en assembleur

G´n´ralement parlant, un test dans un langage ´volu´ a la forme suivante : e e e e SI (condition vraie) ALORS action-alors SINON action-sinon FIN_SI Si la valeur de l’expression condition est vraie, les instructions composant la partie action-alors sont ex´cut´es. Sinon, les instructions de la partie action-sinon sont ex´cut´es. e e e e En assembleur, ce type de construction est r´alis´ ` l’aide du squelette de programme suivant : e ea calcul de la condition Jcc SINONn action-alors ... JMP FSIn SINONn: action-sinon ... FSIn: ... o` Jcc d´note l’une des instructions de saut conditionnel vues plus haut. u e Nous notons les points suivants : – le calcul de la condition positionne les indicateurs du registre FLAGS – en fonction de ce positionnement, un saut conditionnel est r´alis´ par l’instruction Jcc (o` cc repr´sente e e u e la condition ` tester – voir les diff´rentes possibilit´s dans la section traitant des instructions de saut a e e conditionnel) vers la partie sinon du test. Si la condition est v´rifi´e, aucun saut n’est r´alis´ et le e e e e programme poursuit son ex´cution en s´quence avec les instructions de la partie action-alors e e – une fois les instructions de la partie alors ex´cut´es, un saut doit ˆtre r´alis´ (instruction JMP FSIn) e e e e e pour atteindre la fin de la structure de test afin de ne pas ´galement ex´cuter la partie sinon e e – une ´tiquette (SINONn) est d´clar´e indiquant le d´but de la partie action-sinon o` le branchement e e e e u conditionnel doit ˆtre ex´cut´ pour d´clencher l’ex´cution des instructions de la partie sinon du test e e e e e – une fois la partie sinon ex´cut´e, on continue en s´quence avec les instructions situ´es apr`s le test e e e e e (c’est-`-dire, apr`s l’´tiquette FSIn) a e e

3.3. LES BOUCLES EN ASSEMBLEUR

33

Pour des raisons de clart´, nous utiliserons un format sp´cial pour les ´tiquettes codant un test. Une e e e ´tiquette SINON indique le d´but de la s´quence action-sinon et une ´tiquette FSI indique la fin de la e e e e structure de test. Ces ´tiquettes seront num´rot´es, les tests ´tant num´rot´s dans le programme de 1 ` n, e e e e e e a par convention. Afin d’illustrer le propos, nous donnons un exemple de codage d’un test. Nous voulons effectuer la division d’un nombre par un autre. La division n’est possible que si le diviseur est non nul. Aussi, nous devons tester si l’op´rande diviseur est nul avant d’ex´cuter la division. Si le diviseur est nul, nous d´sirons que le r´sultat e e e e du traitement soit -1. Sinon, le r´sultat est le quotient des deux nombres. e .data db .code ... mov cmp je mov div jmp SINON1: mov FSI1: ... ... val .... ; mettre ici la valeur du diviseur

ax, ... val, 0 SINON1 bl, [val] bl FSI1 ax, -1

; valeur du dividende ; diviseur nul => saut

; diviseur nul => resultat vaut -1

Notons que ce programme n’est pas complet. Il vise simplement ` montrer le codage d’un test. a

3.3

Les boucles en assembleur

Comme pour les tests, il n’existe pas de structure g´n´rale en assembleur pour coder une boucle. Cepene e dant, ` l’aide des instructions vues pr´c´demment pour r´aliser des tests, on peut coder n’importe quel type a e e e de boucle. On verra ´galement que des instructions simplifient grandement le codage des boucles pour. e

3.3.1

Principe g´n´ral e e

Le principe de la r´alisation des boucles tant-que ou jusqu’a est assez particulier. Une boucle est e essentiellement compos´e de deux ´l´ments : e ee – une condition de sortie qui indique quand la boucle doit ˆtre interrompue, qu’il faut sortir de la boucle e et continuer l’ex´cution des instructions en s´quence e e – un corps de boucle qui sp´cifie l’action ` r´aliser pendant que la condition de sortie n’est pas v´rifi´e, e a e e e a ` chaque it´ration de la boucle e La condition de sortie va donc ˆtre cod´e d’une mani`re ressemblant aux tests. Un saut conditionnel e e e testera cette condition et entraˆ ınera, quand la condition est v´rifi´e, la sortie de la boucle. e e Le corps de la boucle devra pour sa part (( boucler )), c’est-`-dire, une fois ex´cut´, entraˆ a e e ıner le re-calcul de la condition de sortie et la prise de d´cision quant ` la poursuite ou non des it´rations. e a e Nous indiquons maintenant comment est r´alis´ le codage d’une boucle tant-que et d’une boucle r´p´ter. e e e e

3.3.2

Boucles tant-que

Le squelette d’une boucle tant-que, dans un langage de haut niveau, est le suivant : TANT-QUE (condition) FAIRE action FIN_TQ

34

CHAPITRE 3. LES INSTRUCTIONS DU 8086 Cela va se traduire en assembleur sous la forme suivante :

TQn:

calcul de la condition Jcc FTQn action ... JMP TQn ...

FTQn: o` Jcc d´note l’une des instructions de saut conditionnel vues plus haut. u e Nous notons les points suivants : – une ´tiquette TQ indique le d´but de la boucle e e – la boucle commence par une ´valuation de la condition de sortie qui positionne les indicateurs du e registre FLAGS – en fonction de la valeur des indicateurs (donc du r´sultat du test de sortie), un saut conditionnel est e effectu´ en fin de boucle (Jcc FTQn), pour quitter la boucle le moment venu e – on trouve ensuite le corps de la boucle, termin´ par une instruction de saut incondtionnel vers le d´but e e de la boucle (JMP TQn) qui permettra de r´-´valuer la condition d’arrˆt apr`s chaque it´ration ee e e e – une ´tiquette FTQ indiquant la fin de la boucle e Pour des raisons de clart´, nous utiliserons un format sp´cial pour les ´tiquettes codant une boucle e e e TANT-QUE. Une ´tiquette TQ indique le d´but de la structure de boucle et une ´tiquette FTQ indique la fin de e e e la structure de boucle. Ces ´tiquettes seront num´rot´es, les boucles ´tant num´rot´es dans le programme e e e e e e de 1 ` n, par convention. a

3.3.3

Boucles r´p´ter e e

Le squelette d’une boucle REPETER dans un langage de haut niveau est le suivant : REPETER action JUSQUA (condition vraie) Cela se traduit de la mani`re suivante en assembleur : e REPETERn: action ... calcul de la condition Jcc REPETERn Notons les points suivants : – une ´tiquette REPETER rep`re le d´but de la boucle e e e – on trouve ensuite le corps de la boucle – ` l’issue de l’ex´cution du corps, on trouve l’´valuation du test d’arrˆt qui positionne les indicateurs a e e e du registre FLAGS – une instruction de saut conditionnel effectue un branchement pour continuer les it´rations si la condition e d’arrˆt n’est pas v´rifi´e e e e Pour des raisons de clart´, nous utiliserons un format sp´cial pour les ´tiquettes codant une boucle e e e REPETER. Une ´tiquette REPETER indique le d´but de la boucle. Ces ´tiquettes seront num´rot´es, les boucles e e e e e REPETER ´tant num´rot´es dans le programme de 1 ` n, par convention. e e e a

3.3. LES BOUCLES EN ASSEMBLEUR

35

3.3.4

Les boucles pour

Une boucle pour est g´n´ralement cod´e ` l’aide d’une instruction de la famille LOOP. Pour les boucles e e e a traitant des chaˆ ınes de donn´es (caract`res, mots), voir la section 3.3.6. e e LOOP boucles contrˆl´es par un compteur oe

LOOP LOOPE LOOPNE

etiquette ´ etiquette ´ etiquette ´ O D

saut court si le compteur est diff´rent de 0 e saut court si compteur diff´rent de 0 et Z =1 e saut court si compteur diff´rent de 0 et Z =0 e I T S Z A P C

LOOP fonctionne avec le registre CX qui joue le rˆle de compteur de boucles. LOOP d´cr´mente le compteur o e e sans modifier aucun des indicateurs. Si le compteur est diff´rent de 0, un saut ` l’´tiquette op´rande de e a e e l’instruction LOOP est r´alis´. Le squelette d’une boucle pour s’´crit de la mani`re suivante : e e e e POUR indice := 1 A bs FAIRE action FAIT Cependant, en assembleur, seules existent des boucles ayant un indice variant d’une certaine valeur bs ` 1, a en d´cr´mentant sa valeur ` chaque it´ration. Aussi, la boucle pr´c´dente doit initialement ˆtre transform´e e e a e e e e e dans une boucle du genre 1 : POUR indice := bs A 1, pas := -1 FAIRE action FAIT Cette boucle se traduit en assembleur de la mani`re suivante : e mov cx, bs POURn: ... action loop POURn En exemple, nous ´crivons un programme qui affiche dix fois la chaˆ de caract`res ’hello world’. e ıne e .data db ’hello world’, 13, 10, ’$’ .code mov ax, @data ; initialisation de la valeur mov ds, ax ; de ds mov cx, 10 ; initialisation du compteur de boucles ; ; corps de boucle ; boucle: mov ah, 9 ; affichage du message lea dx, msg int 21h loop boucle : contr^le de la boucle o ... msg:
1. on prendra garde en effectuant cette transformation. Voir a ce propos le document ( m´thodologie de programmation en ` ( e assembleur ) )

36

CHAPITRE 3. LES INSTRUCTIONS DU 8086

Le d´but initialise le registre DS pour qu’il contienne le num´ro du segment de donn´es et le compteur de e e e boucles. Le corps de la boucle contient alors un appel ` la routine affichant un message ` l’´cran (cf. section a a e 5.1.2). Il est tr`s courant de parcourir un tableau dans une boucle tout en voulant sortir de la boucle lorsqu’une e condition est v´rifi´e (parce que l’on cherche une valeur dans le tableau poss´dant une propri´t´ particuli`re e e e ee e par exemple). Notons que ce type de construction n’existe pas en Pascal. Des instructions sont disponibles en assembleur pour r´aliser ce genre de boucle, les instructions LOOPE et LOOPNE (les instructions LOOPZ et e LOOPNZ ´tant des synonymes). Comme pour les boucles LOOP, le registre CX joue le rˆle de compteur de e o boucle. Par ailleurs, ` chaque it´ration, une condition (la valeur du bit Z du registre FLAGS) est test´e. Pour a e e l’instruction LOOPE, il y a saut ` l’´tiquette sp´cifi´e en op´rande tant que le compteur est non nul et que a e e e e l’indicateur Z vaut 1. Pour l’instruction LOOPNE, il y a saut ` l’´tiquette sp´cifi´e en op´rande tant que le a e e e e compteur est non nul et que l’indicateur Z vaut 0. Exemple Nous pr´sentons un exemple de boucle ainsi que les conventions que nous adoptons pour le codage d’une e boucle pour. Nous recherchons dans un tableau d’entiers l’´l´ment d’indice le plus faible qui soit multiple de ee 7.
tableau .data db .code mov mov mov mov mov mov mov div inc cmp loopne 34, 72, 48, 32, 56, 12, 8, 9, 45, 63, 80 ax, ds, cx, dl, bx, @data ax 11 ; nombre d’´l´ments dans la table e e 7 ; valeur du diviseur 0 ; indice de l’´l´ment consid´r´ e e e e

BOUCLE1: ah, 0 al, BYTE PTR table+bx dl ; division de bx ; mise ` jour a ah, 0 ; ah contient BOUCLE1 ; saut si non

l’´l´ment courant par 7 e e de l’indice le reste de la division multiple et non termin´ e

` A l’issue de l’ex´cution de ces instructions, le registre BX contient l’indice du premier ´l´ment du tableau e ee table ayant une valeur multiple de 7. On notera les points suivants : – une ´tiquette BOUCLE1 indique le d´but de la boucle ; e e – on trouve ensuite le corps de la boucle ; – une instruction (ici CMP) positionne les indicateurs du registre FLAGS pour ´ventuellement sortir de la e boucle avant d’avoir effectu´ toutes les it´rations (quand une valeur multiple de 7 a ´t´ trouv´e, on e e ee e sort imm´diatement) ; e – l’instruction LOOPNE d´cide s’il faut boucler en fonction de la position des indicateurs du registre FLAGS e et de la valeur du compteur de boucle (le registre CX) qui est automatiquement d´cr´ment´. e e e Comme pour les autres structures, on notera que les ´tiquettes BOUCLE sont num´rot´es de 1 ` n. e e e a

3.3.5

Instructions diverses

Nous d´crivons dans cette section quelques instructions qui se r´v`lent souvent utiles pour le codage des e e e tests ou des boucles. CLC

ıne ıne LODS chargement d’un ´l´ment de chaˆ ee ıne LODSB LODSW O D I T S Z A P C . il faut donc incr´ment´ cet index apr`s chaque e e e e traitement. Chacune effectue le traitement e e e d’un ´l´ment de chaˆ ee ıne. Il y a cinq types d’instruction : – LODS : chargement d’un ´l´ment de chaˆ depuis la m´moire dans un registre ee ıne e – STOS : ´criture d’un ´l´ment de chaˆ en m´moire e ee ıne e – MOVS : transfert d’un ´l´ment entre deux chaˆ ee ınes – CMPS : comparaison entre deux ´l´ments de chaˆ ee ıne – SCAS : comparaison entre une valeur et un ´l´ment de chaˆ ee ıne Toutes ces instructions sont con¸ues pour ˆtre ais´ment ins´r´es dans une boucle qui traitera l’ensemble c e e ee des ´l´ments de la chaˆ ee ıne. le traitement va dans le sens contraire et la valeur 1 ou 2 est soustraite ` l’index. Notons a que le bit D est positionn´ par les instructions STD et CLD. le registre DI vers la chaˆ destination. l’indicateur D du registre FLAGS indique la direction a du traitement. C’est effectivement de cette mani`re qu’agissent ces instructions. le registre SI pointe implicitement vers la e chaˆ source. ces instructions traitent des chaˆ ınes d’octets. e e Dans les instructions de traitement de chaˆ ınes de caract`res. lors d’une it´ration. Pour cela. un ´l´ment d’une chaˆ est r´f´renc´ par e ee ıne ee e son index dans la chaˆ ıne. e ea e Notons ´galement que pour traiter les chaˆ e ınes de leur fin vers leur d´but plutˆt que dans le sens contraire. Si D vaut 1. LES BOUCLES EN ASSEMBLEUR CLD CMC STC STD 37 Armement des indicateurs Nous d´crivons ici quelques instructions ne prenant aucun op´rande et agissant chacune sur un bit e e particulier du registre d’indicateurs FLAGS. CLC mise ` z´ro de l’indicateur de retenue C a e CLD mise ` z´ro de l’indicateur de direction D a e CMC compl´mente l’indicateur de retenue C e STC mise ` 1 de l’indicateur de retenue C a STD mise ` 1 de l’indicateur de direction D a 3. le traitement va du d´but vers la fin de la chaˆ et la valeur 1 ou 2 est ajout´e ` e ıne e a l’index. il e o suffit de soustraire 1 ou 2 ` la valeur de l’index. selon le type de donn´es trait´es.3. e e 1 ou 2 doit ˆtre ajout´ ` la valeur de l’index. Classiquement.3. Pour nous aider. les instructions de traitement de chaˆ ınes incr´mentent automatiquement l’index. Aussi. Remarque importante : les indicateurs de FLAGS e ne sont pas modifi´s par les op´rations modifiant la valeur des index. Si D vaut 0.6 Le traitement des chaˆ ınes de donn´es e Nous pr´sentons dans cette section des instructions sp´cialement con¸ues pour le traitement de s´quences e e c e de donn´es.3. e Par ailleurs. que ces donn´es soient des caract`res (des octets) ou des mots. ou de mots. Pour pouvoir it´rer l’instruction.

Si l’indicateur de direction vaut 0. 1 (respectivement 2) est retir´ ea e a ` SI et DI. Une fois le chargement effectu´. 1 (respece e e tivement 2) est ajout´ ` DI. 90. @data ax ax TABLEAU RES 10 bl. 2 bl BOUCLE1 . 50. 1 e e e (respectivement 2) est ajout´ ` SI et DI. 100 10 DUP (0) ax. Si l’indicateur de direction vaut 0. il est automatiquement ajout´ 1 (respectivee e e ment 2) ` SI si l’indicateur D vaut 0.38 CHAPITRE 3. es. 60. AX pour l’instruction LODSW) avec l’octet (respectivement le mot) point´ par le registre SI. 20.. ou retir´ 1 (respectivement 2) si l’indicateur D vaut 1. si. di. LES INSTRUCTIONS DU 8086 LODSB charge le registre AL (respectivement. SI et DI sont automatiquement modifi´s. 40. a e MOVS transfert d’un ´l´ment entre deux chaˆ ee ınes MOVSB MOVSW O D I T S Z A P C MOVSB copie l’octet (respectivement le mot pour l’instruction MOVSW) point´ par SI vers l’octet (respece tivement le mot) point´ par ES:DI.. Le segment e a e destination est forc´ment ES. 80. 30. ea ea Nous donnons un premier exemple qui consiste ` multiplier par 2 tous les ´l´ments d’un tableau d’entiers a ee . TABLEAU RES 10. STOS ´criture en m´moire d’un ´l´ment d’une chaˆ e e ee ıne STOSB STOSW O D I T S Z A P C STOSB ´crit en m´moire l’octet (respectivement le mot pour l’instruction STOSW) se trouvant dans le e e registre AL (respectivement dans le registre AX) en m´moire ` l’adresse point´e par le registre DI.code mov mov mov lea lea mov BOUCLE1: lodsw mov mul stosw loop . 1 (respectivement 2) est retir´ ` DI.data DW DW . Par contre. Si l’indicateur de direction vaut 1. e Une fois la copie r´alis´e. 70. Le segment destination est forc´ment ES. cx. DI est automatiquement modifi´. e e e Une fois la copie r´alis´e. ds. le segment de la e e source qui est DS par d´faut peut ˆtre red´fini. Si l’indicateur de direction vaut 1.

Si l’indicateur de direction vaut 0. Si l’indicateur de direction vaut 0.data DW DW . es. ea ea REP REPE REPZ REPNE REPNZ r´p´ter une instruction de traitement de chaˆ e e ınes de donn´es e . 8. 1 e e e (respectivement 2) est ajout´ ` DI. Si l’indicateur de direction vaut 1. 1 e e e (respectivement 2) est ajout´ ` SI et DI.. . 2. e e e Une fois la copie r´alis´e. 9 est 30h. . ee e Une fois la comparaison r´alis´e.. le segment de la e e source qui est DS par d´faut peut ˆtre red´fini. LES BOUCLES EN ASSEMBLEUR 39 Un deuxi`me exemple illustre la transformation d’une table de donn´es cod´es en d´cimal non compact´ e e e e e en ASCII. Si l’indicateur de direction vaut 1. 9 9 DUP (0) ax.3. 31h. 1 (respectivement 2) est retir´ ` DI. DI est automatiquement modifi´. di. Par contre.. 7. 1 (respectivement 2) est retir´ ea e a ` SI et DI. 3. TABLEAU RES CMPS 1. Cette op´ration est simplement obtenue par ou-logique avec la valeur 30h (le code ASCII des e chiffres 0. 30h BOUCLE1 comparaison de chaˆ ınes CMPSB CMPSW O * D I T S * Z * A * P * C * CMPSB compare l’octet (respectivement le mot pour l’instruction CMPSW) point´ par SI ` l’octet (respece a tivement le mot) point´ par ES:DI. 5. SI et DI sont automatiquement modifi´s. 4.. 6. 39h).3. @data ax ax TABLEAU RES 9 al. si.. Le segment destination est forc´ment ES.. ds. . La donn´e en m´moire a e e e est toujours r´f´renc´e via le registre de segment ES. SCAS comparaison d’un ´l´ment de chaˆ avec une valeur ee ıne SCASB SCASW O * D I T S * Z * A * P * C * SCASB compare la valeur de l’octet (respectivement le mot pour l’instruction SCASW) contenu dans le registre AL (respectivement AX) ` l’octet (respectivement le mot) point´ par ES:DI. cx.code mov mov mov lea lea mov BOUCLE1: lodsw or stosw loop . 1.

REP REP REP REP REP REP REPE REPE REPE REPE REPNE REPNE REPNE REPNE MOVSB MOVSW LODSB LODSW STOSB STOSW CMPSB CMPSW SCASB SCASW CMPSB CMPSW SCASB SCASW O D I T S Z * A P C – REP MOVS copie CX ´l´ments de la chaˆ point´e par SI vers la chaˆ point´e par ES:DI ee ıne e ıne e – REP LODS charge CX ´l´ments de la chaˆ point´e par SI dans AL (ou AX) ee ıne e – REP STOS ´crit CX ´l´ments de la chaˆ point´e par ES:DI avec la valeur contenue dans AL (ou AX) e ee ıne e – REPE CMPS compare au plus CX ´l´ments de la chaˆ point´e par ES:DI avec ceux de la chaˆ point´e ee ıne e ıne e par SI. Sinon : . un compteur (registre CX) indique le nombre maximal d’it´rations ` effectuer. e a Les pr´fixes REPE et REPNE ne peuvent pr´fixer que les instructions CMPS et SCAS. D`s que l’une de ces conditions n’est plus e v´rifi´e. D`s que l’une de ces conditions n’est plus v´rifi´e. Elle donne tout son int´rˆt aux e e e e a e ee instructions LODS. STOS. S’il est ` z´ro. LES INSTRUCTIONS DU 8086 Nous d´crivons ici une instruction qui permet d’it´rer sur toute une chaˆ les op´rations ´l´mentaires e e ıne e ee vues pr´c´demment. l’instruction REPE SCAS est termin´e e e e – REPNE CMPS compare au plus CX ´l´ments de la chaˆ point´e par ES:DI avec ceux de la chaˆ point´e ee ıne e ıne e par SI. REP ne peut pr´fixer que les instructions LODS. tester le compteur (CX). e a l’instruction ´l´mentaire est r´p´t´e tant qu’une condition (´galit´ ou non-´galit´ entre les op´randes de CMPS ee e ee e e e e e ou SCAS) n’est pas remplie. MOVS. D`s que l’une de ces conditions n’est plus v´rifi´e. Les it´rations sont poursuivies tant que les ´l´ments des deux chaˆ e ee ınes sont diff´rents et tant que e le compteur n’est pas nul. Un compteur (registre CX) indique le nombre e d’it´rations ` effectuer. MOVS. ee ıne e ou AX selon le cas. l’instruction REPE CMPS e e e est termin´e e – REPE SCAS compare au plus CX ´l´ments de la chaˆ point´e par ES:DI avec la valeur du registre AL. Cette instruction pr´fixe en fait l’op´ration ` it´rer. CMPS. Les it´rations sont poursuivies tant que les ´l´ments des deux chaˆ e ee ınes sont ´gaux et tant que e le compteur n’est pas nul. sortir de l’instruction de r´p´tition et d´clencher l’ex´cution de a e e e e e la suivante. Par ailleurs. Pour les pr´fixes e e e REPE et REPNE. les actions suivantes sont ex´cut´es : e a e e e 1. STOS. l’instruction REPNE CMPS e e e est termin´e e – REPNE SCAS compare au plus CX ´l´ments de la chaˆ point´e par ES:DI avec la valeur du registre AL. Les it´rations sont poursuivies tant que les ´l´ments de la chaˆ sont diff´rents de e ee ıne e la valeur du registre et tant que le compteur n’est pas nul.40 CHAPITRE 3. SCAS. REPNZ est un synonyme de REPNE. l’instruction REPNE SCAS est termin´e e e e Notons que REPZ est un synonyme de REPE . ` chaque it´ration. selon le cas. ee ıne e ou AX. Les it´rations sont poursuivies tant que les ´l´ments de la chaˆ sont ´gaux ` la e ee ıne e a valeur du registre et tant que le compteur n’est pas nul. Pour r´sumer. D`s que l’une de ces conditions n’est plus e v´rifi´e.

le registre DI pointe sur le caract`re qui se trouve e e e apr`s le ’w’ dans la chaˆ de caract`re.data db db . @data mov es.3. ds. ` A l’issue de l’ex´cution de cette s´quence d’instructions. A l’issue de cette recherche. CHAINE mov cx.. LES BOUCLES EN ASSEMBLEUR 2. ’hello world’ 11 dup (?) ax. @data ds. ’w’ lea di. Puisque l’offset de CHAINE vaut 0. e e e poursuivre avec l’instruction qui suit le REP. @data ax ax RES TABLE 11 . e CHAINE RES .data db db . e ıne e CH1 CH2 . si.. es..code mov mov mov ’hello world’ ’rl’ ax.3.. 0 sinon. c’est-`-dire ’o’. 11 repne scasb . offset cha^ne cible ı offset cha^ne source ı longueur de la cha^ne ı copie Exemple 2 Recherche d’un caract`re dans une chaˆ de caract`res en utilisant l’instruction SCAS e ıne e CHAINE . Sinon : 5. di vaut 7 ` l’issue e ıne e a a de l’ex´cution de repne scasb. d´cr´menter le compteur e e 41 4. di. cx. recommencer Exemple 1 Copie d’un tableau de caract`res dans un autre tableau. le registre AX indiquera ıne e le r´sultat et vaudra 1 si la chaˆ est trouv´e.data db ’hello world’ . . si l’op´ration est SCAS ou CMPS. ax es. ax . cha^ne cible ı . Si la condition d’it´ration n’est pas remplie. . .code mov ax. ax mov al. ex´cuter l’op´ration sur la chaˆ e e ıne 3. tester l’indicateur de z´ro.code mov mov mov lea lea mov rep movsb . e Exemple 3 ` Recherche d’une chaˆ de caract`res dans une autre. cha^ne source ı .

il y a une retenue lors de l’addition des deux e e demi-octets de poids faible (5 + e est sup´rieur ` f. soit . sous-cha^ne trouv´e ı e FTQ1: 3. CH2 mov cx. e 3. 10 lea di. supposons que nous additionnions des octets. CHAPITRE 3. destination ← source + destination + retenue La retenue C est positionn´e en fonction du r´sultat de l’op´ration. 2 repe cmpsb je FTQ1 dec bx jne TQ1 mov ax. Ainsi. e SBB Soustraction avec retenue . Aussi. Pour tenir compte e e e ee de cette retenue. Nous voulons additionner une donn´e se trouvant e dans les registres AX et DX ` une donn´e se trouvant dans les registres BX et CX et ranger le r´sultat dans a e e les registres AX et DX (AX et BX contiennent les poids faibles. La deuxi`me instruction calcule alors le poids fort du r´sultat en additionnant les poids e e e forts des deux op´randes et l’´ventuelle retenue g´n´r´e par l’addition des poids faibles. bx dx. CH1 mov ax.42 lea si. le bit de retenue auxiliaire e a est positionn´ ` 1. cx La premi`re instruction calcule le poids faible du r´sultat en additionnant simplement les poids faibles e e des deux op´randes.. donc il y a une retenue). on a utilis´ l’instruction ADC.4 Autres instructions Nous regroupons ici quelques instructions qui peuvent ˆtre utiles. registre registre. ea Nous proposons un exemple d’addition sur 32 bits. Le code est alors le suivant . registre/variable registre/variable. 1 mov bx. DX et CX les poids forts). 0 . add adc ax.1 ADC Instructions arithm´tiques e Addition avec retenue ADC ADC ADC O * registre/variable.4. e e e Pour expliquer le positionnement de la retenue auxiliaire A. LES INSTRUCTIONS DU 8086 TQ1: . Le bit A indique si une retenue a lieu entre les quatre bits de poids faible et les quatre bits de poids fort. si on additionne les donn´es hexad´cimales 45 et 3e.. constante D I T S * Z * A * P * C * L’instruction ADC effectue l’addition du contenu du registre source au registre destination avec report de retenue.

Elle se contente de positionner les indicateurs du registre e FLAGS. test jz . contrairement ` l’instruction e a AND. Le code est alors le suivant .. e TEST test logique TEST TEST O 0 D registre/variable.3. Par exemple..retenue La retenue est positionn´e en fonction du r´sultat de l’op´ration. registre/variable registre/variable. Nous voulons soustraire une donn´e se trouvant e dans les registres BX et CX d’une donn´e se trouvant dans les registres AX et DX et ranger le r´sultat dans e e les registres AX et DX (AX et BX contiennent les poids faibles. on a utilis´ l’instruction SBB. sub sbb ax. l’instruction test peut ˆtre utile pour tester le signe d’un nombre (voir la description de e l’instruction jz dans le paragraphe suivant) : . AAA ajustement ASCII de AL apr`s addition ADD e . elle ne modifie pas l’op´rande destination... e e e ee Pour tenir compte de cette retenue. La deuxi`me instruction calcule alors le poids fort du r´sultat en soustrayant les poids forts e e e des deux op´randes en tenant compte de l’´ventuelle retenue g´n´r´e par la soustraction des poids faibles. soit : destination ← destination . constante I T S * Z * A ? P * C 0 Cette instruction effectue un et-logique entre ses deux op´randes. registre registre/variable.. bx dx.source . test du bit de signe 3. Elles ne prennent aucun op´rande. Cependant.. al. e e e Nous proposons un exemple de soustraction sur 32 bits. constante D I T S * Z * A * P * C * 43 L’instruction SBB effectue la soustraction du contenu du registre source au registre destination avec report de retenue. e e Les quatre instructions en question sont les suivantes . DX et CX les poids forts). Elles r´alisent un ajustement du contenu du registre AL ou AX pour la r´alisation d’op´rations e e e arithm´tiques. AUTRES INSTRUCTIONS SBB SBB SBB O * registre/variable.4. cx La premi`re instruction calcule le poids faible du r´sultat en soustrayant simplement les poids faibles des e e deux op´randes.4..2 Les instructions d’ajustement d´cimal e Les instructions d´crites dans cette section sont utiles pour effectuer des calculs sur des nombres cod´s e e en BCD.. 80h negatif . registre registre.

o AAA ajustement apr`s addition e L’instruction AAA ne doit ˆtre ex´cut´e qu’apr`s avoir effectu´ une addition ADD. AAM ajustement apr`s multiplication e Cette instruction doit ˆtre ex´cut´e apr`s une multiplication de deux op´randes octets en repr´sentation e e e e e e d´cimale non compact´e afin d’obtenir le r´sultat de la multiplication sous forme d´cimale non compact´e e e e e e ´galement.7 dl . Elle transforme alors le e e e e e contenu du registre AL en un nombre d´cimal non compact´ (c’est-`-dire que le poids faible doit ˆtre compris e e a e entre 0 et 9). Si besoin (valeur de AL sup´rieure ` 9). 0306h ax. Si on ex´cute maintenant l’instruction AAA. si nous d´sirons diviser 37 par 5.5 ax. e e 81 est bien la somme de 36 et 45. quotient de la c c division. si nous d´sirons multiplier 7 par 5. Pour cela.5 ax. 0405h D I T S ? Z ? A * P ? C * qui affectera la valeur 070b au registre AX. on peut ´crire : e e mov mov mul aam dx. Le registre al re¸oit la valeur 5. la valeur 1 est ajout´e au contenu de AH.44 AAD ajustement ASCII de AX avant division DIV AAM ajustement ASCII de AX apr`s multiplication MUL e AAS ajustement ASCII de AL apr`s soustraction SUB e CHAPITRE 3. si nous voulons r´aliser l’addition de 36 et 45 en repr´sentation d´cimale non compact´e. le registre AX contiendra ensuite la valeur 0801. ce qui n’est pas une valeur correcte en repr´sentation d´cimale e e non compact´e. elle transforme la e e e a e valeur non compact´e contenue dans AX en une valeur binaire. reste de la division. on peut ´crire : e e mov mov aad div dx. on peut e e e e ´crire . e mov add ax. e Ainsi. e Ainsi. LES INSTRUCTIONS DU 8086 Ces quatre instructions positionnent les indicateurs du registre FLAGS de la mani`re suivante : e O ? Nous reprenons le rˆle de chacune. e a e Ainsi.0307h dl Le registre ah re¸oit la valeur 2. AAD ajustement avant division Cette instruction doit ˆtre ex´cut´e avant de r´aliser la division de deux op´randes octets en repr´sentation e e e e e e d´cimale non compact´e de mani`re ` ce que la division donne le bon r´sultat.

e O ? D I T S * Z * A * P * C * Supposons que nous voulions additionner les nombres d´cimaux 35 et 26 en repr´sentation d´cimale e e e compact´e. si nous d´sirons retirer 7 de 6. il faut les ´crire comme s’ils ´taient des constantes hexad´cimales. le registre AL e e contient la valeur 5bh.dl ` A l’issue de l’ex´cution de cette s´quence d’instructions. e e AAS ajustement apr`s soustraction e Cette instruction doit ˆtre ex´cut´e apr`s une soustraction SUB de deux op´randes en repr´sentation d´e e e e e e e cimale non compact´e afin d’obtenir le r´sultat de la soustraction en repr´sentation d´cimale non compact´e. 26h Notons que pour indiquer ` l’assembleur que l’on veut repr´senter en d´cimal compact´ les nombres a e e e 35 et 26.7 al. 5 est mis dans les 4 bits de poids faible de AL. on peut ´crire : e e mov mov sub aas al. Pour mieux comprendre le m´canisme. e e e e Prenons un deuxi`me exemple pour comprendre le fonctionnement du bit de retenue et de d´bordement. 63h al. ax contient la valeur 0305h. e e e e e Ainsi. e e mov add daa al. soit 35. On notera qu’avant e e l’ex´cution de l’instruction AAM. ax contient la valeur 00ffh.6 dl. AUTRES INSTRUCTIONS 45 ` A l’issue de l’ex´cution de cette s´quence d’instructions. En effet. e a e DAA ajustement d´cimal de AL apr`s addition ADD e e DAS ajustement d´cimal de AL apr`s soustraction e e Ces deux instructions positionnent les indicateurs du registre FLAGS de la mani`re suivante . c’est simplement au programmeur de le savoir. Aucune instruction n’est disponible pour l’ajustement e e e pour multiplication ou division du fait de la complexit´ de la tˆche et de la raret´ de son utilisation. consid´rant la premi`re e e e e e instruction. 3 est mis dans les 4 bits de poids fort de AL.4. ax contient la valeur 23h. 35h al. e Instructions d’ajustement d´cimal en repr´sentation d´cimale compact´e e e e e Les deux instructions suivantes permettent d’effectuer un ajustement pour la r´alisation d’additions ou de e soustractions en repr´sentation d´cimale compact´e. On notera qu’avant l’ex´cution de l’instruction AAS. Nous pourrions ´crire . 61 est bien le r´sultat de la e e somme de 35 et 26. AL contient la valeur 61h. Notez bien la diff´rence entre 35 et 0305h.3. Ainsi. Aussi. notons qu’avant l’ex´cution de l’instruction DAA. 82h . le 8086 ex´cute e e e simplement dans un premier temps l’addition de deux donn´es hexad´cimales 35h et 26h puis ajuste ce e e r´sultat pour obtenir la repr´sentation d´cimale compact´e (via l’instruction DAA). le processeur ne sait pas (et n’a pas ` savoir) que l’on a cod´ les nombres a e sous forme d´cimale compact´e . ` A l’issue de l’ex´cution de ces trois instructions. al contient la valeur 9 (et ax contient la valeur e e FF09h). e e Soient les trois lignes . mov add daa al.

En effet. e e a Notons que c’est lors de l’instruction DAA qu’a lieu le d´bordement de capacit´ et qu’apparait une retee e nue. LES INSTRUCTIONS DU 8086 L’addition d´cimale de 63 et 82 donne 145.3 LAHF SAHF Autres Instructions de transfert entre FLAGS et AH L’instruction LAHF copie dans AH la valeur du registre FLAGS. c’est-`-dire 45. Aussi. le e e r´sultat contient le poids faible du r´sultat. l’addition donne le r´sultat hexad´cimal e5h qui n’est pas trop grand et ne provoque aucun e e d´bordement et aucune retenue. P et C sont modifi´s lors de cette op´ration quelle que soit la valeur des 3 bits de poids fort de AH. e e . A. comme pour les op´rations en binaire. donc un nombre qui ne peut ˆtre repr´sent´ en d´cimal e e e e e compact´ sur un octet puisqu’il est plus grand que 100.4. Z. L’instruction SAHF copie le contenu de AH dans le registre FLAGS. e 3. et l’indicateur de retenue C ainsi que l’indicateur e e a de d´bordement sont positionn´s ` 1 par l’instruction DAA. Seuls les cinq bits S.46 CHAPITRE 3.

le rˆle des proc´dures et des fonctions dans les langages de o e haut niveau. Nous d´crivons ensuite les e m´canismes ` mettre en jeu pour ´crire des sous-programmes param´tr´s ou renvoyant une valeur. l` o` il s’est interrompu. Dans la suite de ce chapitre. En assembleur.2 Synoptique de l’appel d’un sous-programme Appeler un sous-programme consiste ` effectuer une rupture de s´quence.1 Principe g´n´ral e e Les sous-programmes jouent. indique e a au processeur qu’il faut reprendre l’ex´cution du programme interrompu.1 L’appel d’un sous-programme Un sous-programme est une s´quence d’instructions. e e Dans ce qui suit. e o a – une instruction dite de retour de sous-programme qui. e e a on va donc utiliser son adresse (comme on utilise le nom d’une proc´dure pour l’appeler dans un langage de e haut niveau : en assembleur. e . Elles structurent les programmes en donnant un nom ` un traitement et en r´duisant la taille a e des programmes qui utilisent plusieurs fois la mˆme s´quence de code. on peut utiliser l’adresse de sa pree e mi`re instruction. tout le a m´canisme ´tant pris en charge par le compilateur qui g´n`re la s´quence d’instructions en assembleur pour e e e e e que tout fonctionne comme pr´vu. e e ` A la base. C’est exactement e a u e e la mˆme notion que dans les langages de haut niveau o` l’appel d’une proc´dure suspend l’ex´cution de e u e e la s´quence d’instructions en cours. plac´e ` la fin du sous-programme. le nom d’une proc´dure. c’est son adresse). en assembleur. e e Dans un langage de haut niveau. a e 4. Pour le rep´rer.47 Chapitre 4 Les sous-programmes 4. on n’a aucun souci ` se faire pour que cela fonctionne bien. Notons que l’on peut ` nouveau appeler une proc´dure dans une proc´dure e a e e ou qu’une proc´dure peut s’appeler elle-mˆme. on d´crit e e e tout d’abord le principe de fonctionnement des sous-programmes en assembleur.2. deux instructions sont n´cessaires : e – une instruction dite d’appel de sous-programme qui va rompre la s´quence d’instructions en cours e d’ex´cution et donner le contrˆle au sous-programme ` appeler . ex´cute le corps de la proc´dure et reprend ensuite l’ex´cution de la e e e e s´quence suspendue auparavant. e a u c’est-`-dire ex´cuter les instructions qui suivent l’instruction d’appel du sous-programme. poursuivre l’ex´cution du a e e programme et reprendre ensuite l’ex´cution l` o` on a pr´alablement rompu la s´quence. Pour sp´cifier dans l’instruction d’appel de sous-programme le sous-programme ` appeler. nous nommerons appelant le programme ou le sous-programme qui appelle un sousprogramme. e a e e e 4. et appel´ le sous-programme qui est appel´ par l’appelant. on doit comprendre le m´canisme pour pouvoir en tirer e e le maximum et ´galement pouvoir passer des param`tres aux sous-programmes.

il est e impossible d’indiquer o` il faut continuer l’ex´cution. L’int´rˆt d’une ee pile est qu’elle constitue une structure o` l’acc`s ` un objet est uniquement r´alis´ sur le dernier objet u e a e e empil´ (comme pour une pile d’assiettes. Lorsque le processeur ex´cute l’instruction d’appel d’un sous-programme. Le retour de l’appel´ au sous-programme appelant se passera alors sans aucune e difficult´ en utilisant la pile contenant les adresses de retour (nous nommerons cette pile. Cependant. Deux registres de saue ea e vegarde ne ferait pas non plus l’affaire : rien n’empˆche un sous-programme qui appelle un sous-programme e d’appeler un sous-programme. En restaurant la valeur du registre IP ` l’issue de l’ex´cution du sous-programme. Quand ce sous-programme termine son ex´cution. IP contient donc l’adresse e e de l’instruction o` devra reprendre l’ex´cution de l’appelant (cette adresse se nomme adresse de retour). . au-dessus de l’adresse de retour empil´e pr´c´deme a e e e ment). il est clair que le processeur doit “se rappeler” u e de l’endroit o` ` ´t´ r´alis´ l’appel pour pouvoir continuer l’ex´cution du programme ` cet endroit. Nous pouvons maina tenant it´rer le processus et avoir des sous-programmes qui appellent des sous-programmes qui appellent e des sous-programmes .2 Retour ` l’appelant a Un sous-programme peut-ˆtre appel´ a diff´rents endroits dans un programme.. si son adresse est e e` e toujours la mˆme.. Si ce sous-programme fait lui-mˆme appel ` un autre sous-programme. L’appel d’un sous-programme est r´alis´ e e simplement en empilant la valeur courante de IP et en stockant dans IP l’adresse d’appel du sous-programme. nous serons revenus dans le premier programme appelant.. l’ex´cution du a e e programme reprendra naturellement.2. Celle-ci fonctionne de la mani`re suivante : e – on place une une assiette au sommet de la pile – on prend l’assiette qui se trouve en sommet de la pile En informatique. nous utilisons une e e structure de donn´es fondamentale en informatique. la pile des adresses e de retour). consultons le sommet de la pile : elle contient e l’adresse de retour de sous-programme. o` va-t-on sauvegarder la valeur de IP pour e e u pouvoir reprendre son ex´cution. l` o` il faut. 4. e il suffit de comprendre le fonctionnement d’une pile d’assiettes dans une cuisine. dans l’instruction de retour de sous-programme. une u a ee e e e a fois le sous-programme ex´cut´.2. puisque le registre de sauvegarde est d´j` utilis´. c’est la mˆme chose pour les donn´es et les piles de donn´es : e e e – on place les donn´es au sommet de la pile e – on r´cup`re les donn´es au sommet de la pile e e e En informatique. Le registre IP contient ` tout instant l’adresse de l’instruction suivante ` e e a a ex´cuter. on prend la derni`re assiette pos´e sur la pile). consultons ` nouveau le sommet de la pile .3 R´sum´ e e Nous pouvons r´sumer succinctement les actions ` r´aliser lors de l’appel et lors du retour d’appel d’un e a e sous-programme. Aussi. autant de fois que l’on veut. e e a Quand ce sous-programme termine ´galement son ex´cution.48 CHAPITRE 4. Aussi. dans l’appelant. une pile. Pour comprendre les piles en informatique. Pour r´soudre ce probl`me. e Pla¸ons-la sur une pile. nous pouvons utiliser une pile pour y stocker n’importe quel objet. ` nos e e e a sous-programmes. Revenons. Le retour de sous-programme est r´alis´ simplement en d´pilant le sommet de la pile et en pla¸ant cette e e e c valeur d´pil´e dans le registre IP. LES SOUS-PROGRAMMES 4. si le sousprogramme appel´ appelle lui-mˆme un autre sous-programme. Supposons que nous ayons une pile de retour. Il u e suffit donc de m´moriser ` l’instant o` l’on ex´cute l’instruction d’appel de sous-programme la valeur de ce e a u e registre. e e . D´pilons-la et continuons l’ex´cution du programme ` cette adresse. Quand un appel de sous-programme est effectu´.. elle e e a contient l’adresse de retour de ce sous-programme. on doit sauvegarder l’adresse de retour. l’adresse de retour (l` o` l’ex´cution du programme doit reprendre apr`s ex´cution du e a u e e e sous-programme) n’est pas toujours la mˆme. Si nous la d´pilons et que nous reprenons l’ex´cution du e e programme ` cette adresse. a u On pourrait utiliser un registre pour sauvegarder cette valeur du registre IP. pla¸ons c e a c ´galement l’adresse de retour sur la pile (c’est-`-dire. Aussi.

e e La pile elle-mˆme est une zone m´moire (une esp`ce de tableau) o` le processeur range les donn´es ` e e e u e a sauvegarder. Aussi. C’est le registre SP (SP signifie stack pointer.2. Il suffit alors d’utiliser une instruction CALL pour appeler le souse e programme et une instruction RET pour effectuer le retour ` l’appelant. Par ailleurs. Quand on d´pile une donn´e. Nous d´crivons ces deux instructions. les piles sont implant´es avec leur base au-dessus de leur sommet. les instructions d’appel et de retour e e de sous-programme modifient automatiquement le pointeur de pile pour que les appels et les retours de sous-programmes fonctionnent correctement. nous pouvons maintenant d´crire compl´tement le fonce e e tionnement des instructions d’appel et de retour de sous-programmes. Les ´l´ments de la pile ´tant donc situ´s dans une zone m´moire.3. les op´rations suivantes sont automatiquement r´alis´es : e e e – SP est d´cr´ment´ e e e – (SP) ← adresse de retour (le contenu du registre IP) – IP ← op´rande de l’instruction d’appel de sous-programme e Instruction de retour d’un sous-programme – IP ← (SP) – SP est incr´ment´ e e 4. le pointeur de sommet de pile est e e e e e e incr´ment´. si l’on voit e a e u clairement o` se trouve le sommet d’une pile d’assiettes dans une cuisine. certaines instructions a e e et certains registres sont pr´vus pour g´rer la pile de retour en assembleur. Aussi. c’est ` dire (( pointeur de pile ))).4 La pile d’appel de sous-programme La pile de retour Nous avons indiqu´ que l’utilisation d’une pile de retour permet de r´soudre le probl`me des appels de e e e sous-programmes. C’est e en fait fort semblable ` l’implantation d’une pile dans un langage ´volu´.1 Appel de sous-programme sans passage de param`tre e Appels et retours de sous-programmes Nous nous int´ressons ici au cas le plus simple d’appel de sous-programme. Etant donn´e l’importance de ces op´rations.3. nous n’avons pas encore vu comment on r´alise une pile en assembleur. En effet. nous avons besoin d’un indicateur qui va nous (( montrer )) ce sommet.3 4. le pointeur e a e e de sommet de pile est d´cr´ment´. il nous suffit d’avoir un registre qui indique l’adresse du sommet de la pile. il est difficile de dire que l’on voit u ce sommet pour une pile informatique.` 4. c’est-`-dire que l’adresse e a du sommet de pile est inf´rieure ` l’adresse de leur base. e e Retour sur les instructions d’appel et de retour de sous-programmes Ayant d´crit l’implantation de la pile de retour.. a e . Le seul probl`me ` r´soudre est alors de savoir o` se trouve son sommet. . Classiquement. le cas o` le sous-programme e u ne prend pas de param`tre en entr´e. quand une donn´e est empil´e. les ´l´ments ´tant plac´s les uns ee e e e ee e e a ` la suite des autres. Ce registre se nomme e le pointeur de sommet de pile. ce pointeur de pile doit ˆtre mis ` jour pour indiquer le nouveau sommet e e a de pile (car (( la pile monte ))). alors que lorsqu’une donn´e est d´pil´e. Instruction d’appel de sous-programme ` A l’appel d’un sous-programme.. Cependant. APPEL DE SOUS-PROGRAMME SANS PASSAGE DE PARAMETRE 49 4. ce pointeur doit ´galement ˆtre mis ` jour e e e e a (car (( la pile descend ))). a Quand on empile une donn´e. L’´l´ment ee en-dessous du sommet de la pile se trouve alors dans l’emplacement m´moire voisin.

Pour cela.50 CALL : Appel d’un sous-programme CHAPITRE 4. 2 [sp]. cette sauvegarde est effectu´e sur la pile. corps du sous-programme . La valeur du registre IP est mise ` jour avec la valeur de l’op´rande fournie ` l’instruction CALL pour que a e a l’ex´cution du programme se poursuive en d´but de sous-programme... l’appelant peut avoir stock´ des valeurs dans des registres qu’il aimerait ne pas voir modifi´ durant l’ex´cution d’un souse e e programme qu’il appelle. Afin que tout fonctionne a bien et afin d’avoir un m´canisme standard. son nom ´tant indiqu´ dans le champ e e e e ´tiquette.2 Sauvegarde et restauration de contexte Un sous-programme est libre de modifier le contenu de tous les registres. e RET : retour d’un sous-programme RET O D I T S Z A P C RET rend le contrˆle au sous-programme appelant. ret endp nom_sbr Nous notons les points suivants : – le sous-programme est (( d´clar´ )) par la pseudo-instruction proc.3. e CALL O D I T etiquette ´ S Z A P C Les appels de sous-programme entraˆ ınent la sauvegarde dans la pile du contenu du registre IP uniquement. le sommet de pile est d´pil´ dans le registre o e e ip. LES SOUS-PROGRAMMES Nous d´crivons ici l’instruction d’appel d’un sous-programme. La valeur du registre pointeur de pile e e SP est bien entendu mise ` jour apr`s empilement de la valeur de IP. ax . Pour cela.. sauvegarder la valeur du registre AX sur la pile e a ea e e peut se faire de la mani`re suivante : e sub mov sp. la solution consiste ` sauvegarder la valeur des registres en question. e Squelette d’un sous-programme Nous donnons ci-dessous le squelette d’un programme en assembleur : nom_sbr proc . On peut r´aliser ces e e e op´rations ` l’aide des instructions d´j` pr´sent´es. L’adresse de retour doit donc n´cessairement se trouver en sommet de pile... Ainsi. On indique le nom du sous-programme dans le champ ´tiquette e 4. e – on trouve ensuite les instructions du sous-programme – l’instruction RET indique le retour ` l’appelant a – la pseudo-instruction endp indique la fin du sous-programme. Le contenu du registre CS n’est pas a e modifi´. Cependant..

cx. La valeur du pointeur de sommet de pile est augment´e de 2. dx. il est sous la responsabilit´ de l’appel´ de sauvegarder e e la valeur des registres qu’il utilise et de restaurer leur valeur ` la fin de l’ex´cution du sous-programme. e PUSH sauvegarde sur la pile d’une valeur PUSH O D I registre/variable T S Z A P C registre 16 bits d´note l’un des registres ax. L’instruction POP retire le contenu du sommet de la pile et le place dans l’op´rande e e du POP. bx. e POPF d´pilement de la valeur du registre d’indicateurs e POPF O * D * I * T * S * Z * A * P * C * POPF d´pile la valeur de FLAGS. selon le point de vue adopt´). La deuxi`me fait pointer le e e sommet de pile (( au-dessus )) (ou (( au-dessous )). La valeur du pointeur de sommet de pile SP est ensuite diminu´e de 2. a Nous pr´sentons maintenant les instructions PUSH et POP. si ou di. a e L’appelant n’a pas ` se soucier de ces sauvegardes. APPEL DE SOUS-PROGRAMME SANS PASSAGE DE PARAMETRE 51 La premi`re instruction place la valeur du registre AX au sommet de la pile. Il est important de noter que par convention. La valeur du pointeur de sommet de pile SP est diminu´e de 2.` 4. e POP d´pilement d’une valeur e POP O D I registre/variable T S Z A P C POP d´pile une valeur de la pile de retour et place la valeur ainsi d´pil´e dans l’op´rande.3. e Cependant. e e . e L’instruction PUSH place au sommet de la pile la valeur de l’op´rande qui est donc n´cessairement le e e contenu d’un registre. La valeur du e e e e pointeur de sommet de pile SP est augment´e de 2. L’instruction PUSH place la valeur sp´cifi´e e ee e e e en op´rande sur la pile. e PUSHF sauvegarde sur la pile de la valeur du registre d’indicateurs PUSHF O D I T S Z A P C PUSHF empile le registre d’indicateurs FLAGS. ces op´rations de sauvegarde/restauration du contenu de registres sont tellement courantes e que des instructions sp´ciales ont ´t´ ajout´es pour les effectuer.

. parametre dans ax Nous donnons un exemple de sous-programme calculant la factorielle d’un nombre dont la valeur est pass´e en entr´e dans le registre AX.. e e Appelant . Pour cela. La maˆ e e ıtrise de cette technique est indispensable pour bien programmer en assembleur. 8 facto cx cx. e . Quant au renvoi d’une valeur.4 Passage de param`tres et variables locales e Un sous-programme prend souvent des param`tres en entr´e d`s qu’il est capable de r´aliser des actions e e e e un peu complexes. un peu de rigueur quant ` la manipulation de a la pile de retour est n´cessaire... Les param`tres seront empil´s par l’appelant juste avant l’appel. Il est ´galement courant qu’un sous-programme ait besoin de variables locales. e e e e e 4. mov call .4..4. Enfin. LES SOUS-PROGRAMMES 4. si n´cessaire.2 Passage de param`tres dans la pile e Le passage de param`tres par la pile permet de tout faire.. Nous d´crivons maintenant dans le d´tail chacun de ces m´canismes. Nous traitons de tous ces m´canismes dans cette e section.1 Passage de param`tres par registre e Le mode de passage de param`tres le plus simple consiste ` passer la valeur dans un registre : l’appelant e a charge un registre avec la valeur ` passer . cx boucle1 cx 4. C’est de cette mani`re que tous les langages e e de haut niveau passent leur param`tres aux proc´dures et fonctions. l’appel´ r´cup`re la valeur dans ce mˆme registre... e e e e e un espace dans la pile pour y mettre la valeur de ses variables locales. 1 ax.52 CHAPITRE 4. ret facto endp Appel´ e ax. mov call . ax ax.. a e e e e Appelant . facto proc . 8 facto . il e est ´galement courant qu’un sous-programme ait des param`tres en sortie (r´sultat) ou renvoie une valeur e e e (comme une fonction dans un langage de haut niveau). Le processeur utilise implicitement la pile pour y empiler l’adresse de retour e des sous-programmes.. L’appel´ r´servera. tous ces m´canismes vont ˆtre implant´s ` l’aide e e e e a de la pile. Comme toujours. pour autoriser une flexibilit´ maximale. il se fera g´n´ralement par un registre.. facto proc push mov mov boucle1: mul loop pop ret facto endp Appel´ e ax. . Il y a donc une contrainte ` respecter lorsque l’on veut utiliser la pile : a Le microprocesseur doit imp´rativement trouver l’adresse de retour d’un sous-programme au e sommet de la pile lorsqu’il ex´cute une instruction RET..

.. on peut faire tout ce que l’on veut et cela fonctionnera....... . sbr ax bx cx sbr sp.. sa valeur doit ˆtre ´galement sauvegard´e. pop ret endp Appel´ e bp bp.1 – Pile apr`s ex´cution de l’instruction call... . nous devons d´cider d’un protocole commun aux sous-programmes appelants et appel´s e e quant ` la localisation des donn´es sur la pile. 6 proc push mov ... la convention est d’utiliser le registre BP pour acc´der ` la valeur des param`tres. e e Supposons que nous passions trois param`tres.. les valeurs des registres AX..[bp+8].. e Appelant . nous donnons le squelette d’un appel de sous-programme avec passage de param`tres. les valeurs des param`tres sont empil´es avant l’appel du sous-programme e e .. push push push call add . Nous savons que le processeur empile la valeur du registre a e IP quand il ex´cute une instruction CALL. La pile a alors la forme indiqu´e ` la figure 4.. e e æ Pour l’appel´.. Le sous-programme appelant est responsable du passage des e param`tres.. Aussi... e e e e e e e e Cette sauvegarde doit ˆtre r´alis´e par l’appel´. . PASSAGE DE PARAMETRES ET VARIABLES LOCALES 53 Si on respecte cette convention. . nous r´aliserons le passage de param`tres de la mani`re e a e e e suivante : l’appelant empile (par des instructions PUSH) la valeur des param`tres puis ex´cute l’appel du e e sous-programme (instruction CALL).[bp+4]. BX et CX. BP doit e e a e donc ˆtre initialis´ au d´but de l’ex´cution de l’appel´.. bp sbr Nous notons les points suivants : – dans l’appelant. .4. 4.1..[bp+6].. sp . e e e e Pour r´sumer. Par convention.. ..` 4. e a 6 Param`tres d’appel e Adresses croissantes Sauvegarde de ip lors du call sp - Fig. Aussi.. c’est-`-dire de leur empilage. .

utiliser des instructions e ee e POP modifie la valeur des registres. le sommet de pile contient l’adresse de retour . . on doit restaurer la valeur du registre BP pour que l’appelant n’ait e pas de probl`me. l’habitude e e veut que l’on ´crive les programmes comme il a ´t´ indiqu´ ici. x (ou y : en sortie de boucle. Pour e e e e ee cela. les deux variables contiennent la mˆme valeur) contient e la valeur du PGCD. LES SOUS-PROGRAMMES – dans l’appel´ (donc. 2 pour BX e e et 2 pour CX). Cependant. e a e – [bp+4] acc`de au dernier param`tre empil´ (donc la valeur du registre CX) e e e – [bp+6] acc`de au param`tre empil´ avant CX (donc la valeur du registre BX) e e e – [bp+8] acc`de au param`tre empil´ avant BX (donc la valeur du registre AX) e e e – en fin de sous-programme appel´.54 CHAPITRE 4. la zone m´moire utilis´e pour stocker des param`tres doit ˆtre lib´r´e. la valeur du registre e aee e BP est empil´e e – la valeur du registre BP est initialis´e avec la valeur du sommet de pile contenue dans SP e – on peut acc´der maintenant ` la valeur des param`tres via le registre BP. on modifie simplement la valeur du registre pointeur de sommet de pile SP en lui ajoutant la valeur 6 qui est le nombre d’octets occup´s sur la pile par les valeurs empil´es (2 pour AX. la valeur du compteur ordinal IP ` ´t´ empil´e sur 2 octets). un RET peut donc ˆtre ex´cut´ e e e e e en toute s´curit´ e e – de retour dans l’appelant. ce qui peut amener des effets ind´sirables e Nous donnons un exemple d’appel de sous-programme : un sous-programme qui calcule le PGCD de deux nombres pass´s en param`tre. On aurait pu ´galement lib´rer la pile avec des instructions POP. C’est le rˆle de l’instruction POP e o – apr`s l’ex´cution du POP. Pai ailleurs. Ainsi. e e L’algorithme utilis´ est le suivant : soit ` calculer le PGCD de x et y : e a – Tant-que x = y Faire – Si x > y Alors x ← x − y – Sinon Si x < y Alors y ← y − x – Fait Sortant de la boucle.

sp ax . PASSAGE DE PARAMETRES ET VARIABLES LOCALES 55 Appelant .4. Les locales sont. empile x ax. la solution e e e e e e e la plus simple consiste. 453 ax .3 Variables locales Nous abordons maintenant le probl`me des variables locales. une fois sauvegard´e la valeur des registres en d´but de sous-programme. ` r´server e e a e de la place dans la pile pour y mettre la valeur des locales. sauvegarde de bx . 36 ax . que nous e devions sauvegarder la valeur des registres DI et SI et que nous ayons besoin de 10 octets pour stocker des variables locales. .. Supposons que nous passions deux param`tres. Celui-ci va ´galement ˆtre r´solu en utilisant e e e e la pile de retour. Cela donne la configuration de la figure 4.4. [bp+6] . Pour cela. la gestion des locales doit-elle ˆtre enti`rement r´alis´e dans l’appel´. par d´finition. BX. bx sup . charge y dans ax bx. ax tq1 affiche_nombre bx ax bp On suppose que l’on dispose du sous-programme affiche_nombre qui affiche le r´sultatun nombre ` e a l’´cran. saut si y>x ftq1 . bx tq1 bx. Aussi. pgcd ax. mov push mov push call add . uniquement connues du sous-programme o` elles sont e u d´clar´es.2. charge x dans bx ax.. ax et bx ax.` 4. [bp+4] . 4 proc push mov push push mov mov tq1: cmp jg je sub jmp sup: sub jmp ftq1: call pop pop pop ret pgcd endp Appel´ e bp bp. sortir si x=y ax. æ Nous donnons le squelette d’un appel de sous-programme avec passage de param`tres et d´finition de e e variables locales.. empile y pgcd sp. e 4. les valeurs des registres AX..

...2 – Pile apr`s r´servation d’espace pour les variables locales. .. 4... 10 ... . LES SOUS-PROGRAMMES Param`tres d’appel e Sauvegarde de ip lors du call 6 Sauvegarde de bp Adresses croissantes Sauvegarde des registres sp - Variables locales Fig. 6 proc push mov push push sub .[bp+6]. add pop pop pop ret endp Appel´ e bp bp. ..[bp+4].. 10 si di bp sbr Le sous-programme appelant ressemble ´norm´ment au cas pr´sent´ plus haut de passage de param`tres e e e e e ... push push call add .56 CHAPITRE 4..[bp-6]. ... ..... sbr ax bx sbr sp.. sp. .... sp di si sp... e e Appelant .....

` 4... mov push call . e une fonction sera un sous-programme qui retournera une valeur. Par exemple. – en fin d’appel´.. En assembleur. selon la e e taille des donn´es. 10) qui pourront ˆtre manipul´s e e e librement dans le sous-programme et dont le rˆle est de contenir la valeur des variables locales o – l’acc`s aux variables locales se fera d`s lors par un adressage du genre [bp-6] . PASSAGE DE PARAMETRES ET VARIABLES LOCALES et n’appelle donc aucun commentaire particulier.4 Retour d’une valeur par un sous-programme : les fonctions en assembleur Dans un langage de haut niveau. [bp+4] ax. le sous-programme suivant calcule la valeur de la factorielle du nombre pass´ en param`tre e e dans la pile et renvoie cette valeur dans le registre AX : Appelant .4. que le programmeur doit d´finir lui-mˆme l’utilisation e e e e de ces 10 octets. sp cx cx. une fonction est une proc´dure qui retourne une valeur.. e 4.4. [bp-15]. Notons. nous notons les points suivants : e – la sauvegarde (comme auparavant) du registre BP – l’initialisation du registre BP pour qu’il pointe au sommet de la pile 57 – la sauvegarde de la valeur des registres DI et SI. la valeur renvoy´e est plac´e e e dans un registre. Notons que BP pointe sur la valeur de la sauvegarde du registre DI – la r´servation de 10 octets sur la pile (par l’instruction sub sp. facto proc push mov push mov mov boucle1: mul loop pop pop ret facto endp Appel´ e ax. Par convention. DI et BP. c’est tr`s important. Pour l’appel´. on lib`re la zone de pile utilis´e pour stocker la valeur des variables locales (instruction e e e ADD) – on restaure ensuite la valeur d’entr´e des registres SI. 8 ax facto bp bp.. 1 cx boucle1 cx bp ..

58 CHAPITRE 4. LES SOUS-PROGRAMMES .

e e e ..1.) 5.59 Chapitre 5 Les interruptions du DOS Nous pr´sentons ici tr`s succinctement quelques interruptions du BIOS qui nous serons utiles pendant e e les TPs pour. par exemple. L’appel se fait via l’instruction int 21h. ah. e a e 5. 21h ah. ’a’ ah. Le registre ah contient un num´ro qui r´f´rence la fonctione ee nalit´ que l’on veut utiliser (9 pour afficher une chaˆ de caract`res. ds. Les caract`res 13 et 10 sont les codes ASCII des 2 caract`res constituant un retour-chariot. toutes les op´rations d’entr´es/sorties sont r´alis´es par interruptions BIOS. 1 pour saisir la frappe d’un caract`re e ıne e e au clavier.1 Affichages de caract`res ` l’´cran e a e Afficher un caract`re ` l’´cran e a e mov mov int dl.data db . dx. 21h @data ax 9 msg 4ch affiche le message hello world ` l’´cran. D’une mani`re a e e e g´n´rale.2 msg Afficher un message ` l’´cran a e .. 10. 2 21h affiche le caract`re a ` l’´cran.1 5.code mov mov mov lea int mov int end ’hello world’. . ’$’ ax. La chaˆ de caract`res doit imp´rativement se terminer par un a e ıne e e caract`re ’$’. e e e Sachons simplement ici qu’une interruption est une esp`ce de sous-programme pr´-existant dans la mae e chine.1. e e e e e e Le m´canisme d’interruptions sera d´crit en d´tail en cours. 13. afficher un message ` l’´cran ou saisir un caract`re au clavier.

toutes les op´rations sur ce fichier seront e e e e effectu´es en sp´cifiant cette poign´e. e e ea e 5.data db . dx. 8 21h lit un caract`re au clavier et le renvoie dans le registre al. bx. Notons que le retour-chariot est stock´ sous forme de deux caract`res successifs : le premier de e e code 13. ah.3.3 L’acc`s aux fichiers e Nous pr´sentons ici les interruptions ` utiliser pour effectuer les traitements de base sur les fichiers. les fichiers sont trait´s d’une mani`re assez similaire ` un langage ´volu´ comme Pascal. Ensuite.1 Principe En assembleur.2. e Saisie d’une chaˆ de caract`res ıne e msg .2 5.1 Saisir une frappe au clavier Saisie avec ´cho e Saisie d’un caract`re e mov int ah.2. e e . cx. ds. A un instant donn´. plusieurs fichiers peuvent avoir ´t´ ouverts par un e e e ` e ee programme.code mov mov mov mov lea mov int 80 dup (?) ax. LES INTERRUPTIONS DU DOS 5.2 Saisie sans ´cho e mov int ah.3 pour un exemple complet de traitement de fichiers. le programme r´cup`re une poign´e. 21h @data ax 0 80 msg 3fh saisit une chaˆ de caract`res au clavier d’au plus cx caract`res et la stocke dans la variable msg qui est ıne e e d´clar´e comme un tableau de 80 octets (soit 80 caract`res). que ce soit en lecture ou en ´criture. On e a se reportera ` 6. il faut pr´alablement e e e e ` l’ouvrir. Chacun a une poign´e diff´rente laquelle permet au programme de les distinguer. le second de code 10. e e a e e Pour pouvoir acc´der aux donn´es d’un fichier. 5. 1 21h renvoie dans le registre al le code du caract`re lu au clavier. Ce caract`re n’est pas affich´ ` l’´cran. a 5.60 CHAPITRE 5. A l’ouverture. Le nombre de caract`res lus est plac´ dans le e e e e e registre ax.

2 Cr´ation d’un fichier e Avant l’appel – cx contient la valeur 0 . L’appel a le format suivant : mov int ah.` 5. L’ACCES AUX FICHIERS 61 5.3. e 2 pour les deux . e Apr`s l’appel e Le bit C du registre flags vaut 1 si une erreur est survenue. Il ne peut plus ˆtre acc´d´ via sa e e e e poign´e.3.3. Sinon.3 Ouverture d’un fichier Avant l’appel – al contient le mode d’acc`s : e 0 pour lecture. – ds:dx pointent sur le nom de fichier. Si on veut l’acc´der ` nouveau. 3dh 21h 5. C’est une chaˆ ıne de caract`res termin´e par un e e caract`re ASCII de code 0. C’est une chaˆ ıne de caract`res termin´e par un e e caract`re ASCII de code 0. 3eh 21h .3. le fichier est ferm´. le registre ax contient la poign´e sur le fichier ouvert. e Apr`s l’appel e Le bit C du registre flags vaut 1 si une erreur est survenue. 1 pour l’´criture. 3ch 21h 5. e e L’appel a le format suivant : mov int ah. e L’appel a le format suivant : mov int ah. e e a il faudra le r´-ouvrir au pr´alable. – ds:dx pointent sur le nom de fichier. Sinon.4 Fermeture d’un fichier Avant l’appel – bx contient la poign´e du fichier ` e a fermer Apr`s l’appel e Le bit C du registre flags vaut 1 si une erreur est survenue.

62 CHAPITRE 5.6 ´ Ecriture dans un fichier Avant l’appel – bx contient la poign´e du fichier e .4 pour un exemple d’utilisation de cette interruption. e ae de Apr`s l’appel e Le bit C du registre flags vaut 1 si une erreur est survenue. les registres contiennent les information suivantes : ch heures cl minutes dh secondes dl centi`mes de secondes e Voir la section 6. En e principe. e On peut utiliser cet appel pour lire une chaˆ de caract`res tap´s au clavier. e a nombre de Apr`s l’appel e Le bit C du registre flags vaut 1 si une erreur est survenue.3. Sinon. il faut que bx ıne e e contienne la valeur 0 en entr´e. le registre ax contient le nombre de caract`res lus. L’appel a le format suivant : mov int ah. c’est le nombre de caract`res e qui devait ˆtre lus ` moins que la fin de e a fichier ne soit atteinte.5 Lecture dans un fichier Avant l’appel – bx contient la poign´e du fichier e .3. Sinon. a mov int ah. telle qu’elle est stock´e dans l’ordinateur (s’il e n’est pas ` l’heure.4 Lire l’heure courante La fonction 2ch de l’interruption 21h lit l’heure courante. La lecture s’effectuera sur au plus cx caract`res et au plus jusqu’` la frappe e e a d’un retour-chariot. 2ch 21h Au retour de l’appel. – cx contient le caract`res ` lire . LES INTERRUPTIONS DU DOS 5. e e – ds:dx pointent sur le tampon contenant les caract`res ` ´crire. 3fh 21h 5. Pour cela. le registre ax contient le nombre de caract`res ´crits. – cx contient le nombre caract`res ` ´crire . – ds:dx contient l’adresse du tampon o` il faut stocker les cau ract`res lus. e ae L’appel a alors le format suivant : mov int ah. cela ne donnera pas la bonne heure). 40h 21h 5. .

LIRE LA DATE COURANTE 63 5. si la date n’est pas bonne... 1 : lundi. cela ne donnera pas la bonne date). les registres contiennent les information suivantes : al jour de la semaine cod´ (0 : dimanche. . 2ah 21h Au retour de l’appel.5.) e cx ann´e e dh mois dl jour . telle qu’elle est stock´e dans l’ordinateur e (comme pour l’heure. mov int ah.5 Lire la date courante La fonction 2ah de l’interruption 21h lit la date courante.5.

64 CHAPITRE 5. LES INTERRUPTIONS DU DOS .

on peut encore ´crire la boucle sous la forme suivante : e a e e repeter: lire (c) si c # ESC alors afficher (c) jmp repeter fin_si .1 Cas 1 : lire une suite de caract`res au clavier e Probl`me ` r´soudre e a e ´ Ecrire un programme qui lit des caract`res frapp´s au clavier et les affichent ` l’´cran tant que l’utilisateur e e a e n’appuie pas sur <esc>.65 Chapitre 6 ´ Etudes de cas 6. Principe Faire une boucle : repeter lire (c) si (c # ESC) alors affiche (c) fin_si jusque c = ESC En accord avec ce qui est dit sur les boucles repeter dans la m´thodologie de programmation en asseme bleur. on doit tout d’abord transformer cette boucle en : repeter: lire (c) si c # ESC alors afficher (c) fin_si si c # ESC alors jmp repeter fin_si Puisque les deux si r´pondent ` la mˆme condition.

66 Ce que nous pouvons traduire en assembleur : Programme . plusieurs techniques sont envisageables.DATA dw . @data ax [valeur] 16 1 valeur boucle: .MODEL . Principe Afficher l’un apr`s l’autre les bits du nombre en effectuant une boucle du genre : e pour b := 1 a 16 faire si (valeur.bit[b] = 0) alors afficher (’0’) sinon afficher (’1’) fait Pour acc´der aux bits du nombre. 27 . @data ds. ds.CODE mov mov mov int cmp je mov mov int jmp mov int END SMALL ´ CHAPITRE 6. 27 est le code ASCII de la touche <Esc> fin dl.MODEL . 8 21h al.DATA . ax ah. Remarquons qu’en utilisant une instruction ROL. on sait s’il faut afficher e un ’0’ ou un ’1’. bx.CODE mov mov mov mov rol SMALL 100h 52612 ax. La plus simple consiste ` e a d´caler vers la gauche les bits du nombre (instruction SHL ou ROL) en pla¸ant le bit qui “d´borde” dans le e c e C du registre d’´tat. al ah. 2 21h boucle ah. ee e Programme . la e e valeur a ´t´ restaur´e. En testant ensuite ce bit C (avec une instruction JC ou JNC). une fois les 16 d´calages effectu´s.2 Cas 2 : afficher un nombre en base 2 Probl`me ` r´soudre e a e Afficher la valeur en binaire d’un nombre. ETUDES DE CAS boucle: fin: ax. cx.4ch 21h 6.STACK . bx.

’$’ db ’Erreur a l’’ouverture’. Notons que cette action lit effectivement ν caract`res. Filename int 21h jc err1 . En g´n´ral. ’0’ print dl. 13.MODEL SMALL .ax . 13. Filename Buffer err1_msg err2_msg . 0 db 100 dup (?).STACK 100H . 2 21h boucle ah. on a lu les ν < σ derniers caract`res du fichier. a e Principe Le principe de l’algorithme est le suivant : – ouverture du fichier – r´p´ter e e – lire les σ caract`res suivants du fichier et les mettre dans une zone m´moire pr´vue pour cet usage e e e (un tampon). e – afficher ν caract`res du tampon ` l’´cran e a e – jusqu’` ce que ν = σ a – fermer le fichier Programme .3 Cas 3 : Afficher le contenu d’un fichier Nous montrons sur un exemple l’utilisation des interruptions d’acc`s aux fichiers. CAS 3 : AFFICHER LE CONTENU D’UN FICHIER jc mov jmp mov mov int loop mov int END un dl. pr´paration de la boucle e .DATA DB ’toto’. .4ch 21h 67 un: print: fin: affiche 1100110110000100 qui est bien la repr´sentation binaire de 52612. 10. mov ah. ν = σ. initialisations . ’$’ db ’Erreur a la lecture’. Si la fin e e e de fichier est atteinte pendant la lecture. e Probl`me ` r´soudre e a e Afficher le contenu d’un fichier ` l’´cran.3.@data mov ds. mov ax. .6. ouverture du fichier mov al. ouverture et test d’existence du fichier . ’$’ .0 .3dh .CODE . 10. acc`s en lecture e lea dx. . le fichier n’existe pas -> erreur . ’1’ ah. e 6.

3fh . lea dx. a e Principe Il suffit de lire l’heure courante via l’interruption BIOS ad hoc et d’afficher le contenu des registres d’une mani`re compr´hensible pour un ˆtre humain.DATA db ’Il est : $’ db ’h $’ db ’m $’ db ’s. 3eh . ax . err1_msg jmp affiche_msg err2: .@data mov ds. traitements des erreurs . ’$’ mov ah. lecture du fichier int 21h jc err2 .CODE mov ax. err2_msg jmp affiche_msg affiche_msg: mov ah.9 int 21h jmp fin fin: mov ah. 100 mov ah.9 int 21h cmp cx. mov cx. sauvegarde de la poign´e e lea dx. ch1 ch2 ch3 ch4 .ax .68 mov bx. Ce programme affiche l’heure courante . . .4 Cas 4 : afficher l’heure courante Probl`me ` r´soudre e a e Afficher l’heure courante ` l’´cran sous une forme lisible. . . mov cx.MODEL SMALL .4Ch int 21h END ´ CHAPITRE 6. le fichier ne peut etre ouvert . 100 je boucle . err1: . ax mov si. lea dx. e 6. . boucle: . e e e Programme . Buffer . erreur lors de l’acc`s au contenu du fichier e . lecture des 100 caract`res suivants du fichier e .STACK 100H . fin du traitement : mov ah. affichage a l’ecran des caract`res lus e . $’ . . ax mov si+Buffer. ETUDES DE CAS On a suppos´ que le fichier se nomme toto. fermeture du fichier int 21h jmp fin .

affiche les secondes . les deux chiffres ont ete transformes en code ASCII . maintenant.2ch int 21h . . ch: heures . .2 int 21h . on affiche le chiffre des dizaines mov ah.dh call aff_nb . on a : . lecture de l’heure courante . offset ch3 call aff_str mov al. offset ch4 call aff_str mov al.dl call aff_nb .2 int 21h pop ax pop dx ret ENDP . .6. cl: minutes . .4Ch int 21h . ah. PROC . affiche les minutes . . 0 mov dl. code en hexadecimal se trouvant dans le registre al. . maintenant. le sous-programme aff_nb affiche la valeur du nombre .ch call aff_nb . dl: 1/100 secondes . le sous-programme aff_str affiche la chaine de caracteres . . dans le segment . Ce nombre doit avoir une valeur < 100. . 10 div dl . affiche les heures . mov ax. push dx 69 fin: aff_nb aff_nb aff_str . . mov ah. offset ch2 call aff_str mov al. . ax or dx. push dx push ax mov ah.cl call aff_nb . dh: secondes . mov ah. le chiffre des unites mov dx. affiche les centi`mes de secondes e . dont l’offset se trouve dans le registre ax. . al contient le chiffre des dizaines. mov ax. . CAS 4 : AFFICHER L’HEURE COURANTE . dh mov ah. 3030h . mov ax. offset ch1 call aff_str mov al. on affiche le chiffre des unites xchg dl. .4. mov ax. courant. PROC . .

9 21h ax dx ´ CHAPITRE 6.ax ah. ETUDES DE CAS aff_str .70 push mov mov int pop pop ret ENDP END ax dx.

. e Que peut-on faire avec un debugger ? Sans entrer tout de suite dans les d´tails. du segment de donn´es. on indique les instructions o` l’on veut que le programme s’arrˆte. ex´cuter le programme sous le debugger ou directement sous DOS ne change rien. e e e e 1.1 Lancement et pr´sentation du debugger e Lancement du debugger Apr`s avoir obtenu un programme ex´cutable (que nous appellerons ici prg. il est important de comprendre avant tout ce que l’on peut e attendre d’un debugger et le principe g´n´ral de son utilisation. A. . la pile. æ Notons imm´diatement que l’on quitte le debugger en tapant Alt-X. s’il boucle. . le contenu de la m´moire ou de la pile. si ce n’est que l’on pourra e ensuite consulter le contenu des registres. Une fois arrˆt´. on e a u e ee pourra consulter ` loisir le contenu des registres. C’est un outil indispensable pour simplifier et acc´l´rer la e ee mise en point de programmes. on e e a lance la commande : td2 prg L’´cran s’efface et affiche une interface avec une fenˆtre dont on peut modifier la taille avec la souris.exe ` titre d’exemple). Une e e barre de menus est disponible en haut de l’´cran. C’est-`-dire. Dans ce cas.1.71 Annexe A Introduction ` l’utilisation du a debugger Nous indiquons ici en quelques mots l’utilisation du debugger. une fois dans le debugger. un debugger aide (grandement) ` r´pondre aux questions suivantes : a e – pourquoi mon programme ne fonctionne-t-il pas? – pourquoi mon programme boucle-t-il? – o` se plante mon programme? u Pour cela. celui-ci va s’ex´cuter sans e e s’arrˆter avant sa terminaison normale (donc.. a e Nous d´taillons maintenant le contenu de la fenˆtre et pr´sentons les fonctionnalit´s les plus utiles. on peut placer des points d’arrˆt dans le programme afin qu’il s’y e arrˆte 1 . il ne s’arrˆtera pas plus sous le debugger que si on l’ex´cute sous e e e DOS). L’´cran ressemble alors ` ce qui est pr´sent´ ` la figure e e a e ea A. Un debugger est un outil qui permet d’ex´cuter instruction par instruction un programme tout en suivant en permanence l’´volution du contenu e e des registres. e e Sans en attendre de miracles. il est important de bien noter que si l’on ne place pas de points d’arrˆt dans le programme.

. .. .. Remet le debugger dans son ´tat initial. si l’on en a plac´ . e – Step over ex´cute la prochaine instruction et s’arrˆte .1 La fenˆtre de debuggage e Le menu Run Parmi d’autres possibilit´s.72 ` ANNEXE A. e e – Go to cursor ayant cliqu´ sur une instruction. La vitesse d’ex´cution est r´glable et est e e e e demand´e ` l’utilisateur .. . le programme d´bute ou poursuit son ex´cution jusqu’` e e e a atteindre cette instruction .. e e . – Animate d´clenche l’ex´cution instructions par instructions. ce menu vous propose : e – Run lance le programme. e e A. comme a e e e si l’on n’avait pas encore lanc´ l’ex´cution du programme. Sinon. Il ne s’arrˆte que lorsqu’il arrive ` son terme ou sur ee ee e a e e a le point d’arrˆt (cf. il d´marre ` son d´but.. consid`re l’ex´cution de l’ensemble du sous-programme ee e e comme un pas d’ex´cution .. A. e a – Prg Reset remise ` z´ro de l’ex´cution du programme. le programme poursuit son ex´cution l` o` e ea e e e a u il avait ´t´ arrˆt´. – Trace into arrˆt´ sur une instruction call..1.... INTRODUCTION A L’UTILISATION DU DEBUGGER adresse code instruction 6 mn´monique e op´rande e ax bx cx dx si di bp sp ds es ss cs ip 0000 0000 0000 0000 0000 0000 0000 0000 .. e e – Until return ex´cute les instructions qui suivent jusque la fin du programme ou jusqu’` la prochaine e a instruction ret . Si son ex´cution a d´j` d´but´e. 0000 c=0 z=0 s=0 o=0 p=0 a=0 i=1 d=0 Segment de code Segment de donn´es es e adresse 8 valeurs hexad´cimales e 8 caract`res e ASCII correspondants Segment de pile Fig.1 – La fenˆtre du d´bugger. plus loin) suivant.

2. d’un indicateur. en entrant sa nouvelle valeur et en validant. e Il existe deux mani`res de mettre en place des points d’arrˆt : e e – soit implicitement en cliquant sur une instruction du programme et en lan¸ant ensuite l’ex´cution du c e programme par un Go to cursor – soit explicitement en cliquant sur une instruction du programme et en choisissant dans le menu Breakpoints l’option At d’y placer un point d’arrˆt.´ A.3 o` le deuxi`me op´rande est une valeur e u e e imm´diate sont transform´es en une s´quence de 3 instructions shr al.3 Remarques Il faut noter que certaines instructions n’apparaissent pas sous le debugger comme vous avez pu les taper dans votre programme source. en g´n´ral ` l’ex´cution des premi`res instructions du proe e e e a e e gramme.. e e e Les instructions du genre push 23.1 Quelques op´rations de base e Afficher le segment de donn´es e Au lancement de td.. on obtiendra : e push push mov pop ax bp word ptr [bp+2]. sont transform´es en une a e e s´quence de plusieurs instructions.2. Elle l’est quand on continue l’ex´cution du programme. A. A son ex´cution (lancement par Run. un menu apparait. e e Le debugger demande l’adresse ` partir de laquelle il doit afficher le contenu de la m´moire dans la fenˆtre.3 Modifier la valeur d’un registre.2 A. le programme s’arrˆtera autoe e matiquement ` chaque fois qu’il arrivera sur une instruction o` on a plac´ un point d’arrˆt. c’est toujours shl qui e sera affich´e. les instructions de d´calages du genre shr al. Pour cela. e e Ensuite. e e e e A. Par exemple. a . d’une donn´e en m´e e moire On peut facilement modifier la valeur d’un registre. ds:0 ou 53DA:14. en cliquant dans la fenˆtre avec le bouton droit de la souris. 17 bp qui empile bien la valeur 23 (c’est-`-dire 17h). d’un indicateur du registre d’´tat ou un octet en e m´moire en cliquant dessus. quelle que soit celle que vous avez tap´ dans le source de votre programme. Aussi. Une fois ds initialis´.. A. S´lectionner Goto. selon ses besoins. QUELQUES OPERATIONS DE BASE Les points d’arrˆt e 73 Un point d’arrˆt est un endroit dans le programme o` on indique que l’on veut que celui-ci arrˆte son e u e ex´cution. . le debugger ne connaˆ pas l’emplacement en m´moire du segment de donn´es. e Par ailleurs.). On peut placer plusieurs points d’arrˆt dans e e ` le programme. les instructions sal et shl sont synonymes.1. Go to cursor. ouvrir un “dump” m´moire en s´lectionnant Dump dans le menu View. L’instruction a u e e n’est pas ex´cut´e avant l’arrˆt du programme.. c’est-`-dire push d’une valeur imm´diate. e A. pour celle-ci. a e e On pourra alors taper es:0. Ainsi.2 Afficher le contenu d’un segment m´moire quelconque e On peut visualiser le contenu de la m´moire ` partir de n’importe quelle adresse en sp´cifiant un num´ro e a e e de segment et un offset.2.2.. on peut visualiser le contenu du registre de segment dans une fenˆtre en e e choisissant dans le menu View l’option Dump. comme nous l’avons vu. le ıt e e registre ds ´tant initialis´ par le programme.

INTRODUCTION A L’UTILISATION DU DEBUGGER .74 ` ANNEXE A.

. a e B... le syst`me d’exploitation passe automatiquement au e e programme les variables d’environnement (c’est-`-dire.. acronyme de Program Segment Prefix.75 Annexe B Param`tres de la ligne de commande e et environnement Lorsqu’on lance un programme. Ce PSP est toujours compos´ de 256 octets. les variables positionn´es par la commande MSDOS a e set).2 La ligne de commande Nous indiquons sur des exemples la structure de la ligne de commande telle qu’elle est stock´e dans le e PSP.. outre les param`tres de la ligne de commande... Tout programme en cours d’ex´cution poss`de une structure de donn´es qui lui est propre est qui porte e e e le doux nom de PSP. a e e – ` l’offset 80h. on tape la commande : prg a b c d e on trouvera les informations suivantes dans le PSP : 80: 0A 20 65 20 66 20 67 20 a b c 88: 68 20 69 0D . Ainsi. la ligne de commande termin´e par un caract`re de code 0Dh . nous indiquons comment ces informations peuvent ˆtre acc´d´es depuis un e e e e programme assembleur.1 L’acc`s au PSP e L’interruption 21h renvoie le num´ro du segment contenant le PSP si on place la valeur 62h dans le e ` registre ah. Par e e ailleurs. si on tape les commandes : prg a b c d e > toto prg a b c d e < titi > toto . on trouve : – ` l’offset 2ch le num´ro du segment o` est situ´ l’environnement .. d e Il faut noter que les redirections ne font pas partie des param`tres de la commande et n’apparaissent pas e dans le PSP.. on r´cup`re le num´ro du segment contenant le PSP dans le registre bx. a B. A son retour. on peut sp´cifier des param`tres dans la ligne de commande (des noms e e de fichiers par exemple) quipourront ˆtre pris en compte par le programme durant son ex´cution. e Parmi ceux-ci. Si sous MS-DOS.. Le PSP e e e occupe les octets d’offset 0 ` 255 de ce segment. le nombre de caract`res de la ligne de commande (sans compter le 0Dh). a e u e – ` partir de l’offset 81h. Dans la pr´sente annexe.

COM PROMPT= T EMP=C:\TEMP PATH =C:\DOS. valeur > Le nom d’une variable et sa valeur sont des chaˆ ınes de caract`res. La liste des e e couples se termine elle-aussi par un caract`re de code 00. e e B. .C :\BORLANDC\BIN. nous donnons ci-dessous un programme qui affiche la premi`re variable (son e nom et sa valeur). PARAMETRES DE LA LIGNE DE COMMANDE ET ENVIRONNEMENT prg a b c d e | more on aura toujours le mˆme contenu dans le PSP (celui donn´ plus haut). Chaque couple est termin´ par un caract`re ASCII de code 00. Dans le PSP.76 ` ANNEXE B. Afin d’illustrer notre propos.3 L’environnement L’environnement d’un programme est un ensemble de couples < nom de variable.) e u e Un exemple de contenu de la zone stockant l’environnement est donn´ ci-dessous : e 00: 10: 20: 30: 40: 50: 43 4e 45 3d 3a 00 4f 44 4d 43 5c 4d 2e 50 3a 42 53 43 3d 5c 4f 50 4f 43 44 52 45 4d 3a 4f 4c 43 00 5c 53 41 3d 50 54 3b 4e 43 52 45 43 44 3a 4f 4d 3a 43 5c 4d 50 5c 5c 43 50 00 42 42 4f 54 50 41 49 4d 3d 41 54 4e 4d 00 54 3b 3b 41 54 48 43 00 COMSPEC=C:\COMMA ND. les deux derniers caract`res de la zone e e m´moire o` est stock´ l’environnement ont tous deux la valeur 00. (Donc. ils sont s´par´s par un e e e signe = pour les distinguer.C:\BAT.

chargement de ds avec le numero du segment . on remet un caractere nul la ou on avait mis . un ’$’.[ds:2ch] mov ds.0 .4Ch int 21h END .0 jne boucle1 .CODE mov ah.’$’ mov ah.bx . On met un ’$’ en fin de chaine pour pouvoir . . du segment du PSP mov ds.ax .9 int 21h .0 inc si cmp BYTE PTR [si]. Elle .MODEL SMALL . contenant l’environnement mov ax. l’afficher avec l’interruption classique .3. programme s’arrete.62h . fin du programme mov ah. (Cela ne sert a rien ici puisque le . chargement du numero int 21h . si contient l’offset du caractere nul. L’ENVIRONNEMENT 77 boucle1: fin: .B. boucle de recherche de la fin de la . et on appelle l’interruption en question mov BYTE PTR [si]. est reperee par un octet de valeur nulle mov si.STACK 100H .) mov BYTE PTR [si]. premiere variable d’environnement.

PARAMETRES DE LA LIGNE DE COMMANDE ET ENVIRONNEMENT .78 ` ANNEXE B.

bx. div. imul. idiv et les diff´rentes versions de loop) . e e e – si. Il peut ˆtre utile e e e d’indiquer ici quelques conventions. appel de sous-programmes 4) . Ne pas le modifier a priori .79 Annexe C Du bon usage des registres Mis ` part quelques registres tr`s sp´cifiques dont l’emploi est impos´ par le processeur (par exemple. Ne doit pas ˆtre modifi´ . appel de sous-programmes e 4) . – ds : segment de donn´es : segment dans lequel sont en g´n´ral r´f´renc´es automatiquement les donn´es . cx.. e e ınes – sp : pointeur de sommet de pile. utilis´s par certaines instructions de traitement de chaˆ . – flags : registre d’´tat. – bp : souvent utilis´ pour sauvegarder sp en cas de besoins (cf. – ax. dx : registres de donn´es. le a e e e registre d’´tat est forc´ment le registre flags. Ils peuvent g´n´ralement ˆtre utilis´s librement. – ss : segment de pile. la plupart des registres peuvent ˆtre utilis´s dans diverses circonstances. Prudence extrˆme lors de sa manipulation (cf. e . di : offset de donn´es.). le num´ro du segment de code se trouve forc´ment dans le e e e e registre cs. . Ne pas le modifier . e – ip : compteur ordinal. Seuls ax et cx e e e e e ont parfois un usage r´serv´ (instructions mul. e e – cs : segment de code. e e e ee e e – es : segment de donn´es utilis´ sp´cifiquement par les instructions de traitement de chaˆ e e e ınes en liaison avec le registre di..

80 ANNEXE C. DU BON USAGE DES REGISTRES .

f / ? O _ o .e .4 $ 4 D T d t . 6. 4. e e .81 Annexe D Le codage ASCII On donne le code ASCII des caract`res usuels.c .5 % 5 E U e u . 0 @ P ‘ p . l’ordonn´e la dizaine (en e e hexad´cimal). K [ k { . le code ASCII du caract`re : est 3a.1 ! 1 A Q a q . 5.3 # 3 C S c s .0 2. < L \ l | .b + .2 " 2 B R b r .8 ( 8 H X h x .d = M ] m } . Aussi. 7.6 & 6 F V f v .9 ) 9 I Y i y .7 ’ 7 G W g w . > N ^ n ~ . L’abscisse indique le chiffre.a * : J Z j z . 3.

LE CODAGE ASCII .82 ANNEXE D.

Reserved Word used as a symbol Vous utilisez un mot r´serv´ comme ´tiquette. Pax exemple move ` la place de mov. e Illegal use of constant Utilisation d’une constante l` o` cela est interdit. Changez son nom.. en dehors des commentaires. Les modes existants e sont indiqu´s ` la section 2. e a Illegal number Erreur dans une constante num´rique. [si+ax]. Illegal indexing mode Utilisation d’un mode d’adressage index´ inexistant. Par exemple : mov a 4.2. 5. Par exemple : mov e ax.83 Annexe E Les messages d’erreur Nous indiquons ici les messages d’erreur les plus fr´quents qui peuvent survenir lors de l’assemblage d’un e fichier.model e e Need address or register Oubli d’un op´rande. e a Illegal immediate Utilisation d’une constante ` un endroit interdit.2 ` e e e e a ce propos. e e Labels can’t start with numeric characteres Une ´tiquette doit forc´ment commencer par une lettre. Par exemple : mov al.1. Voir la section 3. e e Model must be specified first La premi`re ligne d’un source assembleur.1. Un message d’erreur est affich´ sous la forme : e **Error** nom_de_fichier (num´ro_de_ligne) e message Illegal instruction Utilisation d’un mn´monique inexistant. Relative Jump out of range by xxx bytes L’´tiquette en op´rande d’une instruction de saut conditionnel est trop ´loign´e. e e e Symbol already defined: x . doit ˆtre . Par exemple : mov a u Invalid operand(s) to instruction Op´rande non accept´ par l’instruction. ax. ax+4. small.

e e e e e Too few operands to instruction Vous avez oubli´ un op´rande (ou deux).84 ANNEXE E. e ee e Value out of range Valeur incorrecte. e e e e e Symbol already different kind Vous d´finissez deux fois la mˆme ´tiquette de mani`re diff´rente. e e a ax. . LES MESSAGES D’ERREUR Vous d´finissez deux fois la mˆme ´tiquette de la mˆme mani`re. Unknown character Un caract`re inattendu a ´t´ rencontr´ dans une instruction. Par exemple : mov e e Undefined symbol Utilisation d’une ´tiquette qui n’a pas ´t´ d´finie. Par exemple : db 1024 alors qu’un octet a une valeur forc´ment inf´rieure ` 256. e ee e Unexpected end of file (no END directive) Votre source ne se termine pas par une directive END.

46 LEA. 38 SUB. 30 JL. 25 DB. 32 JNC. 51 PUSHF. 30 JGE. 30 JAE. 44 AAM. 30 JC. 51 RCL. 24 CALL. 37 LOOP. 20 AND. 23 DIV. 37 CMP. 30 CMPS.INDEX 85 Index AAA. 45 DEC. 30 JNE. 22 IMUL. 35 LOOPE. 21 NEG. 30 JP. 40 RET. 27 SAHF. 30 JS. 39 DAA. 22 IDIV. 29 XOR. 40 REPZ. 16 DW. 16 appel´. 27 ROR. 27 STC. 27 SAR. 30 JG. 28 MOVS. 37 CLD. 42 ADD. 51 PUSH. 47 e appelant. 35 LOOPNE. 20 TEST. 24 POP. 45 DAS. 30 JMP. 50 CLC. 26 RCR. 30 JCXZ. 35 MOV. 39 SHL. 30 JO. 30 JNP. 37 STD. 46 SAL. 51 POPF. 43 XCHG. 30 LAHF. 45 ADC. 37 STOS. 25 OR. 30 JBE. 29 LODS. 47 d´calage et multiplication par 2. 30 JLE. 23 JA. 40 REPE. 35 LOOPNZ. 44 AAS. 44 AAD. 23 NOT. 27 SHR. 40 REPNZ. 17 EQU. 50 ROL. 27 SBB. 30 JB. 30 JE. 26 REP. 28 e . 21 INC. 35 LOOPZ. 30 JNO. 38 MUL. 40 REPNE. 30 JNS. 43 SCAS.

49 sous-programmes. 47 Transfert de la valeur d’un registre de segment vers un autre registre de segment. 49 pointeur de pile.86 d´calage et division par 2. 28 e pile. 28 INDEX .

4. . . . . . . . . . . . 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 1. . . . . . . . . . .2 Les constantes . . . . . . . . . .1. . . . . . . . . . . . . 3. . . .1 Principe g´n´ral . . . . . . . . . . . .1. . . . . . . . . . e a 1. 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . .4 Compl´ment ` deux d’un nombre . . .4 Les instructions bool´ennes et logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . e 3. . .1 Les instructions arithm´tiques et logiques . . . . . . . . . . . . . . . . . . . . .3 Oppos´ d’un nombre . . . . . . . . . . .3 Boucles r´p´ter . . . . . . . . . . e e 3. . . .4 Le codage des nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Les instructions du 8086 3. . . . . . . . . . . . . . . . . . . . . e e 1. . . .4 Les boucles pour . . . . . . . . . . . . . . . .4. . . . . . . . .5 Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 La m´moire . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . 3 3 3 4 6 6 7 7 8 8 9 13 14 14 15 16 17 19 20 20 23 23 24 25 28 29 30 30 32 33 33 33 34 35 36 37 42 42 43 46 . . . . e 3. . . . . . . . . . .4. . . . . . . . . . . . . . . 2 Anatomie d’un programme en assembleur 2. . . 2. . . . . . . . . . . 3. . . .1 Instructions arithm´tiques . . . . . . . . . . .3 Exemples de codage de tests en assembleur 3. . 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Les instructions arithm´tiques . . . . . . . . .3. . . . . . . . .2 Boucles tant-que . 1. . .3. . .1. . . . . . . . . . . . . . . . . .3. . . e 3. . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . .1 Principe g´n´ral . . . .1. . . . . . . . . . . .1 Sp´cifier une donn´e en m´moire (une variable) e e e 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Les instructions de transfert . . . . . . . .5 Instructions diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e e 3. .2 L’assemblage . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Autres instructions . . . . .1. . . . . . 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Incr´mentation. . . . . . . . . .1 Un processeur. .3 Les d´clarations de variables .3 Les boucles en assembleur . . . . . . . . e 3. . . . . . . . . . . . . . . . . . e 3. . .1 Exemple . . . . . . . . . . . . . . . . . . . . . . .4. .3. . e 3. . . 1. . . . . .4. . . . .2 Les tests en assembleur . . . . . . .4. . . e 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . . .2 Les instructions d’ajustement d´cimal . . . . . . . . . . . . . . . . . . . .` TABLE DES MATIERES 87 Table des mati`res e 1 Introduction 1. . . . . .3 Codage d´cimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. . . . . .3 Les registres du 8086 . . .3. . . .2 Repr´sentation sign´e des nombres entiers . . . . .5 Extension du signe . . . . . . . .1.4. . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Le traitement des chaˆ ınes de donn´es . . . . . . . . . . . . . . . . . . . e e 3. . . . . . . . . .1. . 3. . . . . . . . . . . . . .3 Autres . . . . . . . . . . . . . . . . . . . . . . . . . . . e e 3. . . . . . . . . . . . . .5 Les instructions de d´calage et rotation . . . . 2. . . . . . . . . e 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 1. . . .1 Repr´sentation non sign´e des nombres entiers e e 1. 1. . . . . . . . . . . . . . . d´cr´mentation . . . . .2 Les instructions de comparaison . . . . . . . . en deux mots . . . . . . . . . 1. . . . . . . . . . . . . . . . . . .2. . . . . . . . . .

. . . . . . . . . . . . .1. . . . . 5. . . . . . . . . . . e 5. . . . . . . . . . . . . . . donn´e en e . . . . d’une A. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 5. a 4. . . . . 5. . . .2 La ligne de commande . . . . . . .1 L’appel d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . e A. . . . . . . . . . . .2 Cr´ation d’un fichier . . . . . . . . . . . .4 Retour d’une valeur par un sous-programme : les fonctions 5 Les interruptions du DOS 5. . . . e a e 5. 5. . . . . . . . . . 4. e e 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Lecture dans un fichier .2. . .3 L’environnement . e 4. . .3. . . . .1. . . . . . . . . . . . . . . . .2 Saisir une frappe au clavier . . . . . . . . . . . . . . . . . . .5 Lire la date courante .3 Variables locales . . . . . . . . . . . . . . . . . . . . . . . . d’un indicateur.3. 4. . . . . . ´ 5. . . e A. . . . . . . . . . . . . . . . . . . . . B Param`tres de la ligne de commande e B. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B. . . . . . . . . . . . . . . . . . . . . . . . C Du bon usage des registres et . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . .2. . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . . . . . e A. . . . . . . .3. . . . . . . . .4. . . . . . .3 R´sum´ . . . . . . .88 4 Les sous-programmes 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e 4. . . . . . . . . . . . . . . . . . . . . . . . . . e 5. . . . . . en assembleur . e 4. . 4. . . . . . . . . . . . . . . . . . . . . e B. . . . . . . . . . . m´moire . . . . . e a e 5. . . . . . . .2 Synoptique de l’appel d’un sous-programme . . . . . . 5.1 L’acc`s au PSP . .3. . . . . . . . . . . . . . . . . . . . . .1 Afficher un caract`re ` l’´cran . .2. . . .2. . . .2 Afficher un message ` l’´cran . . . . . . . . . . . . . . . . . . . . . . . . . . 5. .4 Passage de param`tres et variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. . . . . . . . . . a e 5. . . . . . . . . . . . . . . . .2. . . . . . . . . . . .1 Saisie avec ´cho . . . . . . . . . . . . .4 Lire l’heure courante . . . . . . . e 4. . . . . . . . A Introduction ` l’utilisation du debugger a A. . . . . . . . . .6 Ecriture dans un fichier . . . . . . . . . . . . . .2 Passage de param`tres dans la pile . . . . . . . . . .2. . . . . . . . . . . . . . . 4. .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Fermeture d’un fichier . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . environnement 75 . .2 Afficher le contenu d’un segment m´moire quelconque e A. . . . . . . . . . . . . . .2 Retour ` l’appelant . . . .1 Cas 1 : lire une suite de caract`res au clavier e 6. . . .1 Affichages de caract`res ` l’´cran . . . . . . . . . 5. . . . . . . . . . . . . . . . . .3 Cas 3 : Afficher le contenu d’un fichier . . . . . . . . . . . . . . . . . . . ´ 6 Etudes de cas 6. . . . 4. . . . . . . . . . . . . . . . . . . . . . . . .3 Remarques . . . . . . . .2 Quelques op´rations de base . . . . . . . . . . . . .2 Cas 2 : afficher un nombre en base 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 . . . . . . . . . . 6. . . . . . . . . . . . . . . . .2. . .3 Ouverture d’un fichier . . . . . . . . . . . . . . . . . . . .3 Modifier la valeur d’un registre. . . . . .3. ` TABLE DES MATIERES 47 47 47 47 48 48 49 49 49 50 52 52 52 55 57 59 59 59 59 60 60 60 60 60 61 61 61 62 62 62 63 65 65 66 67 68 71 71 72 73 73 73 73 73 . . . . . . . . .1 Lancement et pr´sentation du debugger . . . . . . . . . . . . . . . . . . . . . . . . e 5. . .2 Saisie sans ´cho . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 La pile d’appel de sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 La fenˆtre de debuggage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e A. . . . . . . . . . . . . 75 . . . . . . . . . . . . . . . . . . . . . . . . .3 L’acc`s aux fichiers . . . . . . . . . . . .2 Sauvegarde et restauration de contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . .1 Afficher le segment de donn´es . . . . . . . . . . . . . . . . . 76 79 . . . . . . . . . . . . . . . . .3 Appel de sous-programme sans passage de param`tre . . . . . . . . . . .1 Principe . . .1 Passage de param`tres par registre . . . . e 4. . . . . . . .1 Appels et retours de sous-programmes . . . . . . . . . . .3. . . . . . . . . . .4 Cas 4 : afficher l’heure courante . . . . . . . . . . .1 Principe g´n´ral .

` TABLE DES MATIERES D Le codage ASCII E Les messages d’erreur Index 89 81 83 85 .

Sign up to vote on this title
UsefulNot useful