Vous êtes sur la page 1sur 90

Assembleur i8086

Philippe Preux IUT Informatique du Littoral Anne universitaire 95 96 e

Avertissement
Ce document dcrit le langage dassemblage tudi et utilis dans le cadre des TP darchitecture. Il est e e e e avant tout ` considrer comme un manuel de rfrence. Il ne sagit pas den eectuer une lecture squentielle a e ee e du dbut ` la n. Les chapitres 1, 2 et 4 prsentent les principes de base. Les chapitres 3 et 5 sont ` utiliser e a e a en cas de besoin. Le chapitre 6 prsente des tudes de cas montrant comment crire un programme en e e e assembleur, depuis la spcication du probl`me, jusqu` son excution. e e a e Une r`gle dor (valable pour la programmation en assembleur mais aussi dans nimporte quel langage et e mme en toute gnralit en informatique) : e e e e Lordinateur ne se trompe jamais : il ne fait que ce quon lui demande de faire. Aussi, la programmation en assembleur tant quelque peu subtile, il sagit de rchir avant de commencer e e e a ` taper un programme, de continuer ` rchir pendant quon le tape, ` poursuivre leort pendant quon a e e a lassemble et que lon corrige les erreurs de syntaxe, et de ne pas se laisser aller quand enn, on en arrive ` son a excution qui donnera rarement le rsultat attendu du premier coup avant une bonne priode dentra e e e nement. Pendant tout ce temps, rappelez-vous la r`gle dor et gardez votre calme. Ca ne sert ` rien de snerver : e a e lordinateur a tout son temps et cest lui qui (( dcide )) si votre programme marche ou pas ! e On se reportera au document intitul (( Mthodologie de programmation en assembleur )) o` est dcortie e u e que la mani`re de concevoir et dcrire des programmes en assembleur. e e e An de simplier lexpos qui suit, nous nous en sommes tenus ` la programmation dans le mod`le e a e mmoire dit SMALL (ou TINY). Pour la programmation dans des mod`les mmoires plus tendus, on se e e e e rfrera au manuel de lassembleur. ee

Chapitre 1

Introduction
Dans ce premier chapitre, nous introduisons rapidement les notions de processeur, mmoire, adresse et e registre et dcrivons le codage des valeurs numriques. e e

1.1

Un processeur, en deux mots

Sans entrer dans les dtails qui seront vus en cours, nous prsentons le minimum ` savoir sur ce quest e e a un processeur. Un processeur constitue le cur de tout ordinateur : il excute les instructions qui composent les proe grammes que nous lui demandons dexcuter. Les instructions sont stockes en mmoire (en dehors du proe e e cesseur). Ces instructions (dont lensemble compose le langage dassemblage, ou assembleur) sont tr`s simples e mais nen permettent pas moins, en les combinant, de raliser nimporte quelle opration programmable. e e Pour excuter un programme, le processeur lit les instructions en mmoire, une par une. Il connait ` tout e e a instant ladresse (lendroit dans la mmoire) ` laquelle se trouve la prochaine instruction ` excuter car il e a a e mmorise cette adresse dans son compteur ordinal. e Les instructions agissent sur des donnes qui sont situes soit en mmoire, soit dans des registres du e e e processeur. Un registre est un lment de mmorisation interne au processeur et contenant une valeur. Les ee e registres sont en nombre tr`s limit, 14 en loccurence pour le 8086. Pour accder une donne en mmoire, e e e e e il faut spcier son adresse. Pour accder une donne dans un registre, il faut spcier son nom (chaque e e e e registre poss`de un nom qui est une cha de caract`res). e ne e Le 8086 est un processeur 16 bits, cest-`-dire quil traite des donnes codes sur 16 bits. a e e Pour terminer, on donne quelques dnitions : e un bit est une valeur binaire qui, par convention, peut prendre la valeur 0 ou 1 ; un octet est une donne code sur 8 bits ; e e un mot est une donne code sur 16 bits ; e e un Koctet est un ensemble de 1024 octets.

1.2

La mmoire e

La mmoire est une squence doctets, tous numrots de mani`re unique par un entier compris entre 0 e e e e e et N 1. On dit alors que la capacit de la mmoire est de N octets. On a toujours N qui est une puissance e e de 2 (N = 2m ). On appelle adresse eective (AE) dun octet en mmoire le numro qui lui est associ (cf. e e e g 1.1).

4 Adresses eectives 0 1 2

CHAPITRE 1. INTRODUCTION

N 1 = 2m 1

Fig. 1.1 Une mmoire de N octets. e

Pour le 8086, et donc pour nous programmeurs du 8086, un octet est dsign par un couple e e ( numro de segment, dplacement dans le segment ) e e qui constituent une adresse segmente (AS). e Un segment est un ensemble de 64 Koctets conscutifs. Le dplacement (ou oset) spcie un octet e e e particulier dans un segment (cf. g. 1.2). Segment et dplacement sont cods sur 16 bits et peuvent donc e e prendre une valeur comprise entre 0 et 65535. On a une relation entre adresses eectives et couple (segment, dplacement) sous la forme de lquation : e e adresse eective = 16 segment + dplacement e Une consquence de la relation nonce plus haut entre adresse eective et adresse segmente est quun e e e e octet dadresse eective donne peut tre accd de plusieurs mani`res. Plus prcisment, ` chaque AE e e e e e e e a correspond 212 = 4096 AS direntes (cf. g. 1.3). e Lors de son excution, un programme utilise plusieurs segments mmoire (cf. g. 1.4) : e e un segment contient les instructions du programme (le segment de code) ; un segment contient les donnes du programme (le segment de donnes) ; e e un segment contient la pile du programme (le segment de pile). Ce segment tr`s important sera dcrit e e au chapitre 4. Ces trois segments peuvent se situer nimporte o` en mmoire et mme se recouvrir partiellement ou u e e totalement. Leur attribution en mmoire est gnralement ralise automatiquement par le syst`me dexe e e e e e ploitation sans que le programmeur ait a sen soucier. En respectant un certain protocole (suivi dans ce ` manuel), on est certain de rfrencer le bon segment sans se poser de questions trop compliques. ee e

1.3

Les registres du 8086

Le 8086 poss`de 14 registres de 16 bits (cf. g. 1.5). Ce sont : e ax registre dusage gnral contenant des donnes. Les 8 bits de poids faible se nomment al et les 8 bits de e e e poids fort se nomment ah.

1.3. LES REGISTRES DU 8086

Adresses eectives 0 1 2

s0 1

octet ` loset d du segment N = s/16 a

65535

2m 1

Fig. 1.2 Adressage segment. En traits gras, on a reprsent le segment commenant a ladresse eective e e e c ` s e e s dont le numro est donc N = 16 . s doit tre un multiple de 16 pour tre le 1er octet dun segment. e

bx registre dusage gnral contenant des donnes. Comme ax, bx se dcompose en bl et bh. e e e e cx registre dusage gnral contenant des donnes. Comme ax, cx se dcompose en cl et ch. e e e e dx registre dusage gnral contenant des donnes. Comme ax, dx se dcompose en dl et dh. e e e e si registre dusage gnral contenant gnralement le dplacement dans un segment dune donne. e e e e e e di registre dusage gnral contenant gnralement le dplacement dans un segment dune donne. e e e e e e bp registre utilis pour adresser des donnes dans la pile (cf. section 4.4). e e sp registre pointeur de pile. Ce registre sera dcrit plus loin (cf. section 4.2.4). e ip registre pointeur dinstruction (compteur ordinal ). Ce registre indique la prochaine instruction ` excuter. a e ags registre dindicateurs de ltat du processeur. Certains bits de ce registre portent des noms. Ce sont e tous des indicateurs binaires : O le bit doverow est positionn par la plupart des instructions arithmtiques pour indiquer sil y a e e eut un dbordement de capacit lors du calcul (un nombre trop grand ou trop petit) e e D bit de direction. Il sera dcrit plus loin (cf. section 3.3.6) e S le bit de signe est positionn par la plupart des instructions arithmtiques pour indiquer le signe du e e rsultat (positif ou ngatif cf. section 1.4.2) e e Z le bit de zro est positionn par la plupart des instructions arithmtiques pour indiquer que le e e e rsultat du calcul est 0 e

CHAPITRE 1. INTRODUCTION C le bit de carry (retenue) est positionn par la plupart des instructions arithmtiques pour indiquer e e si le calcul a engendr une retenue qui devra tre reporte sur les calculs suivants (cf. section 3) e e e A le bit dit auxiliary carry (retenue auxiliaire) est positionn par la plupart des instructions arithme e tiques pour indiquer une retenue entre bits de poids faible et bits de poids forts dun octet, dun mot ou dun double mot (cf. section 3) P le bit de parit est positionn par la plupart des instructions arithmtiques. Il indique si les 8 bits e e e de poids faible du rsultat comportent un nombre pair de 1. e Le 8086 comporte galement des registres 16 bits pour contenir des numros de segment : e e

cs code segment segment contenant le programme en cours dexcution e ds data segment segment contenant les donnes e es registre segment auxiliaire pour adresser des donnes e ss stack segment segment contenant la pile Les valeurs des registres cs, ds et ss sont automatiquement initialises par le syst`me dexploitation au e e lancement du programme. D`s lors, ces segments sont implicites, cest-`-dire que si lon dsire accder ` une e a e e a donne en mmoire, il sut de spcier son oset sans avoir ` se soucier du segment. e e e a

1.4

Le codage des nombres

Les instructions du 8086 manipulent des valeurs numriques enti`res codes sur 1 ou 2 octets. e e e Nous dcrivons ici le codage des nombres entiers. Nous distinguons quatre types de codage : e non sign pour des nombres entiers forcment positifs ; e e sign pour des nombres entiers positifs ou ngatifs. e e dcimal compact, ou dcimal cod binaire e e e e dcimal non compact e e Cest au programmeur de dcider du codage quil utilise et ` crire son programme en consquence. e a e e Lordinateur ne sait pas quel est le codage utilis. Il excute simplement des instructions. e e Nous dcrivons ces codages et quelques notions qui leur sont lies. e e Nous supposerons dans ce qui suit que les donnes sont codes sur un octet (8 bits). Tout ce qui est dit e e peut-tre adapt immdiatement pour des donnes qui seraient codes sur un mot, un double mot ou un e e e e e nombre quelconque de bits.

1.4.1

Reprsentation non signe des nombres entiers e e

Avec l bits, il est possible de coder 2l valeurs direntes. Si l = 8, on peut donc coder 256 valeurs e direntes. On peut tablir le codage suivant, sur 8 bits : e e Valeur 0 1 2 3 ... 84 ... 254 255 Codage 00000000 00000001 00000010 00000011 ... 01010100 ... 11111110 11111111

Ce codage permet de reprsenter tout nombre entier entre 0 et 255 (0 et 2l 1) avec 8 bits (l bits). Du e fait que lon ne reprsente que des nombres positifs, ce codage est quali de non sign. e e e

1.4. LE CODAGE DES NOMBRES

1.4.2

Reprsentation signe des nombres entiers e e

Si lon veut pouvoir reprsenter des nombres positifs et ngatifs, lide naturelle consiste, plutt qu` e e e o a coder des nombres compris entre 0 et 255, ` reprsenter des nombres entre -128 et +127, ce qui reprsente a e e toujours 256 valeurs direntes ` coder avec 8 bits. e a

Valeur -128 -127 ... -45 ... -1 0 1 2 ... 84 ... 126 127

Codage 10000000 10000001 ... 11010011 ... 11111111 00000000 00000001 00000010 ... 01010100 ... 01111110 01111111

Ce codage se nomme codage par complment a deux. Lobtention du codage par complment ` deux dun e ` e a nombre est indiqu plus bas. e On constate, ceci est tr`s important pour que le processeur traite indiremment des nombres en codage e e sign ou non, que le fait de faire une opration (par exemple ajouter 1 ` une valeur) fonctionne quel que soit e e a le codage utilis. Faire la somme au niveau du codage binaire ou au niveau des nombres reprsents donne e e e le mme rsultat. e e Prenons 25 + 36 61 un exemple : 00011001 00100100 00111101

Dans le codage sign, on constate que le bit de poids fort vaut 1 pour tous les nombres ngatifs, 0 pour e e tous les nombres positifs. Ce bit indique donc le signe du nombre cod. Aussi, ce bit se nomme le bit de e signe. Il faut bien prendre garde que si le bit de signe vaut 0, la valeur reprsente est la mme en codage sign e e e e ou non sign. Par contre, si le bit de signe vaut 1, la valeur code est suprieure ` 127 en codage non sign, e e e a e infrieure ` 0 en codage sign. e a e

1.4.3

Codage dcimal e

En codage dcimal 1 , un chire dcimal (compris donc entre 0 et 9) est cod sur 4 bits. 4 bits codant e e e en principe 16 valeurs direntes, seules 10 de ces 16 combinaisons sont eectivement utilises en codage e e dcimal, les autres nayant alors pas de sens. Le codage est le suivant : e
1. on parle aussi de binaire cod dcimal e e

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. INTRODUCTION

On distingue deux types de reprsentation, compacte ou non. Un chire ncessitant 4 bits pour son e e e codage, on peut reprsenter deux chires par octet. Ce codage porte le nom de codage dcimal compact. On e e e peut galement ne mettre quun seul chire par octet, les 4 bits de poids fort de loctet tant inutiliss. On e e e qualie ce codage de dcimal non compact. e e On reverra plus loin ces codages (cf. 3.3.6). Le codage dcimal est tr`s utile pour passer de la reprsentation code dun nombre dans sa reprsentation e e e e e en cha de caract`res ASCII. ne e Par exemple, 19 se code : dcimal compact e e 00011001 dcimal non compact 00000001 e e 00001001 Deux octets sont ncessaires dans la reprsentation non compacte. e e e

1.4.4

Complment ` deux dun nombre e a

Nous indiquons ici comment obtenir le complment ` deux dun nombre. Cette mthode donne la repre a e e sentation binaire signe dun nombre ngatif. Lalgorithme est simple. Soit ` calculer la reprsentation du e e a e nombre n (o` n est un nombre positif). On eectue les oprations suivantes : u e crire n sous forme binaire e en complmenter tous les bits (0 1, 1 0) e ajouter la valeur 1 ` ce nombre binaire. a Nous prsentons cet algorithme sur un exemple. Soit ` calculer le complment ` deux de -23 : e a e a la reprsentation binaire sur 8 bits de 23 est 00010111 e par complment des bits, on obtient : 11101000 e en ajoutant 1, on obtient : 11101001 Le complment ` deux de 00010111 est donc 11101001. La reprsentation binaire signe de -23 est donc e a e e 11101001.

1.4.5

Extension du signe

Etendre le signe dune donne consiste, lors du transfert de la valeur dun octet dans un mot ` recopier e a le bit de signe de loctet sur tous les bits de loctet de poids fort du mot. Par exemple, lextension du signe de 10011110 en mot donne 1111111110011110.

1.5. NOTATION

1.5

Notation

Dans ce document, nous utiliserons la notation suivante : 10 indique la valeur numrique 10 e AX indique la valeur contenue dans le registre AX (10) indique la valeur qui se trouve ` loset 10 dans le segment de donnes a e (SI) indique la valeur qui se trouve ` loset dont la valeur se trouve dans le registre SI a (DS:SI) indique la valeur qui se trouve ` loset contenu dans le registre SI et le segment dans le a registre DS

10

CHAPITRE 1. INTRODUCTION

0 / 1 / / / a + 16 16 / / / / a + 32 32 / / d / / / a

\ \ \ \ \ \ \ \ \ \ \ \ \

/ / segment s = /

a 16

/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \

\ \ segment s + 1 \

/ \ / segment s + 2 \ / \

Fig. 1.3 Les segments : on a reprsent quelques segments pour montrer leur chevauchement et le fait e e quun octet-mmoire poss`de plusieurs adresses segmentes. Par exemple, loctet dadresse eective peut e e e tre adress de multiples faons, selon que lon consid`re quil se trouve dans le segment s, s + 1, s + 2, ... e e c e Dans chacun de ces cas, ladresse segmente de loctet est ( s, d ), ( s + 1, d 16 ), ( s + 2, d 32 ), ... e Notons que chaque octet-mmoire appartient a 212 = 4096 segments dirents. e ` e

1.5. NOTATION

11

(cs)

(ip) instruction suivante ` excuter a e

(ds)

(ss) 0 : fond de la pile 1 2

(sp) dernier octet utilis dans la pile e

Fig. 1.4 Structure de la mmoire. On a reprsent en traits gras les segments de code, de donnes et de e e e e pile qui sont crs lors du dclenchement de lexcution dun programme (de haut en bas en ralit, ils ee e e e e peuvent bien entendu tre situs nimporte o` en mmoire). Chaque segment est rfrenc par un registre de e e u e ee e segment. Les dirents segments peuvent se recouvrir partiellement ou compltement. e e

12

CHAPITRE 1. INTRODUCTION

ax bx cx dx si di sp bp ip cs ds es ss flags

ah bh ch dh

al bl cl dl

oset du sommet de pile oset de la prochaine instruction ` excuter a e numro du segment dinstructions e numro du segment de donnes e e numro du segment de pile e

Fig. 1.5 Les registres du 8086 et leur utilisation. Chaque registre contient 16 bits.

13

Chapitre 2

Anatomie dun programme en assembleur


Un programme en assembleur a une forme bien particuli`re. Chaque ligne dun source assembleur come porte une instruction. Chaque ligne est compose de champs. De gauche ` droite, on a : e a le champ tiquette, qui peut tre vide e e le champ mnmonique (le nom de linstruction) e le champ oprande (les arguments de linstruction), qui peut tre vide e e le champ commentaire, qui peut tre vide e Une tiquette est un identicateur compos de lettres, chires et de caract`res $, %, _ et ? Quelques e e e exemples dtiquettes valides : boucle, fin_de_tant_que, ... e Un mnmonique est, gnralement, compos uniquement de lettres. Quelques mnmoniques que nous e e e e e retrouverons souvent : MOV, CMP, LOOP, ... On pourra indiremment crire les mnmoniques avec des lettres e e e minuscules ou majuscules. Les oprandes dune instruction indiquent les donnes ` traiter, soit sous la forme de valeurs constantes, e e a soit en spciant ladresse mmoire (lemplacement en mmoire) o` se trouve la donne, soit le nom dun e e e u e registre contenant la donne ou contenant ladresse mmoire de la donne. e e e Un commentaire commence par un caract`re ; et se termine en n de ligne. e Bien que la syntaxe soit assez souple, nous respecterons toujours les r`gles suivantes : e une instruction par ligne le mnmonique de linstruction commence ` la colonne 10 e a une dnition dtiquette commence en colonne 1 e e les oprandes des instructions commencent en colonne 20 e les commentaires en n de ligne commencent en colonne 35 les blocs de commentaires sont aligns sur les mnmoniques et commencent donc en colonne 10 (ceste e a `-dire, le ; de dbut de commentaire se trouve en colonne 10) e

14

CHAPITRE 2. ANATOMIE DUN PROGRAMME EN ASSEMBLEUR

2.1

Exemple
; ; ; ; ; Forme gnrale dun fichier source en assembleur 8086 e e Nom du fichier : modele.asm Date decriture : 15 Nov. 1993 Objet : indiquer ici a quoi sert le ` programme, comment on lutilise, ... small 200h ; dfinit le mod`le mmoire e e e ; taille de la pile ; dfinition des donnes du programme e e ....

.MODEL .STACK .DATA DB .... .... .... .CODE .... .... .... .... mov int .... .... END

donnee1

; les instructions composant le programme

ah,4ch 21h

; ; terminaison du programme

; fin du source

Un programme en assembleur commencera donc, par convention, par un bloc de commentaire indiquant lauteur du programme, la date de ralisation du programme ainsi que son utilit et utilisation. e e On trouve ensuite quelques lignes spciant des informations qui seront dtailles plus tard. e e e On trouve ensuite une zone de dnition des donnes qui dbute par la pseudo-instruction 1 .DATA. e e e On trouve ensuite les instructions du programme, lesquelles dbutent par une pseudo-instruction .CODE. e Parmi ces instructions, on trouvera gnralement la squence indique qui termine lexcution du programme. e e e e e Enn, la derni`re ligne du programme est la pseudo-instruction END qui indique la n du source. e On notera que la plupart des instructions ont leur premier oprande qui indique une donne et lendroit e e o` il faut ranger le rsultat (donne et rsultat sont stocks au mme endroit), le deuxi`me qui indique une u e e e e e e donne. Par exemple, dans le squelette de programme ci-dessus, dans linstruction mov ah, 4ch, ah est la e destination de linstruction, 4ch la donne source. e

2.1.1

Spcier une donne en mmoire (une variable) e e e

Il y a 16 mani`res de spcier le dplacement dans un segment mmoire : e e e e tiquette e [bx] [si] [di] bx+tiquette e
1. une pseudo-instruction, ou directive dassemblage, est une commande en langage dassemblage qui nest pas une instruction du processeur. Elle est seulement utilise pour donner des informations a lassembleur. e `

2.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 ltiquette dune donne dnie dans la section .data du programme (cf. plus bas). e e e o` dplacement est une constante code sur 16 bits. u e e Notons au passage que lon peut rcuprer la valeur des adresses de dbut de segment de donnes et de e e e e code en utilisant les symboles @data et @code respectivement. Il faut noter que toutes les rfrences ` des oprandes en mmoire sont implicitement situes ee a e e e dans le segment dont le numro est contenu dans le registre DS. Lorsque cela nest pas le cas, e cela sera mentionn explicitement. e

2.1.2

Les constantes

Les constantes numriques e On peut spcier les constantes numriques dans les bases 2, 8, 10 et 16. Une constante numrique e e e commence toujours par un chire. A priori, une constante est note en base 10. Pour lexprimer en base 2, e une constante ne doit comporter que des chires 0 et 1 et tre termine par la lettre b. Pour lexprimer en e e base 8, une constante ne doit comporter que des chires 0, 1, 2, 3, 4, 5, 6 ou 7 et se terminer par la lettre o. Pour lexprimer en base 16, une constante ne doit comporter que des chires de 0 ` 9 ou des lettres de a ` f a a pour les valeur hexadcimales correspondant aux nombres dcimaux 10, 11, 12, 13, 14 et 15 et se terminer e e par la lettre h. Par exemple : 100110b est une constante binaire dont la valeur dcimale est 38 e 37o est une constante octale dont la valeur dcimale est 31 e 4ch est une constante hexadcimale dont la valeur dcimale est 76 e e Puisquune constante numrique doit toujours commencer par un chire, une constante hexadcimale e e dont le premier caract`re est une lettre sera prcde dun 0. Ainsi, la valeur c3 sera note 0c3h dans un e e e e e source assembleur. Les constantes cha nes de caract`res e Une cha de caract`res est une suite de caract`res entre . Si on veut mettre un caract`re dans une ne e e e constante, il sut de la doubler. Exemples : hello world larbre

16 Dclaration dune constante e

CHAPITRE 2. ANATOMIE DUN 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 quelle dnit. e nom EQU constante Par exemple, la commande : TROIS EQU 3

dnit une constante qui sappelle TROIS. dont la valeur est 3. Une fois cette dclaration eectue, toute e e e occurence de lidenticateur TROIS sera remplace par la valeur indique. e e

2.1.3

Les dclarations de variables e

Lespace mmoire est utilis pour stocker des constantes (cha e e nes de caract`res, valeurs numriques, ...) e e ou des variables. Avant demployer une variable, il faut pralablement la dclarer (comme dans tout langage). e e Dclarer une variable (et ceci est vrai aussi dans les langages de haut niveau comme Pascal, mais cest un e peu cach) revient toujours ` rserver un emplacement en mmoire pour y stocker la valeur de cette variable. e a e e La directive DB [nom] DB constante [, constante] Rserve et initialise un octet. nom est un symbole permettant daccder ` cet octet 2 . Par exemple, les 4 e e a lignes suivantes : OCTET DEUX_OCTETS LETTRE CHAINE TABLEAU DB DB DB DB DB 36 43, 26 e hello world !, 13, 10, $ 10 dup (0)

dnissent 5 symboles comme suit : e NB_OCTET rfrence une donne code sur un octet dont la valeur sera initialise ` 36 ee e e e a DEUX_OCTETS rfrence une donne code sur un octet dont la valeur sera initialise ` 43, loctet suivant ee e e e a tant initialis avec 26. On peut considrer que DEUX_OCTETS rfrence un tableau de 2 octets ; e e e ee LETTRE rfrence une donne dont la valeur sera initialise avec le code ASCII du caract`re e ; ee e e e CHAINE rfrence une cha de caract`res compose des caract`res h, e, l, l, o, , w, o, r, ee ne e e e l, d, , !, des caract`res de code 13 (retour en dbut de ligne) et 10 (aller ` la ligne suivante) et e e a enn du caract`re $ 3 . e TABLEAU rfrence un tableau de 10 octets dont la valeur initiale des lments est 0 ee ee On constate donc que la valeur initiale dun symbole peut tre exprime de direntes mani`res : e e e e une valeur plusieurs valeurs spares par des virgules e e
2. la notation [xxx] indique que xxx est facultatif 3. les caract`res de code 13 et 10 placs en n de cha entra e e ne nent le passage a la ligne apr`s lachage du message ; le ` e caract`re $ indique la n de la cha de caract`res. En gnral, toute cha de caract`res devant tre ache a lcran se e ne e e e ne e e e ` e terminera par un caract`re $. e

2.2. LASSEMBLAGE le code dun caract`re e une cha de caract`res, chacun des caract`res initialisant un octet ne e e

17

On pourra gnralement utiliser lune de ces formes dans toute instruction, du moment que cela a un e e sens. On verra galement dautres mani`res de spcier des valeurs par la suite. Celles-ci sont tout aussi e e e valides pour nimporte quelle instruction, du moment quelles ont un sens. La directive DW [nom] DW constante [, constante] Rserve et initialise un mot (16 bits). nom est un symbole permettant daccder ` ce mot. Ainsi, les lignes e e a suivantes dnissent : e MOT MOT2 TMOT DW DW DW 1559 ((45 * 23) / 9 + 23) 20 DUP (0)

le symbole MOT qui rfrence une une donne code sur un mot et qui sera initialise avec la valeur ee e e e 1559 ; le symbole MOT2 qui rfrence une donne code sur un mot et qui est initialise avec la valeur 138 ; ee e e e le symbole TMOT qui rfrence un tableau de 20 mots initialiss avec la valeur 0 ee e On voit donc sur cet exemple quune valeur constante peut tre spcie avec une expression numrique, e e e e du moment que celle-ci est calculable lors de lassemblage. Sans entrer dans les dtails ici, on peut indiquer e que la valeur dune expression est calculable ` lassemblage si elle ne comporte que des valeurs numriques ou a e des constantes dnies par des pseudo-instructions EQU ou une adresse. A ce propos, il est tr`s important de e e bien noter la dirence entre un symbole dni par une directive EQU et un symbole dni par une directive e e e DB ou DW. Si nous considrons les exemples prcdents : e e e TROIS est une constante dont la valeur est 3 ; OCTET, MOT, DEUX_OCTETS, ... sont des constantes dont la valeur est ladresse ` laquelle seront stockes a e les valeurs 36, 1559, 43, 26, ... Par analogie avec un programme Pascal, nous pouvons dire que TROIS est une constante, alors que les autres symboles (OCTET, MOT, ...) sont des variables qui seront initialises avec les valeurs indiques. Au cours e e de lexcution du programme, la valeur se trouvant ` ladresse OCTET pourra tre modie. e a e e Notons que les octets composant un mot sont stocks de la mani`re suivante : le poids faible est mis dans e e le premier octet, le poids fort dans le deuxi`me octet. Ainsi, si on dclare : e e M DW 1234h

la valeur 34h est mise ` ladresse M et la valeur 12h ` ladresse M+1. a a

2.2

Lassemblage

Une fois un programme source assembleur saisi sous diteur de textes dans un chier dont lextension est e ASM, il faut le transformer en un programme excutable. Pour un langage de haut niveau comme Pascal, cette e phase se nomme la compilation. Pour un programme crit en assembleur, cette transformation se nomme e assemblage. Pour cela, on utilise la commande TASM2 avec, en argument, le nom du chier ` assembler. Des a erreurs de syntaxe seront ventuellement dtectes quil faudra corriger avant de continuer. Une fois que e e e lassemblage a eu lieu sans dtection derreur, on obtient un chier de mme nom que le chier source et e e avec une extension OBJ. Il faut alors raliser une dition de liens. Pour cela, on utilise la commande TLINK2 e e

18

CHAPITRE 2. ANATOMIE DUN PROGRAMME EN ASSEMBLEUR

avec, en argument, le nom du chier, sans extension. A lissue de ce processus, on obtient un chier portant le mme nom que le chier source et dextension EXE. Ce chier est excutable. e e Il est bon de noter que dans le programme excutable, les instructions ont t codes. Ainsi, chaque e ee e instruction est code par un octet ou une succession doctets conscutifs en mmoire (segment de code). e e e Dans le codage dune instruction, on trouve le code-opration qui indique le mnmonique (1 ou 2 octets) e e suivi du ou des oprandes (valeur immdiate, registre, adresse). e e

Code opration e

Codes oprandes e

Fig. 2.1 Le codage dune instruction

19

Chapitre 3

Les instructions du 8086


Dans ce chapitre, nous prsentons une par une les instructions du 8086. e

Mod`le de description dune instruction e


Pour toutes les instructions possdant plusieurs modes dadressage des oprandes, on trouvera un tableau e e prsentant ces modes de la forme suivante ; e xxx ... ... operande1, operande2, ... commentaire

Dans la colonne de gauche, on trouve le mnmonique de linstruction. Dans la colonne suivante, on trouve e le mode dadressage des oprandes. La colonne de droite absente dans certaines tables, donnent quelques e informations complmentaires. e Les modes dadressage sont indiqus de la mani`re suivante : e e AL, AH, ... un registre particulier registre un registre 8 ou 16 bits parmi AL, AH, AX, BL, BH, BX, CL, CH, CX, DL, DH, DX, SI ou DI. variable une tiquette de donne dnie dans la section .data du programme e e e registre/variable un registre ou une tiquette de donne e e constante une constante etiquette une tiquette correspondant ` une instruction, donc dnie dans la section.code du proe a e gramme La plupart des instructions modient les indicateurs du registre FLAGS. Un tableau indique leet de linstruction couramment dcrite sur ces indicateurs. Il a la forme suivante ; e O D I T S Z A P C

La premi`re ligne indique le nom des bits intressants de FLAGS. La deuxi`me ligne (vide ici) indique e e e leet de linstruction sur un bit en particulier. On note : * le bit est modi en fonction du rsultat de lexcution de linstruction e e e ? le bit a une valeur indnie apr`s lexcution de linstruction e e e 1 le bit est mis ` 1 a 0 le bit est mis ` 0 a Une case vide indique que lindicateur nest pas modi par linstruction. e

20

CHAPITRE 3. LES INSTRUCTIONS DU 8086

3.1
3.1.1

Les instructions arithmtiques et logiques e


Les instructions arithmtiques e

Comme dans de nombreux processeurs, le 8086 poss`de des instructions +, , et qui traitent des e donnes enti`res codes sur un octet ou un mot. Pour faire des oprations sur des donnes plus complexes e e e e e (des nombres ottants par exemple), on devra les programmer. ADD addition sans retenue

ADD ADD ADD O *

registre/variable, registre registre, registre/variable registre/variable, constante D I T S * Z * A * P * C *

Linstruction ADD eectue laddition du contenu du registre source au registre destination, sans report de retenue, soit ; destination source + destination La retenue est positionne en fonction du rsultat de lopration. e e e Par exemple, si les instructions suivantes sont excutes ; e e mov add ax, a9h ax, 72h

alors le registre AX contient la valeur 1bh, le bit C est positionn ` la valeur 1, la retenue auxiliaire A est ea mise ` 0. a Si nous considrons les deux instructions suivantes ; e mov add ax, 09h ax, 3ah

alors le registre AX contient la valeur 43h, le bit C est mis ` 0, la retenue auxiliaire A est mise ` 1. a a SUB soustraction sans retenue

SUB SUB SUB O *

registre/variable, registre registre, registre/variable registre/variable, constante D I T S * Z * A * P * C *

Linstruction SUB eectue la soustraction du contenu du registre source au registre destination, sans report de retenue, soit ; destination destination - source

3.1. LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES La retenue est positionne en fonction du rsultat de lopration. e e e Par exemple, si les instructions suivantes sont excutes ; e e mov sub ax, 39h ax, 18h

21

le registre AX contient ensuite la valeur 21h. Les bits Z, S et C du registre FLAGS sont mis ` 0 car le rsultat a e nest pas nul, son signe est positif et aucune retenue nest gnre. e ee Si nous considrons les deux instructions suivantes ; e mov sub ax, 26h ax, 59h

le registre AX contient ensuite la valeur cdh. Le bit Z est mis ` zro. Les bits C, A et S sont mis ` 1. 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 eectuent des multiplications. Linstruction IMUL eectue la multiplication doprandes signs. Linstruction MUL eectue la multiplicae e tion doprandes non signs. e e Les indicateurs de retenue (C) et de dbordement (O) sont mis ` un si le rsultat ne peut pas tre stocke e a e e e dans loprande destination. e Une addition ou une soustraction de donnes codes sur n bits donne un rsultat sur au plus n + 1 bits. e e e Le bit supplmentaire est la retenue et est stock dans le bit C de flags. Par contre, une multiplication de e e deux donnes de n bits donne un rsultat sur 2n bits. e e Dans leur premi`re forme qui prend une donne 8 bits en oprande (donc le rsultat est sur 16 bits), e e e e les instructions mul et imul eectuent le produit de la valeur contenue dans le registre al avec la valeur de loprande fourni. Le rsultat est plac dans le registre ax. e e e Dans leur deuxi`me forme qui prend une donne 16 bits en oprande (donc le rsultat est sur 32 bits), e e e e les instructions mul et imul eectuent le produit de la valeur contenue dans le registre ax avec la valeur de loprande fourni. Le rsultat est plac dans la paire de registres dx et ax. dx contient le poids fort du e e e rsultat, ax le poids faible. e Exemple de multiplication sur 8 bits : soient les instructions suivantes : mov mov imul al, 4 ah, 25 ah

` A lissue de lexcution de ces 3 instructions, le registre AH contient la valeur 100, produit de 4 par 25. e Pour bien comprendre la dirence entre les instructions imul et mul, regardons les exemples suivants : e mov bx, 435 mov ax, 2372 imul bx

22

CHAPITRE 3. LES INSTRUCTIONS DU 8086

` A lissue de lexcution de ces 3 instructions, ax contient la valeur be8c et dx la valeur f, soit la valeur e hexadcimale fbe8c, cest-`-dire 1031820, le produit de 435 par 2372. Les deux donnes tant positives, le e a e e rsultat est le mme que lon utilise linstruction imul ou linstruction mul. e e Considrons maintenant la squence dinstructions : e e mov bx, -435 mov ax, 2372 imul bx ` lissue de leur excution, ax contient la valeur 4174 et dx contient la valeur fff0, soit la valeur -1031820. A e Si lon remplace imul par mul, le rsultat na pas de sens. 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 ralisent les oprations de division et de calcul de reste. DIV leectue e e sur des donnes non signes, IDIV sur des donnes signes. e e e e Dans tous les cas, le dividende est implicite. Le diviseur est fourni en oprande. Le rsultat se compose e e du quotient et du reste de la division. Le reste est toujours infrieur au diviseur. On a le choix entre : e la division dune donne 16 bits stocke dans AX par une donne 8 bits qui fournit un quotient dans AL e e e et un reste dans AH sur 8 bits. la division dune donne 32 bits stocke dans la paire de registres DX (poids fort) et AX (poids faible) e e par une donne 16 bits qui fournit un quotient dans AX et un reste dans DX sur 16 bits. e Soient les quelques lignes dassembleur suivantes : mov mov div ax, 37 dx, 5 dl

Apr`s leur excution, le registre AX contient la valeur 7, quotient de 37 par 5 et le registre DX contient le e e reste de la division, 2. Pour les deux instructions, si le diviseur de la division est nul, un message Division par zero sera ach automatiquement. e Dans le cas dune division signe IDIV, le reste a le mme signe que le dividende et sa valeur absolue est e e toujours infrieure au diviseur. e Pour bien comprendre le fonctionnement de ces deux instructions, prenons lexemple suivant : mov bx, 435 mov ax, 2372 div bx ` A lissue de lexcution de cette squence dinstructions, le registre ax contiendra la valeur 5 qui est le e e quotient de 2372 par 435, et le registre dx vaudra 197 qui est le reste de la division. Si on remplace div par idiv, le rsultat est inchang puisque le diviseur et le dividende sont tous deux positifs. e e Si lon consid`re maintenant la squence : e e mov bx, -435 mov ax, 2372 idiv bx on aura ensuite ax qui contient la valeur -5 (soir fffb en hexadcimal) et dx la valeur 197. Si lon remplace e idiv par div, le rsultat na pas de sens. e

3.1. LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES

23

3.1.2

Incrmentation, dcrmentation e e e

Nous voyons ici deux types dinstructions tr`s frquemment utilises et qui sont en fait des cas particuliers e e e des instructions daddition et de soustraction, lincrmentation et la dcrmentation. Incrmenter signie e e e e (( ajouter 1 )), alors que dcrmenter signie (( retirer 1 )). Notons cependant que lon utilise souvent les termes e e incrmenter et dcrmenter mme si les quantits ajoutes ou retires sont direntes de 1, en gnral lorsque e e e e e e e e e e la variable modie est un compteur. e DEC dcrmentation e e DEC O * D I registre/variable T S * Z * A * P * C

DEC soustrait 1 au contenu de loprande, sans modier lindicateur de retenue. e Soient les instructions assembleur suivantes ; mov dec al, 01h al

AL contient ensuite la valeur 00. Le bit Z est mis ` 1, les bits O, P, A et S mis ` 0. a a INC incrmentation e INC O * D I registre/variable T S * Z * A * P * C

INC ajoute 1 au contenu de loprande, sans modier lindicateur de retenue. e Soient les instructions assembleur suivantes ; mov inc al, 3fh al

AL contient ensuite la valeur 40h. Le bit Z est mis ` 0 (le rsultat de lincrmentation nest pas nul), lindia e e cateur de retenue auxiliaire bit A est mis ` 1 (passage de retenue entre les bits 3 et 4 lors de lincrmentation), a e les bits bit O et bit S mis ` 0 (pas de dbordement de capacit, le signe du rsultat est positif). a e e e

3.1.3
NEG

Oppos dun nombre e

Ngation par complment ` 2 e e a NEG O * D I registre/variable T S * Z * A * P * C *

NEG transforme la valeur dun registre ou dun oprande mmoire en son complment ` deux. Ainsi, apr`s e e e a e excution des instructions ; e mov neg ax, 35 ax

le registre AX contient la valeur -35.

24

CHAPITRE 3. LES INSTRUCTIONS DU 8086

3.1.4

Les instructions boolennes et logiques e

Ces instructions disponibles sur tous les processeurs travaillent sur les donnes au niveau des bits (et non e sur des valeurs numriques comme les instructions vues jusqu` prsent). e a e AND et-logique

AND AND AND O 0

registre/variable, registre regisre, registre/variable registre/variable, constante D I T S * Z * A ? P * C 0

AND ralise un et-logique bit ` bit entre loprande source et loprande destination. Le rsultat est rang e a e e e e dans loprande destination. e Considrons les deux lignes suivantes : e mov and al, 36h al, 5ch

Le registre AL contient ensuite la valeur 14h obtenue de la mani`re suivante ; e 36h 5ch 14h 0011 0101 0001 0110 1100 0100

Les bits S et Z sont mis ` zro et le bit P ` 1. a e a OR ou-logique

OR OR OR O 0

registre/variable, registre regisre, registre/variable registre/variable, constante D I T S * Z * A ? P * C 0

OR ralise un ou-logique bit ` bit entre loprande source et loprande destination. Le rsultat est rang e a e e e e dans loprande destination. e Considrons les deux lignes suivantes : e mov or al, 36h al, 5ch

Le registre AL contient ensuite la valeur 7eh obtenue de la mani`re suivante ; e 36h 5ch 7eh 0011 0101 0111 0110 1100 1110

Les bits S et Z sont mis ` zro et le bit P ` 1. a e a XOR ou-exclusif

3.1. LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES XOR XOR XOR O 0 registre/variable, registre regisre, registre/variable registre/variable, constante D I T S * Z * A ? P * C 0

25

XOR ralise un ou-exclusif bit ` bit entre loprande source et loprande destination. Le rsultat est rang e a e e e e dans loprande destination. e Considrons les deux lignes suivantes : e mov and al, 36h al, 5ch

Le registre AL contient ensuite la valeur 6ah obtenue de la mani`re suivante ; e 36h 5ch 6ah 0011 0101 0110 0110 1100 1010

Les bits S et Z sont mis ` zro et le bit P ` 1. a e a NOT Ngation logique e

NOT O D I

registre/variable T S Z A P C

NOT transforme la valeur dun registre ou dun oprande mmoire en son complment logique bit ` bit. e e e a Considrons les deux lignes suivantes : e mov not al, 36h al

Le registre AL contient ensuite la valeur c9h obtenue de la mani`re suivante ; e 36h c9h 0011 1100 0110 1001

Les bits S et P sont mis ` 1, le bit Z ` 0. a a

3.1.5

Les instructions de dcalage et rotation e

Nous dcrivons ici des oprations classiques des langages dassemblage qui se nomment dcalages et e e e rotations. On les rencontre couramment car leur utilisation simplie grandement certains traitements. RCL ROL RCR ROR

Les rotations en assembleur

26

CHAPITRE 3. LES INSTRUCTIONS DU 8086

Oprande e 6 6 6 6 6 6 6 a.SAR

retenue -

Oprande e  Oprande e retenue 6 6 6 6 6 6 6 d.ROL

retenue 6

6 6 6 6 6 6 6 b.SHR Oprande e  retenue  Oprande e  0 6 6 6 6 6 6 6 c.SHL (quivalent ` SAL) e a Fig. 3.1 Dcalages et rotations en assembleur e 6 6 6 6 6 6 6 e.RCL retenue 6

Les rotations sont des oprations logiques binaires frquemment utilises. Elles consid`rent un oprande e e e e e (octet ou mot) comme un tore dont elles dcalent les bits. Lors du dcalage, un bit dborde dun ct, ` e e e oe a gauche ou ` droite, selon le sens de la rotation. Selon le cas, quelques dtails di`rent ; a e e RCL le bit de poids fort est mis dans lindicateur de retenue C, la valeur de cet indicateur tant pralablement e e mise dans le bit de poids faible (cf. gure 3.1.e) ROL le bit de poids fort est mis dans lindicateur de retenue C et dans le bit de poids faible de loprande. e Lancienne valeur de lindicateur de retenue nest pas utilise (cf. gure 3.1.d) e Les oprandes des instructions RCL, RCR, ROL et ROR. tant les mmes, nous nen prsentons quune, e e e e linstruction RCL. RCL RCL O * D registre/variable, 1 registre/variable, CL I T S Z A P C *

RCL eectue une rotation ` gauche de loprande destination indiqu, 1 ou CL fois, en prenant en compte a e e le contenu de lindicateur de retenue. Le bit de poids fort de loprande destination est mis dans la retenue. e Le contenu de la retenue est mis dans le bit de poids faible de loprande destination. e RCR eectue une rotation ` droite de loprande destination indiqu, 1 ou CL fois, en prenant en compte a e e le contenu de lindicateur de retenue. Le bit de poids faible de loprande destination est mis dans la retenue. e Le contenu de la retenue est mis dans le bit de poids fort de loprande destination. e

3.1. LES INSTRUCTIONS ARITHMETIQUES ET LOGIQUES

27

ROL eectue une rotation ` gauche de loprande destination indiqu, 1 ou CL fois, sans prendre en a e e compte le contenu de lindicateur de retenue. Le bit de poids fort est mis dans lindicateur de retenue lors de la rotation ainsi que dans le bit de poids faible de loprande. e ROR eectue une rotation ` droite de loprande destination indiqu, 1 ou CL fois, sans prendre en compte a e e le contenu de lindicateur de retenue. Le bit de poids faible est mis dans lindicateur de retenue lors de la rotation ainsi que dans le bit de poids fort de loprande. e Considrons les deux lignes suivantes : e mov mov xxx al, 16h cl, 3 al, cl

o` xxx est une instruction de rotation. Selon le choix de cette instruction, nous obtenons les rsultats u e suivants ; xxx al C SAL SHL SAR SHR rcl b0h 0 rcr 85h 1 rol b0h 0 ror 85h 1

Les dcalages en assembleur e Une opration de dcalage consiste simplement ` dcaler tous les bits dune donne. Contrairement aux e e a e e rotations qui consid`rent une donne (un octet ou un mot) comme un tore, un dcalage consid`re la donne e e e e e comme une le ; ainsi, le bit qui (( dborde )) de la retenue est perdu. e Les oprandes des instructions SAL, SAR, SHL et SHR tant les mmes, nous ne prsentons quune seule e e e e instruction, SAL. SAL SAL O * D registre/variable, 1 registre/variable, CL I T S * Z * A ? P * C *

SAL et SHL sont des synonymes et peuvent tre utilises lune pour lautre indiremment. SAL eectue e e e un dcalage vers la gauche, sauvegardant le bit de poids fort dans lindicateur de retenue et mettant un 0 e dans le bit de poids faible (cf. gure 3.1.c). SHR eectue un dcalage vers la droite. Le bit de poids faible est mis dans la retenue. Un 0 est mis dans e le bit de poids fort de la donne (cf. gure 3.1.b). e SAR eectue un dcalage vers la droite, sauvegardant le bit de poids faible dans lindicateur de retenue. e Par ailleurs (et cest l` toute la dirence avec linstruction prcdente), le bit de poids fort est conserv (cf. a e e e e gure 3.1.a). Le bit de poids fort de la donne initiale est donc dupliqu. e e Considrons les deux lignes suivantes : e mov mov sal al, 16h cl, 3 al, cl

28

CHAPITRE 3. LES INSTRUCTIONS DU 8086

Le registre AL contient ensuite la valeur b0h. En eet, 16h scrit 00010110 en binaire. Si on dcale cette e e valeur de trois positions vers la gauche, on obtient 10110000, soit b0h Le bit C est mis ` 0. a Considrons les deux lignes suivantes : e mov mov sar al, 36h cl, 3 al, cl

Le registre AL contient ensuite la valeur 05h. Le bit C est mis ` 1. a La dirence entre les instructions SAR et SAL napparait que si le bit de poids fort de la donne vaut e e 1. Le tableau suivant donne, pour deux valeurs de la donne (mise dans le registre AL), leet des dirents e e dcalages. e al sar al, 1 shr al, 1 f0 f8 78 70 38 38

Il faut noter que pour un nombre, un dcalage dune position vers la gauche correspond ` une multiplie a cation de ce nombre par 2 et quun dcalage dune position vers la droite correspond ` une division enti`re e a e par 2. En gnralisant, un dcalage de l positions vers la gauche correspond ` une multiplication par 2l et e e e a un dcalage de l positions vers la droite correspond ` une division par 2l . Il faut bien noter, et cest ce qui e a justie lexistence des deux instructions sar et shr et leur subtile dirence, que sar eectue une division e sur un nombre en reprsentation signe tandis que shr eectue une division sur un nombre en reprsentation e e e non signe. e Bien entendu, les oprations de dcalage tant connues comme des oprations logiques binaires et non des e e e e oprations arithmtiques, on prendra garde ` linterprtation des indicateurs de dbordement ou de retenue e e a e e que lon fera ` lissue dune instruction de dcalage. a e

3.1.6
MOV

Les instructions de transfert

transfert dune valeur Ces instructions ralisent des transferts de donnes entre 2 adresses mmoire, 2 registres, ou entre un e e e registre et la mmoire. Ceci correspond donc ` laectation des langages de haut niveau A:= B. e a MOV MOV MOV MOV MOV O registre/variable, registre registre, registre/variable registre, registre de segment registre de segment, registre registre/variable, constante D I T S Z A P C

registre de segment indique lun des registres cs, ds, es ou ss. Linstruction MOV eectue le transfert dune donne vers un registre ou une adresse mmoire. e e Transfert de la valeur dun registre de segment vers un autre registre de segment Aucun mode dadressage de la commande MOV ne permet de transfrer la valeur dun registre de segment e dans un autre registre de segment. Nous disposons uniquement de la possibilit de transfrer la valeur dun e e registre de segment vers un registre de donnes et de la possibilit de transfrer la valeur dun registre de e e e donnes vers un registre de segment. Aussi, pour atteindre notre but, nous devrons eectuer le transfert en e deux tapes, en utilisant un registre de donnes intermdiaire : e e e transfrer la valeur du registre de segment source dans un registre de donnes sur 16 bits e e

3.2. LES TESTS EN ASSEMBLEUR transfrer la valeur de ce registre de donnes dans le registre de segment destination e e

29

Par exemple, supposons que nous voulions transfrer le contenu du registre DS dans le registre ES. Nous e pouvons lcrire sous la forme suivante : e mov mov ax, ds es, ax

Remarquons quau cours de cette opration, la valeur du registre AX a t perdue lors de lexcution e ee e de la premi`re instruction. Ceci peut poser un probl`me qui pourra tre rsolu en utilisant les techniques e e e e prsentes ` la section 4.3.2. e e a

LEA

Chargement de loset dune donne e

LEA O

registre/variable, etiquette D I T S Z A P C

Ctte instruction charge loset de la donne rfrence dans le deuxi`me oprande qui est, en gnral, e ee e e e e e une donne dclare dans le segment de donnes. e e e e Echange de valeurs

XCHG

XCHG XCHG O

registre/variable, registre registre, registre/variable D I T S Z A P C

Linstruction XCHG change le contenu de deux emplacements mmoire ou registres. Supposons que le e e registre AX contienne la valeur 20 et le registre DX la valeur 10, lexcution de linstruction : e xchg ax, dx

entra nera : AX contient la valeur 10 et DX la valeur 20.

3.2

Les tests en assembleur

En assembleur, il nexiste pas de tests comme dans les langages de haut niveau tel Pascal. Cependant, il est bien entendu possible de raliser des tests. 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 dclencher la partie alors ou la partie sinon du test. e

30

CHAPITRE 3. LES INSTRUCTIONS DU 8086

3.2.1

Principe gnral e e

Les bits du registre FLAGS sont positionns par les instructions que nous avons dj` vues (instructions e ea arithmtiques, logiques, ...). Ils sont galement positionns par des instructions spcialement conues pour e e e e c raliser des tests et qui nont dautres eets que de positionner les bits de FLAGS en fonction de certaines e conditions sur leurs oprandes. Ces instructions sont CMP et TEST. e Une fois les indicateurs positionns, une instruction dite de saut conditionnel teste un bit ou une combie naison de bits de FLAGS et, en fonction du rsultat : e eectue une rupture de squence (un saut) vers un endroit prcis dans le code o` lexcution se poursuit e e u e normalement. continue en squence si le test ne donne pas un rsultat positif. e e Nous prsentons linstruction CMP, les instructions de sauts conditionnels et inconditionnels puis prsene e tons sur des exemples le codage des tests.

3.2.2
CMP

Les instructions de comparaison

comparaison Cest linstruction la plus utilise pour positionner les indicateurs avant deectuer une instruction de e saut conditionnel. CMP CMP CMP O * registre/variable, registre registre, registre/variable registre/variable, constante D I T S * Z * A * P * C *

CMP permet de comparer deux valeurs. Pour cela CMP soustrait le second oprande du premier, sans e cependant modier loprande destination, mais en positionnant les indicateurs en fonction du rsultat. e e Ainsi, si le rsultat de la soustraction est nul, donc lindicateur Z a t positionn ` 1, cela signie que les e ee ea deux valeurs compares sont gales. En utilisant des raisonnements du mme genre, on peut savoir si les e e e deux valeurs sont direntes, ordonnes strictement ou non. e e ` A lissue de lexcution des deux instructions suivantes : e mov cmp al, 23 al, 34

le registre AL nest pas modi par lexcution de linstruction CMP et contient toujours la valeur aecte e e e auparavant 23. Lindicateur de retenue C est positionn ` 1, ce qui indique que le deuxi`me oprande de e a e e linstruction CMP est suprieur ` la valeur du premier oprande. Lindicateur de zro Z valant 0, cela indique e a e e que les deux donnes sont direntes (sinon, la soustraction dun nombre ` lui-mme donne 0, donc le bit Z e e a e est positionn ` 1). Le bit de signe S est galement mis ` 1 car 29 34 est un nombre ngatif. ea e a e Jxx Les instructions de saut conditionnel

3.2. LES TESTS EN ASSEMBLEUR

31

Toutes les instructions de saut conditionnel prennent le mme type doprande (attention, bien distinguer e e la valeur zro 0 du bit O du registre dtat) : 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 suprieur (C =0 et Z =0) e suprieur ou gal (C =0) e e infrieur (C =1) e infrieur ou gal (C =1 ou Z =1) e e retenue (C =1) CX vaut 0 gal (Z =1) e suprieur (Z =0 ou S =O) e suprieur ou gal (S =O) e e infrieur (S =O) e infrieur ou gal (Z =1 ou S =O) e e pas de retenue (C =0) non gal (Z =0) e pas de dbordement (O =0) e pas de parit (P =0) e pas de signe (S =0) dbordement (O =1) e parit (P =1) e signe (S =1) S Z A P C

Toutes ces instructions fonctionnent selon le schma suivant. Quand la condition est vraie, un saut est e eectu ` linstruction situe ` ltiquette spcie en oprande. ea e a e e e e Notons que les tests dordre (infrieur, suprieur, ...) se comprennent de la mani`re suivante. Supposons e e e que nous comparions deux donnes par une instruction CMP et que nous excutions ensuite une instruction e e JG, cest-`-dire (( saut si plus grand )). Il y aura alors saut si la valeur du deuxi`me oprande de linstruction a e e CMP est suprieur ` la valeur du premier oprande. e a e Ltiquette rfrence dans linstruction de saut conditionnel ne doit pas se trouver trop loin de linstruce ee e tion de saut. Sinon, une erreur dassemblage est dclenche et le message : e e Relative jump out of range by xxx bytes est ach. Pour remdier ` cette erreur, il faut procder de la mani`re suivante. Supposons que linstruce e a e e tion : je etiquette

provoque lerreur en question. Il faut transformer cette instruction dans la squence dinstructions : e jne nouvelle-etiquette jmp etiquette nouvelle-etiquette: Cest-`-dire : a 1. remplacer linstruction de saut conditionnel par linstruction de saut correspondant ` la condition a oppose (ici, saut si le bit Z vaut 1 est remplac par saut si le bit Z vaut 0). Loprande de cette e e e nouvelle instruction est une nouvelle tiquette. e 2. faire suivre linstruction de saut conditionnel par une instruction de saut inconditionnel jmp (voir 3.2.2) dont loprande est ltiquette de linstruction de saut conditionnel originale e e 3. dclarer ensuite la nouvelle tiquette apr`s linstruction jmp e e e

32 JMP : saut inconditionnel JMP O D I T

CHAPITRE 3. LES INSTRUCTIONS DU 8086

etiquette S Z A P C

Linstruction JMP eectue un saut inconditionnel ` ltiquette spcie. Contrairement ` un saut condia e e e a tionnel, le saut est toujours eectu, le registre FLAGS nintervenant en rien dans cette opration. e e

3.2.3

Exemples de codage de tests en assembleur

Gnralement 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 lexpression condition est vraie, les instructions composant la partie action-alors sont excutes. Sinon, les instructions de la partie action-sinon sont excutes. e e e e En assembleur, ce type de construction est ralis ` laide du squelette de programme suivant : e ea calcul de la condition Jcc SINONn action-alors ... JMP FSIn SINONn: action-sinon ... FSIn: ... o` Jcc dnote lune 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 ralis par linstruction Jcc (o` cc reprsente e e u e la condition ` tester voir les direntes possibilits dans la section traitant des instructions de saut a e e conditionnel) vers la partie sinon du test. Si la condition est vrie, aucun saut nest ralis et le e e e e programme poursuit son excution en squence avec les instructions de la partie action-alors e e une fois les instructions de la partie alors excutes, un saut doit tre ralis (instruction JMP FSIn) e e e e e pour atteindre la n de la structure de test an de ne pas galement excuter la partie sinon e e une tiquette (SINONn) est dclare indiquant le dbut de la partie action-sinon o` le branchement e e e e u conditionnel doit tre excut pour dclencher lexcution des instructions de la partie sinon du test e e e e e une fois la partie sinon excute, on continue en squence avec les instructions situes apr`s le test e e e e e (cest-`-dire, apr`s ltiquette FSIn) a e e

3.3. LES BOUCLES EN ASSEMBLEUR

33

Pour des raisons de clart, nous utiliserons un format spcial pour les tiquettes codant un test. Une e e e tiquette SINON indique le dbut de la squence action-sinon et une tiquette FSI indique la n de la e e e e structure de test. Ces tiquettes seront numrotes, les tests tant numrots dans le programme de 1 ` n, e e e e e e a par convention. An dillustrer le propos, nous donnons un exemple de codage dun test. Nous voulons eectuer la division dun nombre par un autre. La division nest possible que si le diviseur est non nul. Aussi, nous devons tester si loprande diviseur est nul avant dexcuter la division. Si le diviseur est nul, nous dsirons que le rsultat e e e e du traitement soit -1. Sinon, le rsultat 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 nest pas complet. Il vise simplement ` montrer le codage dun test. a

3.3

Les boucles en assembleur

Comme pour les tests, il nexiste pas de structure gnrale en assembleur pour coder une boucle. Cepene e dant, ` laide des instructions vues prcdemment pour raliser des tests, on peut coder nimporte quel type a e e e de boucle. On verra galement que des instructions simplient grandement le codage des boucles pour. e

3.3.1

Principe gnral e e

Le principe de la ralisation des boucles tant-que ou jusqua est assez particulier. Une boucle est e essentiellement compose de deux lments : e ee une condition de sortie qui indique quand la boucle doit tre interrompue, quil faut sortir de la boucle e et continuer lexcution des instructions en squence e e un corps de boucle qui spcie laction ` raliser pendant que la condition de sortie nest pas vrie, e a e e e a ` chaque itration de la boucle e La condition de sortie va donc tre code dune mani`re ressemblant aux tests. Un saut conditionnel e e e testera cette condition et entra nera, quand la condition est vrie, la sortie de la boucle. e e Le corps de la boucle devra pour sa part (( boucler )), cest-`-dire, une fois excut, entra a e e ner le re-calcul de la condition de sortie et la prise de dcision quant ` la poursuite ou non des itrations. e a e Nous indiquons maintenant comment est ralis le codage dune boucle tant-que et dune boucle rpter. e e e e

3.3.2

Boucles tant-que

Le squelette dune 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 dnote lune des instructions de saut conditionnel vues plus haut. u e Nous notons les points suivants : une tiquette TQ indique le dbut 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 rsultat du test de sortie), un saut conditionnel est e eectu en n 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 dbut e e de la boucle (JMP TQn) qui permettra de r-valuer la condition darrt apr`s chaque itration ee e e e une tiquette FTQ indiquant la n de la boucle e Pour des raisons de clart, nous utiliserons un format spcial pour les tiquettes codant une boucle e e e TANT-QUE. Une tiquette TQ indique le dbut de la structure de boucle et une tiquette FTQ indique la n de e e e la structure de boucle. Ces tiquettes seront numrotes, les boucles tant numrotes dans le programme e e e e e e de 1 ` n, par convention. a

3.3.3

Boucles rpter e e

Le squelette dune 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 dbut de la boucle e e e on trouve ensuite le corps de la boucle ` lissue de lexcution du corps, on trouve lvaluation du test darrt qui positionne les indicateurs a e e e du registre FLAGS une instruction de saut conditionnel eectue un branchement pour continuer les itrations si la condition e darrt nest pas vrie e e e Pour des raisons de clart, nous utiliserons un format spcial pour les tiquettes codant une boucle e e e REPETER. Une tiquette REPETER indique le dbut de la boucle. Ces tiquettes seront numrotes, les boucles e e e e e REPETER tant numrotes 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 gnralement code ` laide dune instruction de la famille LOOP. Pour les boucles e e e a traitant des cha nes de donnes (caract`res, mots), voir la section 3.3.6. e e LOOP boucles contrles par un compteur oe

LOOP LOOPE LOOPNE

etiquette etiquette etiquette O D

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

LOOP fonctionne avec le registre CX qui joue le rle de compteur de boucles. LOOP dcrmente le compteur o e e sans modier aucun des indicateurs. Si le compteur est dirent de 0, un saut ` ltiquette oprande de e a e e linstruction LOOP est ralis. Le squelette dune boucle pour scrit 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 dune certaine valeur bs ` 1, a en dcrmentant sa valeur ` chaque itration. Aussi, la boucle prcdente doit initialement tre transforme 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 ache 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 eectuant cette transformation. Voir a ce propos le document ( mthodologie de programmation en ` ( e assembleur ) )

36

CHAPITRE 3. LES INSTRUCTIONS DU 8086

Le dbut initialise le registre DS pour quil contienne le numro du segment de donnes et le compteur de e e e boucles. Le corps de la boucle contient alors un appel ` la routine achant un message ` lcran (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 lorsquune e condition est vrie (parce que lon cherche une valeur dans le tableau possdant une proprit particuli`re e e e ee e par exemple). Notons que ce type de construction nexiste pas en Pascal. Des instructions sont disponibles en assembleur pour raliser 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 rle de compteur de e o boucle. Par ailleurs, ` chaque itration, une condition (la valeur du bit Z du registre FLAGS) est teste. Pour a e e linstruction LOOPE, il y a saut ` ltiquette spcie en oprande tant que le compteur est non nul et que a e e e e lindicateur Z vaut 1. Pour linstruction LOOPNE, il y a saut ` ltiquette spcie en oprande tant que le a e e e e compteur est non nul et que lindicateur Z vaut 0. Exemple Nous prsentons un exemple de boucle ainsi que les conventions que nous adoptons pour le codage dune e boucle pour. Nous recherchons dans un tableau dentiers llment dindice 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 dlments dans la table e e 7 ; valeur du diviseur 0 ; indice de llment considr 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

llment courant par 7 e e de lindice le reste de la division multiple et non termin e

` A lissue de lexcution de ces instructions, le registre BX contient lindice du premier lment du tableau e ee table ayant une valeur multiple de 7. On notera les points suivants : une tiquette BOUCLE1 indique le dbut 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 davoir eectu toutes les itrations (quand une valeur multiple de 7 a t trouve, on e e ee e sort immdiatement) ; e linstruction LOOPNE dcide sil 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 dcrment. e e e Comme pour les autres structures, on notera que les tiquettes BOUCLE sont numrotes de 1 ` n. e e e a

3.3.5

Instructions diverses

Nous dcrivons dans cette section quelques instructions qui se rv`lent souvent utiles pour le codage des e e e tests ou des boucles. CLC

3.3. LES BOUCLES EN ASSEMBLEUR CLD CMC STC STD

37

Armement des indicateurs Nous dcrivons ici quelques instructions ne prenant aucun oprande et agissant chacune sur un bit e e particulier du registre dindicateurs FLAGS. CLC mise ` zro de lindicateur de retenue C a e CLD mise ` zro de lindicateur de direction D a e CMC complmente lindicateur de retenue C e STC mise ` 1 de lindicateur de retenue C a STD mise ` 1 de lindicateur de direction D a

3.3.6

Le traitement des cha nes de donnes e

Nous prsentons dans cette section des instructions spcialement conues pour le traitement de squences e e c e de donnes, que ces donnes soient des caract`res (des octets) ou des mots. Chacune eectue le traitement e e e dun lment de cha ee ne. Il y a cinq types dinstruction : LODS : chargement dun lment de cha depuis la mmoire dans un registre ee ne e STOS : criture dun lment de cha en mmoire e ee ne e MOVS : transfert dun lment entre deux cha ee nes CMPS : comparaison entre deux lments de cha ee ne SCAS : comparaison entre une valeur et un lment de cha ee ne Toutes ces instructions sont conues pour tre aisment insres dans une boucle qui traitera lensemble c e e ee des lments de la cha ee ne. Classiquement, lors dune itration, un lment dune cha est rfrenc par e ee ne ee e son index dans la cha ne. Pour pouvoir itrer linstruction, il faut donc incrment cet index apr`s chaque e e e e traitement. Pour nous aider, les instructions de traitement de cha nes incrmentent automatiquement lindex. e Par ailleurs, ces instructions traitent des cha nes doctets, ou de mots. Aussi, selon le type de donnes traites, e e 1 ou 2 doit tre ajout ` la valeur de lindex. Cest eectivement de cette mani`re quagissent ces instructions. e ea e Notons galement que pour traiter les cha e nes de leur n vers leur dbut plutt que dans le sens contraire, il e o sut de soustraire 1 ou 2 ` la valeur de lindex. Pour cela, lindicateur D du registre FLAGS indique la direction a du traitement. Si D vaut 0, le traitement va du dbut vers la n de la cha et la valeur 1 ou 2 est ajoute ` e ne e a lindex. Si D vaut 1, le traitement va dans le sens contraire et la valeur 1 ou 2 est soustraite ` lindex. Notons a que le bit D est positionn par les instructions STD et CLD. Remarque importante : les indicateurs de FLAGS e ne sont pas modis par les oprations modiant la valeur des index. e e Dans les instructions de traitement de cha nes de caract`res, le registre SI pointe implicitement vers la e cha source, le registre DI vers la cha destination. ne ne LODS chargement dun lment de cha ee ne

LODSB LODSW O D I T S Z A P C

38

CHAPITRE 3. LES INSTRUCTIONS DU 8086

LODSB charge le registre AL (respectivement, AX pour linstruction LODSW) avec loctet (respectivement le mot) point par le registre SI. Une fois le chargement eectu, il est automatiquement ajout 1 (respectivee e e ment 2) ` SI si lindicateur D vaut 0, ou retir 1 (respectivement 2) si lindicateur D vaut 1. a e MOVS transfert dun lment entre deux cha ee nes

MOVSB MOVSW O D I T S Z A P C

MOVSB copie loctet (respectivement le mot pour linstruction MOVSW) point par SI vers loctet (respece tivement le mot) point par ES:DI. Le segment destination est forcment ES. Par contre, le segment de la e e source qui est DS par dfaut peut tre redni. e e e Une fois la copie ralise, SI et DI sont automatiquement modis. Si lindicateur de direction vaut 0, 1 e e e (respectivement 2) est ajout ` SI et DI. Si lindicateur de direction vaut 1, 1 (respectivement 2) est retir ea e a ` SI et DI. STOS criture en mmoire dun lment dune cha e e ee ne

STOSB STOSW O D I T S Z A P C

STOSB crit en mmoire loctet (respectivement le mot pour linstruction STOSW) se trouvant dans le e e registre AL (respectivement dans le registre AX) en mmoire ` ladresse pointe par le registre DI. Le segment e a e destination est forcment ES. e Une fois la copie ralise, DI est automatiquement modi. Si lindicateur de direction vaut 0, 1 (respece e e tivement 2) est ajout ` DI. Si lindicateur de direction vaut 1, 1 (respectivement 2) est retir ` DI. ea ea Nous donnons un premier exemple qui consiste ` multiplier par 2 tous les lments dun tableau dentiers a ee .data DW DW .code mov mov mov lea lea mov BOUCLE1: lodsw mov mul stosw loop ... TABLEAU RES

10, 20, 30, 40, 50, 60, 70, 80, 90, 100 10 DUP (0) ax, ds, es, si, di, cx, @data ax ax TABLEAU RES 10

bl, 2 bl BOUCLE1

3.3. LES BOUCLES EN ASSEMBLEUR

39

Un deuxi`me exemple illustre la transformation dune table de donnes codes en dcimal non compact e e e e e en ASCII. Cette opration est simplement obtenue par ou-logique avec la valeur 30h (le code ASCII des e chires 0, 1, ... 9 est 30h, 31h, ... 39h). .data DW DW .code mov mov mov lea lea mov BOUCLE1: lodsw or stosw loop ... TABLEAU RES CMPS 1, 2, 3, 4, 5, 6, 7, 8, 9 9 DUP (0) ax, ds, es, si, di, cx, @data ax ax TABLEAU RES 9

al, 30h BOUCLE1

comparaison de cha nes

CMPSB CMPSW O * D I T S * Z * A * P * C *

CMPSB compare loctet (respectivement le mot pour linstruction CMPSW) point par SI ` loctet (respece a tivement le mot) point par ES:DI. Le segment destination est forcment ES. Par contre, le segment de la e e source qui est DS par dfaut peut tre redni. e e e Une fois la copie ralise, SI et DI sont automatiquement modis. Si lindicateur de direction vaut 0, 1 e e e (respectivement 2) est ajout ` SI et DI. Si lindicateur de direction vaut 1, 1 (respectivement 2) est retir ea e a ` SI et DI. SCAS comparaison dun lment de cha avec une valeur ee ne SCASB SCASW O * D I T S * Z * A * P * C *

SCASB compare la valeur de loctet (respectivement le mot pour linstruction SCASW) contenu dans le registre AL (respectivement AX) ` loctet (respectivement le mot) point par ES:DI. La donne en mmoire a e e e est toujours rfrence via le registre de segment ES. ee e Une fois la comparaison ralise, DI est automatiquement modi. Si lindicateur de direction vaut 0, 1 e e e (respectivement 2) est ajout ` DI. Si lindicateur de direction vaut 1, 1 (respectivement 2) est retir ` DI. ea ea REP REPE REPZ REPNE REPNZ rpter une instruction de traitement de cha e e nes de donnes e

40

CHAPITRE 3. LES INSTRUCTIONS DU 8086

Nous dcrivons ici une instruction qui permet ditrer sur toute une cha les oprations lmentaires e e ne e ee vues prcdemment. Cette instruction prxe en fait lopration ` itrer. Elle donne tout son intrt aux e e e e a e ee instructions LODS, STOS, MOVS, CMPS, SCAS. REP ne peut prxer que les instructions LODS, STOS, MOVS. Un compteur (registre CX) indique le nombre e ditrations ` eectuer. e a Les prxes REPE et REPNE ne peuvent prxer que les instructions CMPS et SCAS. Pour les prxes e e e REPE et REPNE, un compteur (registre CX) indique le nombre maximal ditrations ` eectuer. Par ailleurs, e a linstruction lmentaire est rpte tant quune condition (galit ou non-galit entre les oprandes de CMPS ee e ee e e e e e ou SCAS) nest pas remplie. 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 lments de la cha pointe par SI vers la cha pointe par ES:DI ee ne e ne e REP LODS charge CX lments de la cha pointe par SI dans AL (ou AX) ee ne e REP STOS crit CX lments de la cha pointe par ES:DI avec la valeur contenue dans AL (ou AX) e ee ne e REPE CMPS compare au plus CX lments de la cha pointe par ES:DI avec ceux de la cha pointe ee ne e ne e par SI. Les itrations sont poursuivies tant que les lments des deux cha e ee nes sont gaux et tant que e le compteur nest pas nul. D`s que lune de ces conditions nest plus vrie, linstruction REPE CMPS e e e est termine e REPE SCAS compare au plus CX lments de la cha pointe par ES:DI avec la valeur du registre AL, ee ne e ou AX selon le cas. Les itrations sont poursuivies tant que les lments de la cha sont gaux ` la e ee ne e a valeur du registre et tant que le compteur nest pas nul. D`s que lune de ces conditions nest plus e vrie, linstruction REPE SCAS est termine e e e REPNE CMPS compare au plus CX lments de la cha pointe par ES:DI avec ceux de la cha pointe ee ne e ne e par SI. Les itrations sont poursuivies tant que les lments des deux cha e ee nes sont dirents et tant que e le compteur nest pas nul. D`s que lune de ces conditions nest plus vrie, linstruction REPNE CMPS e e e est termine e REPNE SCAS compare au plus CX lments de la cha pointe par ES:DI avec la valeur du registre AL, ee ne e ou AX, selon le cas. Les itrations sont poursuivies tant que les lments de la cha sont dirents de e ee ne e la valeur du registre et tant que le compteur nest pas nul. D`s que lune de ces conditions nest plus e vrie, linstruction REPNE SCAS est termine e e e Notons que REPZ est un synonyme de REPE ; REPNZ est un synonyme de REPNE. Pour rsumer, ` chaque itration, les actions suivantes sont excutes : e a e e e 1. tester le compteur (CX). Sil est ` zro, sortir de linstruction de rptition et dclencher lexcution de a e e e e e la suivante. Sinon :

3.3. LES BOUCLES EN ASSEMBLEUR 2. excuter lopration sur la cha e e ne 3. dcrmenter le compteur e e

41

4. si lopration est SCAS ou CMPS, tester lindicateur de zro. Si la condition ditration nest pas remplie, e e e poursuivre avec linstruction qui suit le REP. Sinon : 5. recommencer Exemple 1 Copie dun tableau de caract`res dans un autre tableau. e CHAINE RES .data db db .code mov mov mov lea lea mov rep movsb ... hello world 11 dup (?) ax, ds, es, di, si, cx, @data ax ax RES TABLE 11 ; cha^ne source ; cha^ne cible

; ; ; ;

offset cha^ne cible offset cha^ne source longueur de la cha^ne copie

Exemple 2 Recherche dun caract`re dans une cha de caract`res en utilisant linstruction SCAS e ne e CHAINE .data db hello world .code mov ax, @data mov es, ax mov al, w lea di, CHAINE mov cx, 11 repne scasb ...

` A lissue de lexcution de cette squence dinstructions, le registre DI pointe sur le caract`re qui se trouve e e e apr`s le w dans la cha de caract`re, cest-`-dire o. Puisque loset de CHAINE vaut 0, di vaut 7 ` lissue e ne e a a de lexcution de repne scasb. e Exemple 3 ` Recherche dune cha de caract`res dans une autre. A lissue de cette recherche, le registre AX indiquera ne e le rsultat et vaudra 1 si la cha est trouve, 0 sinon. e ne e CH1 CH2 .data db db .code mov mov mov hello world rl ax, @data ds, ax es, ax

42 lea si, CH1 mov ax, 1 mov bx, 10 lea di, CH2 mov cx, 2 repe cmpsb je FTQ1 dec bx jne TQ1 mov ax, 0 ...

CHAPITRE 3. LES INSTRUCTIONS DU 8086

TQ1:

; sous-cha^ne trouve e

FTQ1:

3.4

Autres instructions

Nous regroupons ici quelques instructions qui peuvent tre utiles. e

3.4.1
ADC

Instructions arithmtiques e

Addition avec retenue

ADC ADC ADC O *

registre/variable, registre registre, registre/variable registre/variable, constante D I T S * Z * A * P * C *

Linstruction ADC eectue laddition du contenu du registre source au registre destination avec report de retenue, soit ; destination source + destination + retenue La retenue C est positionne en fonction du rsultat de lopration. e e e Pour expliquer le positionnement de la retenue auxiliaire A, supposons que nous additionnions des octets. Le bit A indique si une retenue a lieu entre les quatre bits de poids faible et les quatre bits de poids fort. Ainsi, si on additionne les donnes hexadcimales 45 et 3e, il y a une retenue lors de laddition des deux e e demi-octets de poids faible (5 + e est suprieur ` f, donc il y a une retenue). Aussi, le bit de retenue auxiliaire e a est positionn ` 1. ea Nous proposons un exemple daddition sur 32 bits. Nous voulons additionner une donne se trouvant e dans les registres AX et DX ` une donne se trouvant dans les registres BX et CX et ranger le rsultat dans a e e les registres AX et DX (AX et BX contiennent les poids faibles, DX et CX les poids forts). Le code est alors le suivant ; add adc ax, bx dx, cx

La premi`re instruction calcule le poids faible du rsultat en additionnant simplement les poids faibles e e des deux oprandes. La deuxi`me instruction calcule alors le poids fort du rsultat en additionnant les poids e e e forts des deux oprandes et lventuelle retenue gnre par laddition des poids faibles. Pour tenir compte e e e ee de cette retenue, on a utilis linstruction ADC. e SBB Soustraction avec retenue

3.4. AUTRES INSTRUCTIONS SBB SBB SBB O * registre/variable, registre registre, registre/variable registre/variable, constante D I T S * Z * A * P * C *

43

Linstruction SBB eectue la soustraction du contenu du registre source au registre destination avec report de retenue, soit : destination destination - source - retenue La retenue est positionne en fonction du rsultat de lopration. e e e Nous proposons un exemple de soustraction sur 32 bits. Nous voulons soustraire une donne se trouvant e dans les registres BX et CX dune donne se trouvant dans les registres AX et DX et ranger le rsultat dans e e les registres AX et DX (AX et BX contiennent les poids faibles, DX et CX les poids forts). Le code est alors le suivant ; sub sbb ax, bx dx, cx

La premi`re instruction calcule le poids faible du rsultat en soustrayant simplement les poids faibles des e e deux oprandes. La deuxi`me instruction calcule alors le poids fort du rsultat en soustrayant les poids forts e e e des deux oprandes en tenant compte de lventuelle retenue gnre par la soustraction des poids faibles. e e e ee Pour tenir compte de cette retenue, on a utilis linstruction SBB. e TEST test logique

TEST TEST O 0 D

registre/variable, registre registre/variable, constante I T S * Z * A ? P * C 0

Cette instruction eectue un et-logique entre ses deux oprandes. Cependant, contrairement ` linstruction e a AND, elle ne modie pas loprande destination. Elle se contente de positionner les indicateurs du registre e FLAGS. Par exemple, linstruction test peut tre utile pour tester le signe dun nombre (voir la description de e linstruction jz dans le paragraphe suivant) : ..... test jz ..... al, 80h negatif ; test du bit de signe

3.4.2

Les instructions dajustement dcimal e

Les instructions dcrites dans cette section sont utiles pour eectuer des calculs sur des nombres cods e e en BCD. Elles ralisent un ajustement du contenu du registre AL ou AX pour la ralisation doprations e e e arithmtiques. Elles ne prennent aucun oprande. e e Les quatre instructions en question sont les suivantes ; AAA ajustement ASCII de AL apr`s addition ADD e

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. LES INSTRUCTIONS DU 8086

Ces quatre instructions positionnent les indicateurs du registre FLAGS de la mani`re suivante : e O ? Nous reprenons le rle de chacune. o AAA ajustement apr`s addition e Linstruction AAA ne doit tre excute quapr`s avoir eectu une addition ADD. Elle transforme alors le e e e e e contenu du registre AL en un nombre dcimal non compact (cest-`-dire que le poids faible doit tre compris e e a e entre 0 et 9). Si besoin (valeur de AL suprieure ` 9), la valeur 1 est ajoute au contenu de AH. e a e Ainsi, si nous voulons raliser laddition de 36 et 45 en reprsentation dcimale non compacte, on peut e e e e crire ; e mov add ax, 0306h ax, 0405h D I T S ? Z ? A * P ? C *

qui aectera la valeur 070b au registre AX, ce qui nest pas une valeur correcte en reprsentation dcimale e e non compacte. Si on excute maintenant linstruction AAA, le registre AX contiendra ensuite la valeur 0801. e e 81 est bien la somme de 36 et 45. AAD ajustement avant division Cette instruction doit tre excute avant de raliser la division de deux oprandes octets en reprsentation e e e e e e dcimale non compacte de mani`re ` ce que la division donne le bon rsultat. Pour cela, elle transforme la e e e a e valeur non compacte contenue dans AX en une valeur binaire. e Ainsi, si nous dsirons diviser 37 par 5, on peut crire : e e mov mov aad div dx,5 ax,0307h dl

Le registre ah reoit la valeur 2, reste de la division. Le registre al reoit la valeur 5, quotient de la c c division. AAM ajustement apr`s multiplication e Cette instruction doit tre excute apr`s une multiplication de deux oprandes octets en reprsentation e e e e e e dcimale non compacte an dobtenir le rsultat de la multiplication sous forme dcimale non compacte e e e e e galement. e Ainsi, si nous dsirons multiplier 7 par 5, on peut crire : e e mov mov mul aam dx,5 ax,7 dl

3.4. AUTRES INSTRUCTIONS

45

` A lissue de lexcution de cette squence dinstructions, ax contient la valeur 0305h. On notera quavant e e lexcution de linstruction AAM, ax contient la valeur 23h, soit 35. Notez bien la dirence entre 35 et 0305h. e e AAS ajustement apr`s soustraction e Cette instruction doit tre excute apr`s une soustraction SUB de deux oprandes en reprsentation de e e e e e e cimale non compacte an dobtenir le rsultat de la soustraction en reprsentation dcimale non compacte. e e e e e Ainsi, si nous dsirons retirer 7 de 6, on peut crire : e e mov mov sub aas al,6 dl,7 al,dl

` A lissue de lexcution de cette squence dinstructions, al contient la valeur 9 (et ax contient la valeur e e FF09h). On notera quavant lexcution de linstruction AAS, ax contient la valeur 00ffh. e Instructions dajustement dcimal en reprsentation dcimale compacte e e e e Les deux instructions suivantes permettent deectuer un ajustement pour la ralisation dadditions ou de e soustractions en reprsentation dcimale compacte. Aucune instruction nest disponible pour lajustement e e e pour multiplication ou division du fait de la complexit de la tche et de la raret de son utilisation. e a e DAA ajustement dcimal de AL apr`s addition ADD e e DAS ajustement dcimal de AL apr`s soustraction e e Ces deux instructions positionnent les indicateurs du registre FLAGS de la mani`re suivante ; e O ? D I T S * Z * A * P * C *

Supposons que nous voulions additionner les nombres dcimaux 35 et 26 en reprsentation dcimale e e e compacte. Nous pourrions crire ; e e mov add daa al, 35h al, 26h

Notons que pour indiquer ` lassembleur que lon veut reprsenter en dcimal compact les nombres a e e e 35 et 26, il faut les crire comme sils taient des constantes hexadcimales. Ainsi, considrant la premi`re e e e e e instruction, 5 est mis dans les 4 bits de poids faible de AL, 3 est mis dans les 4 bits de poids fort de AL. ` A lissue de lexcution de ces trois instructions, AL contient la valeur 61h. 61 est bien le rsultat de la e e somme de 35 et 26. Pour mieux comprendre le mcanisme, notons quavant lexcution de linstruction DAA, le registre AL e e contient la valeur 5bh. En eet, le processeur ne sait pas (et na pas ` savoir) que lon a cod les nombres a e sous forme dcimale compacte ; cest simplement au programmeur de le savoir. Aussi, le 8086 excute e e e simplement dans un premier temps laddition de deux donnes hexadcimales 35h et 26h puis ajuste ce e e rsultat pour obtenir la reprsentation dcimale compacte (via linstruction DAA). e e e e Prenons un deuxi`me exemple pour comprendre le fonctionnement du bit de retenue et de dbordement. e e Soient les trois lignes ; mov add daa al, 63h al, 82h

46

CHAPITRE 3. LES INSTRUCTIONS DU 8086

Laddition dcimale de 63 et 82 donne 145, donc un nombre qui ne peut tre reprsent en dcimal e e e e e compact sur un octet puisquil est plus grand que 100. Aussi, comme pour les oprations en binaire, le e e rsultat contient le poids faible du rsultat, cest-`-dire 45, et lindicateur de retenue C ainsi que lindicateur e e a de dbordement sont positionns ` 1 par linstruction DAA. e e a Notons que cest lors de linstruction DAA qua lieu le dbordement de capacit et quapparait une retee e nue. En eet, laddition donne le rsultat hexadcimal e5h qui nest pas trop grand et ne provoque aucun e e dbordement et aucune retenue. e

3.4.3
LAHF SAHF

Autres

Instructions de transfert entre FLAGS et AH Linstruction LAHF copie dans AH la valeur du registre FLAGS. Linstruction SAHF copie le contenu de AH dans le registre FLAGS. Seuls les cinq bits S, Z, A, P et C sont modis lors de cette opration quelle que soit la valeur des 3 bits de poids fort de AH. e e

47

Chapitre 4

Les sous-programmes
4.1 Principe gnral e e

Les sous-programmes jouent, en assembleur, le rle des procdures et des fonctions dans les langages de o e haut niveau. Elles structurent les programmes en donnant un nom ` un traitement et en rduisant la taille a e des programmes qui utilisent plusieurs fois la mme squence de code. Dans la suite de ce chapitre, on dcrit e e e tout dabord le principe de fonctionnement des sous-programmes en assembleur. Nous dcrivons ensuite les e mcanismes ` mettre en jeu pour crire des sous-programmes paramtrs ou renvoyant une valeur. e a e e e

4.2

Synoptique de lappel dun sous-programme

Appeler un sous-programme consiste ` eectuer une rupture de squence, poursuivre lexcution du a e e programme et reprendre ensuite lexcution l` o` on a pralablement rompu la squence. Cest exactement e a u e e la mme notion que dans les langages de haut niveau o` lappel dune procdure suspend lexcution de e u e e la squence dinstructions en cours, excute le corps de la procdure et reprend ensuite lexcution de la e e e e squence suspendue auparavant. Notons que lon peut ` nouveau appeler une procdure dans une procdure e a e e ou quune procdure peut sappeler elle-mme. e e Dans un langage de haut niveau, on na aucun souci ` se faire pour que cela fonctionne bien, tout le a mcanisme tant pris en charge par le compilateur qui gn`re la squence dinstructions en assembleur pour e e e e e que tout fonctionne comme prvu. En assembleur, on doit comprendre le mcanisme pour pouvoir en tirer e e le maximum et galement pouvoir passer des param`tres aux sous-programmes. e e Dans ce qui suit, nous nommerons appelant le programme ou le sous-programme qui appelle un sousprogramme, et appel le sous-programme qui est appel par lappelant. e e ` A la base, deux instructions sont ncessaires : e une instruction dite dappel de sous-programme qui va rompre la squence dinstructions en cours e dexcution et donner le contrle au sous-programme ` appeler ; e o a une instruction dite de retour de sous-programme qui, place ` la n du sous-programme, indique e a au processeur quil faut reprendre lexcution du programme interrompu, l` o` il sest interrompu, e a u cest-`-dire excuter les instructions qui suivent linstruction dappel du sous-programme. a e

4.2.1

Lappel dun sous-programme

Un sous-programme est une squence dinstructions. Pour le reprer, on peut utiliser ladresse de sa pree e mi`re instruction. Pour spcier dans linstruction dappel de sous-programme le sous-programme ` appeler, e e a on va donc utiliser son adresse (comme on utilise le nom dune procdure pour lappeler dans un langage de e haut niveau : en assembleur, le nom dune procdure, cest son adresse). e

48

CHAPITRE 4. LES SOUS-PROGRAMMES

4.2.2

Retour ` lappelant a

Un sous-programme peut-tre appel a dirents endroits dans un programme. Aussi, si son adresse est e e` e toujours la mme, ladresse de retour (l` o` lexcution du programme doit reprendre apr`s excution du e a u e e e sous-programme) nest pas toujours la mme. Aussi, dans linstruction de retour de sous-programme, il est e impossible dindiquer o` il faut continuer lexcution. Aussi, il est clair que le processeur doit se rappeler u e de lendroit o` ` t ralis lappel pour pouvoir continuer lexcution du programme ` cet endroit, une u a ee e e e a fois le sous-programme excut. Le registre IP contient ` tout instant ladresse de linstruction suivante ` e e a a excuter. Lorsque le processeur excute linstruction dappel dun sous-programme, IP contient donc ladresse e e de linstruction o` devra reprendre lexcution de lappelant (cette adresse se nomme adresse de retour). Il u e sut donc de mmoriser ` linstant o` lon excute linstruction dappel de sous-programme la valeur de ce e a u e registre. En restaurant la valeur du registre IP ` lissue de lexcution du sous-programme, lexcution du a e e programme reprendra naturellement, l` o` il faut, dans lappelant. a u On pourrait utiliser un registre pour sauvegarder cette valeur du registre IP. Cependant, si le sousprogramme appel appelle lui-mme un autre sous-programme, o` va-t-on sauvegarder la valeur de IP pour e e u pouvoir reprendre son excution, puisque le registre de sauvegarde est dj` utilis. Deux registres de saue ea e vegarde ne ferait pas non plus laaire : rien nempche un sous-programme qui appelle un sous-programme e dappeler un sous-programme, ... autant de fois que lon veut. Pour rsoudre ce probl`me, nous utilisons une e e structure de donnes fondamentale en informatique, une pile. Pour comprendre les piles en informatique, e il sut de comprendre le fonctionnement dune pile dassiettes dans une cuisine. Celle-ci fonctionne de la mani`re suivante : e on place une une assiette au sommet de la pile on prend lassiette qui se trouve en sommet de la pile En informatique, cest la mme chose pour les donnes et les piles de donnes : e e e on place les donnes au sommet de la pile e on rcup`re les donnes au sommet de la pile e e e En informatique, nous pouvons utiliser une pile pour y stocker nimporte quel objet. Lintrt dune ee pile est quelle constitue une structure o` lacc`s ` un objet est uniquement ralis sur le dernier objet u e a e e empil (comme pour une pile dassiettes, on prend la derni`re assiette pose sur la pile). Revenons, ` nos e e e a sous-programmes. Quand un appel de sous-programme est eectu, on doit sauvegarder ladresse de retour. e Plaons-la sur une pile. Si ce sous-programme fait lui-mme appel ` un autre sous-programme, plaons c e a c galement ladresse de retour sur la pile (cest-`-dire, au-dessus de ladresse de retour empile prcdeme a e e e ment). Quand ce sous-programme termine son excution, consultons le sommet de la pile : elle contient e ladresse de retour de sous-programme. Dpilons-la et continuons lexcution du programme ` cette adresse. e e a Quand ce sous-programme termine galement son excution, consultons ` nouveau le sommet de la pile ; elle e e a contient ladresse de retour de ce sous-programme. Si nous la dpilons et que nous reprenons lexcution du e e programme ` cette adresse, nous serons revenus dans le premier programme appelant. Nous pouvons maina tenant itrer le processus et avoir des sous-programmes qui appellent des sous-programmes qui appellent e des sous-programmes ... Le retour de lappel au sous-programme appelant se passera alors sans aucune e dicult en utilisant la pile contenant les adresses de retour (nous nommerons cette pile, la pile des adresses e de retour).

4.2.3

Rsum e e

Nous pouvons rsumer succinctement les actions ` raliser lors de lappel et lors du retour dappel dun e a e sous-programme. Supposons que nous ayons une pile de retour. Lappel dun sous-programme est ralis e e simplement en empilant la valeur courante de IP et en stockant dans IP ladresse dappel du sous-programme. Le retour de sous-programme est ralis simplement en dpilant le sommet de la pile et en plaant cette e e e c valeur dpile dans le registre IP. e e

` 4.3. APPEL DE SOUS-PROGRAMME SANS PASSAGE DE PARAMETRE

49

4.2.4

La pile dappel de sous-programme

La pile de retour Nous avons indiqu que lutilisation dune pile de retour permet de rsoudre le probl`me des appels de e e e sous-programmes. Cependant, nous navons pas encore vu comment on ralise une pile en assembleur. Cest e en fait fort semblable ` limplantation dune pile dans un langage volu. Par ailleurs, certaines instructions a e e et certains registres sont prvus pour grer la pile de retour en assembleur. e e La pile elle-mme est une zone mmoire (une esp`ce de tableau) o` le processeur range les donnes ` e e e u e a sauvegarder. Le seul probl`me ` rsoudre est alors de savoir o` se trouve son sommet. En eet, si lon voit e a e u clairement o` se trouve le sommet dune pile dassiettes dans une cuisine, il est dicile de dire que lon voit u ce sommet pour une pile informatique. Aussi, nous avons besoin dun indicateur qui va nous (( montrer )) ce sommet. Les lments de la pile tant donc situs dans une zone mmoire, les lments tant placs les uns ee e e e ee e e a ` la suite des autres, il nous sut davoir un registre qui indique ladresse du sommet de la pile. Llment ee en-dessous du sommet de la pile se trouve alors dans lemplacement mmoire voisin, ... Ce registre se nomme e le pointeur de sommet de pile. Cest le registre SP (SP signie stack pointer, cest ` dire (( pointeur de pile ))). a Quand on empile une donne, ce pointeur de pile doit tre mis ` jour pour indiquer le nouveau sommet e e a de pile (car (( la pile monte ))). Quand on dpile une donne, ce pointeur doit galement tre mis ` jour e e e e a (car (( la pile descend ))). Etant donne limportance de ces oprations, les instructions dappel et de retour e e de sous-programme modient automatiquement le pointeur de pile pour que les appels et les retours de sous-programmes fonctionnent correctement. Classiquement, les piles sont implantes avec leur base au-dessus de leur sommet, cest-`-dire que ladresse e a du sommet de pile est infrieure ` ladresse de leur base. Aussi, quand une donne est empile, le pointeur e a e e de sommet de pile est dcrment, alors que lorsquune donne est dpile, le pointeur de sommet de pile est e e e e e e incrment. e e Retour sur les instructions dappel et de retour de sous-programmes Ayant dcrit limplantation de la pile de retour, nous pouvons maintenant dcrire compltement le fonce e e tionnement des instructions dappel et de retour de sous-programmes. Instruction dappel de sous-programme ` A lappel dun sous-programme, les oprations suivantes sont automatiquement ralises : e e e SP est dcrment e e e (SP) adresse de retour (le contenu du registre IP) IP oprande de linstruction dappel de sous-programme e Instruction de retour dun sous-programme IP (SP) SP est incrment e e

4.3
4.3.1

Appel de sous-programme sans passage de param`tre e


Appels et retours de sous-programmes

Nous nous intressons ici au cas le plus simple dappel de sous-programme, le cas o` le sous-programme e u ne prend pas de param`tre en entre. Il sut alors dutiliser une instruction CALL pour appeler le souse e programme et une instruction RET pour eectuer le retour ` lappelant. Nous dcrivons ces deux instructions. a e

50 CALL : Appel dun sous-programme

CHAPITRE 4. LES SOUS-PROGRAMMES

Nous dcrivons ici linstruction dappel dun sous-programme. 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. La valeur du registre IP est mise ` jour avec la valeur de loprande fournie ` linstruction CALL pour que a e a lexcution du programme se poursuive en dbut de 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. Le contenu du registre CS nest pas a e modi. e RET : retour dun sous-programme RET O D I T S Z A P C

RET rend le contrle au sous-programme appelant. Pour cela, le sommet de pile est dpil dans le registre o e e ip. Ladresse de retour doit donc ncessairement se trouver en sommet de pile. e Squelette dun sous-programme Nous donnons ci-dessous le squelette dun programme en assembleur : nom_sbr proc .... corps du sous-programme .... ret endp

nom_sbr

Nous notons les points suivants : le sous-programme est (( dclar )) par la pseudo-instruction proc, son nom tant indiqu dans le champ e e e e tiquette. e on trouve ensuite les instructions du sous-programme linstruction RET indique le retour ` lappelant a la pseudo-instruction endp indique la n du sous-programme. On indique le nom du sous-programme dans le champ tiquette e

4.3.2

Sauvegarde et restauration de contexte

Un sous-programme est libre de modier le contenu de tous les registres. Cependant, lappelant peut avoir stock des valeurs dans des registres quil aimerait ne pas voir modi durant lexcution dun souse e e programme quil appelle. Pour cela, la solution consiste ` sauvegarder la valeur des registres en question. An que tout fonctionne a bien et an davoir un mcanisme standard, cette sauvegarde est eectue sur la pile. On peut raliser ces e e e oprations ` laide des instructions dj` prsentes. Ainsi, 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, 2 [sp], ax

` 4.3. APPEL DE SOUS-PROGRAMME SANS PASSAGE DE PARAMETRE

51

La premi`re instruction place la valeur du registre AX au sommet de la pile. La deuxi`me fait pointer le e e sommet de pile (( au-dessus )) (ou (( au-dessous )), selon le point de vue adopt). e Cependant, ces oprations de sauvegarde/restauration du contenu de registres sont tellement courantes e que des instructions spciales ont t ajoutes pour les eectuer. Linstruction PUSH place la valeur spcie e ee e e e en oprande sur la pile. Linstruction POP retire le contenu du sommet de la pile et le place dans loprande e e du POP. Il est important de noter que par convention, il est sous la responsabilit de lappel de sauvegarder e e la valeur des registres quil utilise et de restaurer leur valeur ` la n de lexcution du sous-programme. a e Lappelant na pas ` se soucier de ces sauvegardes. a Nous prsentons maintenant les instructions PUSH et POP. e PUSH sauvegarde sur la pile dune valeur

PUSH O D I

registre/variable T S Z A P C

registre 16 bits dnote lun des registres ax, bx, cx, dx, si ou di. e Linstruction PUSH place au sommet de la pile la valeur de loprande qui est donc ncessairement le e e contenu dun registre. La valeur du pointeur de sommet de pile SP est diminue de 2. e PUSHF sauvegarde sur la pile de la valeur du registre dindicateurs

PUSHF O D I T S Z A P C

PUSHF empile le registre dindicateurs FLAGS. La valeur du pointeur de sommet de pile SP est ensuite diminue de 2. e POP dpilement dune valeur e

POP O D I

registre/variable T S Z A P C

POP dpile une valeur de la pile de retour et place la valeur ainsi dpile dans loprande. La valeur du e e e e pointeur de sommet de pile SP est augmente de 2. e POPF dpilement de la valeur du registre dindicateurs e

POPF O * D * I * T * S * Z * A * P * C *

POPF dpile la valeur de FLAGS. La valeur du pointeur de sommet de pile est augmente de 2. e e

52

CHAPITRE 4. LES SOUS-PROGRAMMES

4.4

Passage de param`tres et variables locales e

Un sous-programme prend souvent des param`tres en entre d`s quil est capable de raliser des actions e e e e un peu complexes. Il est galement courant quun sous-programme ait besoin de variables locales. Enn, il e est galement courant quun sous-programme ait des param`tres en sortie (rsultat) ou renvoie une valeur e e e (comme une fonction dans un langage de haut niveau). Nous traitons de tous ces mcanismes dans cette e section. Comme toujours, pour autoriser une exibilit maximale, tous ces mcanismes vont tre implants ` laide e e e e a de la pile. Les param`tres seront empils par lappelant juste avant lappel. Lappel rservera, si ncessaire, e e e e e un espace dans la pile pour y mettre la valeur de ses variables locales. Quant au renvoi dune valeur, il se fera gnralement par un registre. Nous dcrivons maintenant dans le dtail chacun de ces mcanismes. e e e e e

4.4.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 : lappelant e a charge un registre avec la valeur ` passer ; lappel rcup`re la valeur dans ce mme registre. a e e e e Appelant ... mov call ... facto proc ... ... ret facto endp Appel e

ax, 8 facto

; parametre dans ax

Nous donnons un exemple de sous-programme calculant la factorielle dun nombre dont la valeur est passe en entre dans le registre AX. e e Appelant ... mov call ... facto proc push mov mov boucle1: mul loop pop ret facto endp Appel e

ax, 8 facto

cx cx, ax ax, 1 ax, cx boucle1 cx

4.4.2

Passage de param`tres dans la pile e

Le passage de param`tres par la pile permet de tout faire. Cest de cette mani`re que tous les langages e e de haut niveau passent leur param`tres aux procdures et fonctions. La ma e e trise de cette technique est indispensable pour bien programmer en assembleur. Pour cela, un peu de rigueur quant ` la manipulation de a la pile de retour est ncessaire. Le processeur utilise implicitement la pile pour y empiler ladresse de retour e des sous-programmes. Il y a donc une contrainte ` respecter lorsque lon veut utiliser la pile : a Le microprocesseur doit imprativement trouver ladresse de retour dun sous-programme au e sommet de la pile lorsquil excute une instruction RET. e

` 4.4. PASSAGE DE PARAMETRES ET VARIABLES LOCALES

53

Si on respecte cette convention, on peut faire tout ce que lon veut et cela fonctionnera. Par convention, nous devons dcider dun protocole commun aux sous-programmes appelants et appels e e quant ` la localisation des donnes sur la pile. Nous savons que le processeur empile la valeur du registre a e IP quand il excute une instruction CALL. Le sous-programme appelant est responsable du passage des e param`tres, cest-`-dire de leur empilage. Aussi, nous raliserons le passage de param`tres de la mani`re e a e e e suivante : lappelant empile (par des instructions PUSH) la valeur des param`tres puis excute lappel du e e sous-programme (instruction CALL). La pile a alors la forme indique ` la gure 4.1. e a

6 Param`tres dappel e Adresses croissantes

Sauvegarde de ip lors du call sp -

Fig. 4.1 Pile apr`s excution de linstruction call. e e

Pour lappel, la convention est dutiliser le registre BP pour accder ` la valeur des param`tres. BP doit e e a e donc tre initialis au dbut de lexcution de lappel. Aussi, sa valeur doit tre galement sauvegarde. e e e e e e e e Cette sauvegarde doit tre ralise par lappel. e e e e Pour rsumer, nous donnons le squelette dun appel de sous-programme avec passage de param`tres. e e Supposons que nous passions trois param`tres, les valeurs des registres AX, BX et CX. e Appelant ... push push push call add ... sbr ax bx cx sbr sp, 6 proc push mov ... ... ... ... ... ... pop ret endp Appel e

bp bp, sp ...[bp+4]... ...[bp+6]... ...[bp+8]...

bp

sbr Nous notons les points suivants :

dans lappelant, les valeurs des param`tres sont empiles avant lappel du sous-programme e e

54

CHAPITRE 4. LES SOUS-PROGRAMMES dans lappel (donc, la valeur du compteur ordinal IP ` t empile sur 2 octets), la valeur du registre e aee e BP est empile e

la valeur du registre BP est initialise avec la valeur du sommet de pile contenue dans SP e

on peut accder maintenant ` la valeur des param`tres via le registre BP. Ainsi, 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 n de sous-programme appel, on doit restaurer la valeur du registre BP pour que lappelant nait e pas de probl`me. Cest le rle de linstruction POP e o

apr`s lexcution du POP, le sommet de pile contient ladresse de retour ; un RET peut donc tre excut e e e e e en toute scurit e e

de retour dans lappelant, la zone mmoire utilise pour stocker des param`tres doit tre libre. Pour e e e e ee cela, on modie simplement la valeur du registre pointeur de sommet de pile SP en lui ajoutant la valeur 6 qui est le nombre doctets occups sur la pile par les valeurs empiles (2 pour AX, 2 pour BX e e et 2 pour CX). On aurait pu galement librer la pile avec des instructions POP. Cependant, lhabitude e e veut que lon crive les programmes comme il a t indiqu ici. Pai ailleurs, utiliser des instructions e ee e POP modie la valeur des registres, ce qui peut amener des eets indsirables e

Nous donnons un exemple dappel de sous-programme : un sous-programme qui calcule le PGCD de deux nombres passs en param`tre. e e Lalgorithme 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, x (ou y : en sortie de boucle, les deux variables contiennent la mme valeur) contient e la valeur du PGCD.

` 4.4. PASSAGE DE PARAMETRES ET VARIABLES LOCALES

55

Appelant ... mov push mov push call add ... pgcd ax, 453 ax ; empile x ax, 36 ax ; empile y pgcd sp, 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, sp ax ; sauvegarde de bx ; ax et bx ax, [bp+4] ; charge y dans ax bx, [bp+6] ; charge x dans bx ax, bx sup ; saut si y>x ftq1 ; sortir si x=y ax, bx tq1 bx, ax tq1 affiche_nombre bx ax bp

On suppose que lon dispose du sous-programme affiche_nombre qui ache le rsultatun nombre ` e a lcran. e

4.4.3

Variables locales

Nous abordons maintenant le probl`me des variables locales. Celui-ci va galement tre rsolu en utilisant e e e e la pile de retour. Les locales sont, par dnition, uniquement connues du sous-programme o` elles sont e u dclares. Aussi, la gestion des locales doit-elle tre enti`rement ralise dans lappel. Pour cela, la solution e e e e e e e la plus simple consiste, une fois sauvegarde la valeur des registres en dbut de sous-programme, ` rserver e e a e de la place dans la pile pour y mettre la valeur des locales. Cela donne la conguration de la gure 4.2.

Nous donnons le squelette dun appel de sous-programme avec passage de param`tres et dnition de e e variables locales. Supposons que nous passions deux param`tres, les valeurs des registres AX, BX, 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.

56

CHAPITRE 4. LES SOUS-PROGRAMMES

Param`tres dappel e

Sauvegarde de ip lors du call 6 Sauvegarde de bp Adresses croissantes

Sauvegarde des registres

sp

Variables locales

Fig. 4.2 Pile apr`s rservation despace pour les variables locales. e e

Appelant ... push push call add ... sbr ax bx sbr sp, 6 proc push mov push push sub ... ... ... ... ... ... add pop pop pop ret endp

Appel e

bp bp, sp di si sp, 10 ...[bp+4]... ...[bp+6]... ...[bp-6]... sp, 10 si di bp

sbr

Le sous-programme appelant ressemble normment au cas prsent plus haut de passage de param`tres e e e e e

` 4.4. PASSAGE DE PARAMETRES ET VARIABLES LOCALES et nappelle donc aucun commentaire particulier. Pour lappel, nous notons les points suivants : e la sauvegarde (comme auparavant) du registre BP linitialisation du registre BP pour quil pointe au sommet de la pile

57

la sauvegarde de la valeur des registres DI et SI. Notons que BP pointe sur la valeur de la sauvegarde du registre DI la rservation de 10 octets sur la pile (par linstruction sub sp, 10) qui pourront tre manipuls e e e librement dans le sous-programme et dont le rle est de contenir la valeur des variables locales o lacc`s aux variables locales se fera d`s lors par un adressage du genre [bp-6] ... [bp-15], selon la e e taille des donnes. Notons, cest tr`s important, que le programmeur doit dnir lui-mme lutilisation e e e e de ces 10 octets. en n dappel, on lib`re la zone de pile utilise pour stocker la valeur des variables locales (instruction e e e ADD) on restaure ensuite la valeur dentre des registres SI, DI et BP. e

4.4.4

Retour dune valeur par un sous-programme : les fonctions en assembleur

Dans un langage de haut niveau, une fonction est une procdure qui retourne une valeur. En assembleur, e une fonction sera un sous-programme qui retournera une valeur. Par convention, la valeur renvoye est place e e dans un registre. Par exemple, 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 ... mov push call ... facto proc push mov push mov mov boucle1: mul loop pop pop ret facto endp Appel e

ax, 8 ax facto

bp bp, sp cx cx, [bp+4] ax, 1 cx boucle1 cx bp

58

CHAPITRE 4. LES SOUS-PROGRAMMES

59

Chapitre 5

Les interruptions du DOS


Nous prsentons ici tr`s succinctement quelques interruptions du BIOS qui nous serons utiles pendant e e les TPs pour, par exemple, acher un message ` lcran ou saisir un caract`re au clavier. Dune mani`re a e e e gnrale, toutes les oprations dentres/sorties sont ralises par interruptions BIOS. e e e e e e Le mcanisme dinterruptions sera dcrit en dtail en cours. e e e Sachons simplement ici quune interruption est une esp`ce de sous-programme pr-existant dans la mae e chine. Lappel se fait via linstruction int 21h. Le registre ah contient un numro qui rfrence la fonctione ee nalit que lon veut utiliser (9 pour acher une cha de caract`res, 1 pour saisir la frappe dun caract`re e ne e e au clavier, ...)

5.1
5.1.1

Achages de caract`res ` lcran e a e


Acher un caract`re ` lcran e a e
mov mov int dl, a ah, 2 21h

ache le caract`re a ` lcran. e a e

5.1.2
msg

Acher un message ` lcran a e


.data db .code mov mov mov lea int mov int end hello world, 13, 10, $ ax, ds, ah, dx, 21h ah, 21h @data ax 9 msg 4ch

ache le message hello world ` lcran. La cha de caract`res doit imprativement se terminer par un a e ne e e caract`re $. Les caract`res 13 et 10 sont les codes ASCII des 2 caract`res constituant un retour-chariot. e e e

60

CHAPITRE 5. LES INTERRUPTIONS DU DOS

5.2
5.2.1

Saisir une frappe au clavier


Saisie avec cho e

Saisie dun caract`re e mov int ah, 1 21h

renvoie dans le registre al le code du caract`re lu au clavier. e

Saisie dune cha de caract`res ne e msg .data db .code mov mov mov mov lea mov int 80 dup (?) ax, ds, bx, cx, dx, ah, 21h @data ax 0 80 msg 3fh

saisit une cha de caract`res au clavier dau plus cx caract`res et la stocke dans la variable msg qui est ne e e dclare comme un tableau de 80 octets (soit 80 caract`res). Le nombre de caract`res lus est plac dans le e e e e e registre ax. Notons que le retour-chariot est stock sous forme de deux caract`res successifs : le premier de e e code 13, le second de code 10.

5.2.2

Saisie sans cho e


mov int ah, 8 21h

lit un caract`re au clavier et le renvoie dans le registre al. Ce caract`re nest pas ach ` lcran. e e ea e

5.3

Lacc`s aux chiers e

Nous prsentons ici les interruptions ` utiliser pour eectuer les traitements de base sur les chiers. On e a se reportera ` 6.3 pour un exemple complet de traitement de chiers. a

5.3.1

Principe

En assembleur, les chiers sont traits dune mani`re assez similaire ` un langage volu comme Pascal. e e a e e Pour pouvoir accder aux donnes dun chier, que ce soit en lecture ou en criture, il faut pralablement e e e e ` louvrir. A louverture, le programme rcup`re une poigne. Ensuite, toutes les oprations sur ce chier seront e e e e eectues en spciant cette poigne. A un instant donn, plusieurs chiers peuvent avoir t ouverts par un e e e ` e ee programme. Chacun a une poigne dirente laquelle permet au programme de les distinguer. e e

` 5.3. LACCES AUX FICHIERS

61

5.3.2

Cration dun chier e


Avant lappel cx contient la valeur 0 ; ds:dx pointent sur le nom de chier. Cest une cha ne de caract`res termine par un e e caract`re ASCII de code 0. e Apr`s lappel e Le bit C du registre flags vaut 1 si une erreur est survenue.

Lappel a le format suivant : mov int ah, 3ch 21h

5.3.3

Ouverture dun chier


Avant lappel al contient le mode dacc`s : e 0 pour lecture, 1 pour lcriture, e 2 pour les deux ; ds:dx pointent sur le nom de chier. Cest une cha ne de caract`res termine par un e e caract`re ASCII de code 0. e Apr`s lappel e Le bit C du registre flags vaut 1 si une erreur est survenue. Sinon, le registre ax contient la poigne sur le chier ouvert. e

Lappel a le format suivant : mov int ah, 3dh 21h

5.3.4

Fermeture dun chier


Avant lappel bx contient la poigne du chier ` e a fermer Apr`s lappel e Le bit C du registre flags vaut 1 si une erreur est survenue. Sinon, le chier est ferm. Il ne peut plus tre accd via sa e e e e poigne. Si on veut laccder ` nouveau, e e a il faudra le r-ouvrir au pralable. e e

Lappel a le format suivant : mov int ah, 3eh 21h

62

CHAPITRE 5. LES INTERRUPTIONS DU DOS

5.3.5

Lecture dans un chier


Avant lappel bx contient la poigne du chier e ; cx contient le caract`res ` lire ; e a nombre de Apr`s lappel e Le bit C du registre flags vaut 1 si une erreur est survenue. Sinon, le registre ax contient le nombre de caract`res lus. En e principe, cest le nombre de caract`res e qui devait tre lus ` moins que la n de e a chier ne soit atteinte.

ds:dx contient ladresse du tampon o` il faut stocker les cau ract`res lus. e

On peut utiliser cet appel pour lire une cha de caract`res taps au clavier. Pour cela, il faut que bx ne e e contienne la valeur 0 en entre. La lecture seectuera sur au plus cx caract`res et au plus jusqu` la frappe e e a dun retour-chariot. Lappel a le format suivant : mov int ah, 3fh 21h

5.3.6

Ecriture dans un chier


Avant lappel bx contient la poigne du chier e ; cx contient le nombre caract`res ` crire ; e ae de Apr`s lappel e Le bit C du registre flags vaut 1 si une erreur est survenue. Sinon, le registre ax contient le nombre de caract`res crits. e e

ds:dx pointent sur le tampon contenant les caract`res ` crire. e ae Lappel a alors le format suivant : mov int ah, 40h 21h

5.4

Lire lheure courante

La fonction 2ch de linterruption 21h lit lheure courante, telle quelle est stocke dans lordinateur (sil e nest pas ` lheure, cela ne donnera pas la bonne heure). a mov int ah, 2ch 21h

Au retour de lappel, les registres contiennent les information suivantes : ch heures cl minutes dh secondes dl centi`mes de secondes e Voir la section 6.4 pour un exemple dutilisation de cette interruption.

5.5. LIRE LA DATE COURANTE

63

5.5

Lire la date courante

La fonction 2ah de linterruption 21h lit la date courante, telle quelle est stocke dans lordinateur e (comme pour lheure, si la date nest pas bonne, cela ne donnera pas la bonne date). mov int ah, 2ah 21h

Au retour de lappel, les registres contiennent les information suivantes : al jour de la semaine cod (0 : dimanche, 1 : lundi, ...) e cx anne e dh mois dl jour

64

CHAPITRE 5. LES INTERRUPTIONS DU DOS

65

Chapitre 6

Etudes de cas
6.1 Cas 1 : lire une suite de caract`res au clavier e

Probl`me ` rsoudre e a e Ecrire un programme qui lit des caract`res frapps au clavier et les achent ` lcran tant que lutilisateur e e a e nappuie pas sur <esc>. 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 mthodologie de programmation en asseme bleur, on doit tout dabord 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 rpondent ` la mme condition, 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

66 Ce que nous pouvons traduire en assembleur : Programme .MODEL .DATA .CODE mov mov mov int cmp je mov mov int jmp mov int END SMALL

CHAPITRE 6. ETUDES DE CAS

boucle:

fin:

ax, @data ds, ax ah, 8 21h al, 27 ; 27 est le code ASCII de la touche <Esc> fin dl, al ah, 2 21h boucle ah,4ch 21h

6.2

Cas 2 : acher un nombre en base 2

Probl`me ` rsoudre e a e Acher la valeur en binaire dun nombre. Principe Acher lun apr`s lautre les bits du nombre en eectuant une boucle du genre : e pour b := 1 a 16 faire si (valeur.bit[b] = 0) alors afficher (0) sinon afficher (1) fait Pour accder aux bits du nombre, plusieurs techniques sont envisageables. La plus simple consiste ` e a dcaler vers la gauche les bits du nombre (instruction SHL ou ROL) en plaant le bit qui dborde dans le e c e C du registre dtat. En testant ensuite ce bit C (avec une instruction JC ou JNC), on sait sil faut acher e un 0 ou un 1. Remarquons quen utilisant une instruction ROL, une fois les 16 dcalages eectus, la e e valeur a t restaure. ee e Programme .MODEL .STACK .DATA dw .CODE mov mov mov mov rol SMALL 100h 52612 ax, ds, bx, cx, bx, @data ax [valeur] 16 1

valeur

boucle:

6.3. CAS 3 : AFFICHER LE CONTENU DUN FICHIER jc mov jmp mov mov int loop mov int END un dl, 0 print dl, 1 ah, 2 21h boucle ah,4ch 21h

67

un: print:

fin:

ache 1100110110000100 qui est bien la reprsentation binaire de 52612. e

6.3

Cas 3 : Acher le contenu dun chier

Nous montrons sur un exemple lutilisation des interruptions dacc`s aux chiers. e Probl`me ` rsoudre e a e Acher le contenu dun chier ` lcran. a e Principe Le principe de lalgorithme est le suivant : ouverture du chier rpter e e lire les caract`res suivants du chier et les mettre dans une zone mmoire prvue pour cet usage e e e (un tampon). Notons que cette action lit eectivement caract`res. En gnral, = . Si la n e e e de chier est atteinte pendant la lecture, on a lu les < derniers caract`res du chier. e acher caract`res du tampon ` lcran e a e jusqu` ce que = a fermer le chier Programme
.MODEL SMALL .STACK 100H .DATA DB toto, 0 db 100 dup (?), $ db Erreur a louverture, 13, 10, $ db Erreur a la lecture, 13, 10, $ .CODE ; ; initialisations ; mov ax,@data mov ds,ax ; ; ouverture et test dexistence du fichier ; mov ah,3dh ; ouverture du fichier mov al,0 ; acc`s en lecture e lea dx, Filename int 21h jc err1 ; le fichier nexiste pas -> erreur ; ; prparation de la boucle e ;

Filename Buffer err1_msg err2_msg

68
mov bx, ax ; sauvegarde de la poigne e lea dx, Buffer ; boucle: ; ; lecture des 100 caract`res suivants du fichier e ; mov cx, 100 mov ah, 3fh ; lecture du fichier int 21h jc err2 ; ; affichage a lecran des caract`res lus e ; mov cx, ax mov si, ax mov si+Buffer, $ mov ah,9 int 21h cmp cx, 100 je boucle ; ; fin du traitement : mov ah, 3eh ; fermeture du fichier int 21h jmp fin ; ; traitements des erreurs ; err1: ; ; le fichier ne peut etre ouvert ; lea dx, err1_msg jmp affiche_msg err2: ; ; erreur lors de lacc`s au contenu du fichier e ; lea dx, err2_msg jmp affiche_msg affiche_msg: mov ah,9 int 21h jmp fin fin: mov ah,4Ch int 21h END

CHAPITRE 6. ETUDES DE CAS

On a suppos que le chier se nomme toto. e

6.4

Cas 4 : acher lheure courante

Probl`me ` rsoudre e a e Acher lheure courante ` lcran sous une forme lisible. a e Principe Il sut de lire lheure courante via linterruption BIOS ad hoc et dacher le contenu des registres dune mani`re comprhensible pour un tre humain. e e e Programme
; Ce programme affiche lheure courante .MODEL SMALL .STACK 100H .DATA db Il est : $ db h $ db m $ db s, $ .CODE mov ax,@data mov ds,ax ;

ch1 ch2 ch3 ch4

6.4. CAS 4 : AFFICHER LHEURE COURANTE


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

69

fin:

aff_nb

aff_nb

aff_str

70
push mov mov int pop pop ret ENDP END ax dx,ax ah,9 21h ax dx

CHAPITRE 6. ETUDES DE CAS

aff_str

71

Annexe A

Introduction ` lutilisation du a debugger


Nous indiquons ici en quelques mots lutilisation du debugger. Un debugger est un outil qui permet dexcuter instruction par instruction un programme tout en suivant en permanence lvolution du contenu e e des registres, du segment de donnes, la pile, ... Cest un outil indispensable pour simplier et acclrer la e ee mise en point de programmes.

A.1

Lancement et prsentation du debugger e

Lancement du debugger Apr`s avoir obtenu un programme excutable (que nous appellerons ici prg.exe ` titre dexemple), on e e a lance la commande : td2 prg Lcran seace et ache une interface avec une fentre dont on peut modier la taille avec la souris. Une e e barre de menus est disponible en haut de lcran. Lcran ressemble alors ` ce qui est prsent ` la gure e e a e ea A.1. Notons immdiatement que lon quitte le debugger en tapant Alt-X. e Que peut-on faire avec un debugger ? Sans entrer tout de suite dans les dtails, il est important de comprendre avant tout ce que lon peut e attendre dun debugger et le principe gnral de son utilisation. e e Sans en attendre de miracles, un debugger aide (grandement) ` rpondre 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, une fois dans le debugger, on peut placer des points darrt dans le programme an quil sy e arrte 1 . Cest-`-dire, on indique les instructions o` lon veut que le programme sarrte. Une fois arrt, on e a u e ee pourra consulter ` loisir le contenu des registres, le contenu de la mmoire ou de la pile. a e Nous dtaillons maintenant le contenu de la fentre et prsentons les fonctionnalits les plus utiles. e e e e
1. il est important de bien noter que si lon ne place pas de points darrt dans le programme, celui-ci va sexcuter sans e e sarrter avant sa terminaison normale (donc, sil boucle, il ne sarrtera pas plus sous le debugger que si on lexcute sous e e e DOS). Dans ce cas, excuter le programme sous le debugger ou directement sous DOS ne change rien, si ce nest que lon pourra e ensuite consulter le contenu des registres.

72

` ANNEXE A. INTRODUCTION A LUTILISATION DU DEBUGGER

adresse

code instruction

6 mnmonique e

oprande e

ax bx cx dx si di bp sp ds es ss cs ip

0000 0000 0000 0000 0000 0000 0000 0000 .... .... .... .... 0000

c=0 z=0 s=0 o=0 p=0 a=0 i=1 d=0

Segment de code Segment de donnes es e


adresse 8 valeurs hexadcimales e 8 caract`res e ASCII correspondants

Segment de pile

Fig. A.1 La fentre du dbugger. e e

A.1.1

La fentre de debuggage e

Le menu Run Parmi dautres possibilits, ce menu vous propose : e Run lance le programme. Si son excution a dj` dbute, le programme poursuit son excution l` o` e ea e e e a u il avait t arrt. Sinon, il dmarre ` son dbut. Il ne sarrte que lorsquil arrive ` son terme ou sur ee ee e a e e a le point darrt (cf. plus loin) suivant, si lon en a plac ; e e Go to cursor ayant cliqu sur une instruction, le programme dbute ou poursuit son excution jusqu` e e e a atteindre cette instruction ; Trace into arrt sur une instruction call, consid`re lexcution de lensemble du sous-programme ee e e comme un pas dexcution ; e Step over excute la prochaine instruction et sarrte ; e e Until return excute les instructions qui suivent jusque la n du programme ou jusqu` la prochaine e a instruction ret ; Animate dclenche lexcution instructions par instructions. La vitesse dexcution est rglable et est e e e e demande ` lutilisateur ; e a Prg Reset remise ` zro de lexcution du programme. Remet le debugger dans son tat initial, comme a e e e si lon navait pas encore lanc lexcution du programme. e e

A.2. QUELQUES OPERATIONS DE BASE Les points darrt e

73

Un point darrt est un endroit dans le programme o` on indique que lon veut que celui-ci arrte son e u e excution. e Il existe deux mani`res de mettre en place des points darrt : e e soit implicitement en cliquant sur une instruction du programme et en lanant ensuite lexcution 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 loption At dy placer un point darrt. On peut placer plusieurs points darrt dans e e ` le programme. A son excution (lancement par Run, Go to cursor, ...), le programme sarrtera autoe e matiquement ` chaque fois quil arrivera sur une instruction o` on a plac un point darrt. Linstruction a u e e nest pas excute avant larrt du programme. Elle lest quand on continue lexcution du programme. e e e e

A.2
A.2.1

Quelques oprations de base e


Acher le segment de donnes e

Au lancement de td, le debugger ne conna pas lemplacement en mmoire du segment de donnes, le t e e registre ds tant initialis par le programme, en gnral ` lexcution des premi`res instructions du proe e e e a e e gramme. Une fois ds initialis, on peut visualiser le contenu du registre de segment dans une fentre en e e choisissant dans le menu View loption Dump.

A.2.2

Acher le contenu dun segment mmoire quelconque e

On peut visualiser le contenu de la mmoire ` partir de nimporte quelle adresse en spciant un numro e a e e de segment et un oset. Pour cela, ouvrir un dump mmoire en slectionnant Dump dans le menu View. e e Ensuite, en cliquant dans la fentre avec le bouton droit de la souris, un menu apparait. Slectionner Goto.... e e Le debugger demande ladresse ` partir de laquelle il doit acher le contenu de la mmoire dans la fentre. a e e On pourra alors taper es:0, ds:0 ou 53DA:14, selon ses besoins.

A.2.3

Modier la valeur dun registre, dun indicateur, dune donne en me e moire

On peut facilement modier la valeur dun registre, dun indicateur du registre dtat ou un octet en e mmoire en cliquant dessus, en entrant sa nouvelle valeur et en validant. e

A.3

Remarques

Il faut noter que certaines instructions napparaissent pas sous le debugger comme vous avez pu les taper dans votre programme source. Ainsi, comme nous lavons vu, les instructions sal et shl sont synonymes. Aussi, quelle que soit celle que vous avez tap dans le source de votre programme, cest toujours shl qui e sera ache. e Par ailleurs, les instructions de dcalages du genre shr al,3 o` le deuxi`me oprande est une valeur e u e e immdiate sont transformes en une squence de 3 instructions shr al,1. e e e Les instructions du genre push 23, cest-`-dire push dune valeur immdiate, sont transformes en une a e e squence de plusieurs instructions. Par exemple, pour celle-ci, on obtiendra : e push push mov pop ax bp word ptr [bp+2], 17 bp

qui empile bien la valeur 23 (cest-`-dire 17h). a

74

` ANNEXE A. INTRODUCTION A LUTILISATION DU DEBUGGER

75

Annexe B

Param`tres de la ligne de commande e et environnement


Lorsquon lance un programme, on peut spcier des param`tres dans la ligne de commande (des noms e e de chiers par exemple) quipourront tre pris en compte par le programme durant son excution. Par e e ailleurs, outre les param`tres de la ligne de commande, le syst`me dexploitation passe automatiquement au e e programme les variables denvironnement (cest-`-dire, les variables positionnes par la commande MSDOS a e set). Dans la prsente annexe, nous indiquons comment ces informations peuvent tre accdes depuis un e e e e programme assembleur. Tout programme en cours dexcution poss`de une structure de donnes qui lui est propre est qui porte e e e le doux nom de PSP, acronyme de Program Segment Prex. Ce PSP est toujours compos de 256 octets. e Parmi ceux-ci, on trouve : ` loset 2ch le numro du segment o` est situ lenvironnement ; a e u e ` partir de loset 81h, la ligne de commande termine par un caract`re de code 0Dh ; a e e ` loset 80h, le nombre de caract`res de la ligne de commande (sans compter le 0Dh). a e

B.1

Lacc`s au PSP e

Linterruption 21h renvoie le numro du segment contenant le PSP si on place la valeur 62h dans le e ` registre ah. A son retour, on rcup`re le numro du segment contenant le PSP dans le registre bx. Le PSP e e e occupe les octets doset 0 ` 255 de ce segment. a

B.2

La ligne de commande

Nous indiquons sur des exemples la structure de la ligne de commande telle quelle est stocke dans le e PSP. Si sous MS-DOS, 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 ........... d e Il faut noter que les redirections ne font pas partie des param`tres de la commande et napparaissent pas e dans le PSP. Ainsi, si on tape les commandes : prg a b c d e > toto prg a b c d e < titi > toto

76

` ANNEXE B. PARAMETRES DE LA LIGNE DE COMMANDE ET ENVIRONNEMENT prg a b c d e | more on aura toujours le mme contenu dans le PSP (celui donn plus haut). e e

B.3

Lenvironnement

Lenvironnement dun programme est un ensemble de couples < nom de variable, valeur > Le nom dune variable et sa valeur sont des cha nes de caract`res. Dans le PSP, ils sont spars par un e e e signe = pour les distinguer. Chaque couple est termin par un caract`re ASCII de code 00. La liste des e e couples se termine elle-aussi par un caract`re de code 00. (Donc, les deux derniers caract`res de la zone e e mmoire o` est stock lenvironnement ont tous deux la valeur 00.) e u e Un exemple de contenu de la zone stockant lenvironnement 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.COM PROMPT= T EMP=C:\TEMP PATH =C:\DOS;C:\BAT;C :\BORLANDC\BIN;

An dillustrer notre propos, nous donnons ci-dessous un programme qui ache la premi`re variable (son e nom et sa valeur).

B.3. LENVIRONNEMENT

77

boucle1:

fin:

.MODEL SMALL .STACK 100H .CODE mov ah,62h ; chargement du numero int 21h ; du segment du PSP mov ds,bx ; chargement de ds avec le numero du segment ; contenant lenvironnement mov ax,[ds:2ch] mov ds,ax ; boucle de recherche de la fin de la ; premiere variable denvironnement. Elle ; est reperee par un octet de valeur nulle mov si,0 inc si cmp BYTE PTR [si],0 jne boucle1 ; si contient loffset du caractere nul. ; On met un $ en fin de chaine pour pouvoir ; lafficher avec linterruption classique ; et on appelle linterruption en question mov BYTE PTR [si],$ mov ah,9 int 21h ; on remet un caractere nul la ou on avait mis ; un $. (Cela ne sert a rien ici puisque le ; programme sarrete.) mov BYTE PTR [si],0 ; fin du programme mov ah,4Ch int 21h END

78

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

79

Annexe C

Du bon usage des registres


Mis ` part quelques registres tr`s spciques dont lemploi est impos par le processeur (par exemple, le a e e e registre dtat est forcment le registre flags, le numro du segment de code se trouve forcment dans le e e e e registre cs, ...), la plupart des registres peuvent tre utiliss dans diverses circonstances. Il peut tre utile e e e dindiquer ici quelques conventions. ax, bx, cx, dx : registres de donnes. Ils peuvent gnralement tre utiliss librement. Seuls ax et cx e e e e e ont parfois un usage rserv (instructions mul, imul, div, idiv et les direntes versions de loop) ; e e e si, di : oset de donnes, utiliss par certaines instructions de traitement de cha ; e e nes sp : pointeur de sommet de pile. Prudence extrme lors de sa manipulation (cf. appel de sous-programmes e 4) ; bp : souvent utilis pour sauvegarder sp en cas de besoins (cf. appel de sous-programmes 4) ; e ip : compteur ordinal. Ne doit pas tre modi ; e e cs : segment de code. Ne pas le modier ; ds : segment de donnes : segment dans lequel sont en gnral rfrences automatiquement les donnes ; e e e ee e e es : segment de donnes utilis spciquement par les instructions de traitement de cha e e e nes en liaison avec le registre di; ss : segment de pile. Ne pas le modier a priori ; flags : registre dtat. e

80

ANNEXE C. DU BON USAGE DES REGISTRES

81

Annexe D

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

82

ANNEXE D. LE CODAGE ASCII

83

Annexe E

Les messages derreur


Nous indiquons ici les messages derreur les plus frquents qui peuvent survenir lors de lassemblage dun e chier. Un message derreur est ach sous la forme : e **Error** nom_de_fichier (numro_de_ligne) e message

Illegal instruction Utilisation dun mnmonique inexistant. Pax exemple move ` la place de mov. e a Illegal immediate Utilisation dune constante ` un endroit interdit. Par exemple : mov a 4, ax.

Illegal indexing mode Utilisation dun mode dadressage index inexistant. Par exemple : mov al, [si+ax]. Les modes existants e sont indiqus ` la section 2.1.1. e a Illegal number Erreur dans une constante numrique. e Illegal use of constant Utilisation dune constante l` o` cela est interdit. Par exemple : mov a u Invalid operand(s) to instruction Oprande non accept par linstruction. e e Labels cant start with numeric characteres Une tiquette doit forcment commencer par une lettre. e e Model must be specified first La premi`re ligne dun source assembleur, en dehors des commentaires, doit tre .model e e Need address or register Oubli dun oprande. Par exemple : mov e ax,. small. ax+4, 5.

Relative Jump out of range by xxx bytes Ltiquette en oprande dune instruction de saut conditionnel est trop loigne. Voir la section 3.2.2 ` e e e e a ce propos. Reserved Word used as a symbol Vous utilisez un mot rserv comme tiquette. Changez son nom. e e e Symbol already defined: x

84

ANNEXE E. LES MESSAGES DERREUR Vous dnissez deux fois la mme tiquette de la mme mani`re. e e e e e Symbol already different kind Vous dnissez deux fois la mme tiquette de mani`re dirente. e e e e e Too few operands to instruction Vous avez oubli un oprande (ou deux). Par exemple : mov e e Undefined symbol Utilisation dune tiquette qui na pas t dnie. e ee e Unexpected end of file (no END directive) Votre source ne se termine pas par une directive END. Unknown character Un caract`re inattendu a t rencontr dans une instruction. e ee e Value out of range Valeur incorrecte. Par exemple : db 1024 alors quun octet a une valeur forcment infrieure ` 256. e e a ax.

INDEX

85

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

86 dcalage et division par 2, 28 e pile, 49 pointeur de pile, 49 sous-programmes, 47 Transfert de la valeur dun registre de segment vers un autre registre de segment, 28

INDEX

` TABLE DES MATIERES

87

Table des mati`res e


1 Introduction 1.1 Un processeur, en deux mots . . . . . . . . . . . . . . 1.2 La mmoire . . . . . . . . . . . . . . . . . . . . . . . . e 1.3 Les registres du 8086 . . . . . . . . . . . . . . . . . . . 1.4 Le codage des nombres . . . . . . . . . . . . . . . . . . 1.4.1 Reprsentation non signe des nombres entiers e e 1.4.2 Reprsentation signe des nombres entiers . . . e e 1.4.3 Codage dcimal . . . . . . . . . . . . . . . . . . e 1.4.4 Complment ` deux dun nombre . . . . . . . . e a 1.4.5 Extension du signe . . . . . . . . . . . . . . . . 1.5 Notation . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Anatomie dun programme en assembleur 2.1 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Spcier une donne en mmoire (une variable) e e e 2.1.2 Les constantes . . . . . . . . . . . . . . . . . . 2.1.3 Les dclarations de variables . . . . . . . . . . e 2.2 Lassemblage . . . . . . . . . . . . . . . . . . . . . . . 3 Les instructions du 8086 3.1 Les instructions arithmtiques et logiques . . . . . e 3.1.1 Les instructions arithmtiques . . . . . . . e 3.1.2 Incrmentation, dcrmentation . . . . . . . e e e 3.1.3 Oppos dun nombre . . . . . . . . . . . . . e 3.1.4 Les instructions boolennes et logiques . . . e 3.1.5 Les instructions de dcalage et rotation . . e 3.1.6 Les instructions de transfert . . . . . . . . . 3.2 Les tests en assembleur . . . . . . . . . . . . . . . 3.2.1 Principe gnral . . . . . . . . . . . . . . . e e 3.2.2 Les instructions de comparaison . . . . . . 3.2.3 Exemples de codage de tests en assembleur 3.3 Les boucles en assembleur . . . . . . . . . . . . . . 3.3.1 Principe gnral . . . . . . . . . . . . . . . e e 3.3.2 Boucles tant-que . . . . . . . . . . . . . . 3.3.3 Boucles rpter . . . . . . . . . . . . . . . e e 3.3.4 Les boucles pour . . . . . . . . . . . . . . . 3.3.5 Instructions diverses . . . . . . . . . . . . . 3.3.6 Le traitement des cha nes de donnes . . . . e 3.4 Autres instructions . . . . . . . . . . . . . . . . . . 3.4.1 Instructions arithmtiques . . . . . . . . . . e 3.4.2 Les instructions dajustement dcimal . . . e 3.4.3 Autres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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

88 4 Les sous-programmes 4.1 Principe gnral . . . . . . . . . . . . . . . . . . . . . . . . . . . e e 4.2 Synoptique de lappel dun sous-programme . . . . . . . . . . . . 4.2.1 Lappel dun sous-programme . . . . . . . . . . . . . . . . 4.2.2 Retour ` lappelant . . . . . . . . . . . . . . . . . . . . . . a 4.2.3 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e 4.2.4 La pile dappel de sous-programme . . . . . . . . . . . . . 4.3 Appel de sous-programme sans passage de param`tre . . . . . . . e 4.3.1 Appels et retours de sous-programmes . . . . . . . . . . . 4.3.2 Sauvegarde et restauration de contexte . . . . . . . . . . . 4.4 Passage de param`tres et variables locales . . . . . . . . . . . . . e 4.4.1 Passage de param`tres par registre . . . . . . . . . . . . . e 4.4.2 Passage de param`tres dans la pile . . . . . . . . . . . . . e 4.4.3 Variables locales . . . . . . . . . . . . . . . . . . . . . . . 4.4.4 Retour dune valeur par un sous-programme : les fonctions 5 Les interruptions du DOS 5.1 Achages de caract`res ` lcran . . . e a e 5.1.1 Acher un caract`re ` lcran . e a e 5.1.2 Acher un message ` lcran . a e 5.2 Saisir une frappe au clavier . . . . . . 5.2.1 Saisie avec cho . . . . . . . . . e 5.2.2 Saisie sans cho . . . . . . . . . e 5.3 Lacc`s aux chiers . . . . . . . . . . . e 5.3.1 Principe . . . . . . . . . . . . . 5.3.2 Cration dun chier . . . . . . e 5.3.3 Ouverture dun chier . . . . . 5.3.4 Fermeture dun chier . . . . . 5.3.5 Lecture dans un chier . . . . . 5.3.6 Ecriture dans un chier . . . . 5.4 Lire lheure courante . . . . . . . . . . 5.5 Lire la date courante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

` 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

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . en assembleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6 Etudes de cas 6.1 Cas 1 : lire une suite de caract`res au clavier e 6.2 Cas 2 : acher un nombre en base 2 . . . . 6.3 Cas 3 : Acher le contenu dun chier . . . 6.4 Cas 4 : acher lheure courante . . . . . . .

A Introduction ` lutilisation du debugger a A.1 Lancement et prsentation du debugger . . . . . . . . . . . . e A.1.1 La fentre de debuggage . . . . . . . . . . . . . . . . . e A.2 Quelques oprations de base . . . . . . . . . . . . . . . . . . . e A.2.1 Acher le segment de donnes . . . . . . . . . . . . . e A.2.2 Acher le contenu dun segment mmoire quelconque e A.2.3 Modier la valeur dun registre, dun indicateur, dune A.3 Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . B Param`tres de la ligne de commande e B.1 Lacc`s au PSP . . . . . . . . . . . . e B.2 La ligne de commande . . . . . . . . B.3 Lenvironnement . . . . . . . . . . . C Du bon usage des registres et . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . donne en e . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . mmoire . e . . . . . .

environnement 75 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 79

` TABLE DES MATIERES D Le codage ASCII E Les messages derreur Index

89 81 83 85