Professional Documents
Culture Documents
Assembleur 8086
Gestion des adresses mmoires sur deux mots : - 1 mot pour le segment, - 1 mot pour le dplacement dans le segment : l'offset ou adresse relative. Une adresse est note : segment:offset
Rappels : 8 bits = 1 octet = 1 byte (anglais) 16 bits = 1 mot (de 2 octets) = 1 word (anglais)
On peut calculer l'adresse relle par la formule suivante : adresse = 16 * Segment + Offset Segment Offset Adresse (20 bits)
Remarque: Deux segments conscutifs ne sont pas disjoints. Exemple : Ces deux adresses indiquent le mme octet en mmoire : 0000:0010 et 0001:0000 = 00010 = 00010
F000:FFFF = FFFFF Haut
Mmoire
1 Mo
Zones mmoires rserves par le micro-processeur : - les 16 octets les plus hauts sont rservs la mise en service (Que faire quand la machine se met sous tension ?) (F000:FFF0 --> F000:FFFF), - les 1024 octets les plus bas sont rservs aux vecteurs d'interruption (0000:0000 --> 0000:03FF). Zones mmoire rserves par l'architecture, l'organisation interne de la machine : - une partie de la mmoire est constitue de ROM (Read Only Memory) et contient les oprations de base de la machine, - une partie tait rserve la mmoire cran : + partir de B000:0000 pour un cran monochrome, + partir de B800:0000 pour un cran couleur.
Les registres
On distingue quatre groupes de registres : - les registres de donnes, - les registres de segments, - les registres pointeurs et index, - le registre d'tat.
Ces registres, auquel un rle privilgi a t attribu, peuvent tre considrs comme un registre de 16 bits ou deux de 8 bits : + AX (ou AL et AH pour respectivement la partie basse (Low) et haute (High)) appel Accumulateur, utilis pour les oprations arithmtiques, + BX (ou BL et BH) appel registre de base ou base (Base register), utilis pour l'adressage de donnes en mmoire, + CX (ou CL et CH) appel compteur (Count register), utilis comme compteur de boucle, + DX (ou DL et DH) appel registre de donnes (Data register), utilis en complment d'opration arithmtique.
Le registre dtat
Ce registre de 16 bits contient des indicateurs (flags ou drapeaux) sur l'tat du micro-processeur, en particulier la suite d'oprations arithmtiques ou de comparaison.
OF Overflow Flag : Dpassement de capacit NV : Not oVerflow OV : OVerflow Direction Flag : UP : UP DN : DowN Trap Flag : Indicateur du pas pas DF IF TF SF ZF AF PF CF Carry Flag : Bit de retenue CY : CarrY NC : Not Carry Parity Flag : Bit de parit (nb de bit 1) PO : Parity Odd (Impaire) PE : Parity Even (Paire) Auxiliary Carry Flag : idem CF sur les quartets bas NA : Not Auxiliary Carry AC : Auxiliary Carry
Les instructions
Les instructions sont constitues de deux zones : mnmonique oprandes de linstruction 0, 1 ou 2 spars par "," destination puis source
- adressage immdiat : Utilisation d'une valeur donne, d'une constante Exemples : MOV AX,460H MOV AL,-30
+ adressage indirect par registre : Utilisation de l'adresse mmoire contenue dans un registre (BX, BP, SI, DI) Exemple : MOV BX,300H MOV AX,[BX]
+ adressage direct index : Utilisation de l'adresse mmoire obtenue par la somme d'un dplacement (dep) et un registre d'index (SI ou DI) Exemple : MOV DI,10H MOV AX,[2F0H+DI]
+ adressage index par rapport une base : Utilisation de l'adresse mmoire obtenue par la somme d'un registre de base (BX ou BP), d'un registre d'index (SI ou DI) et d'un dplacement (dep). Exemple : MOV DI,15H MOV BX,0BH MOV AX,[BX+DI+1E0H]
Les instructions
On distingue 6 types d'instructions : - les instructions de transfert de donnes, - les oprations arithmtiques et logiques, - les instructions de contrle du programme, - les instructions de travail sur les chanes, - les interruptions, - les instructions de contrle du processeur et du registre d'tat. Une instruction ncessite un certain nombre de cycles pour sexcuter. La dure d un cycle dpend de la frquence dhorloge.
ADC destination,source Addition avec retenue (Add with carry) destination = destination + source + CF INC destination Incrmentation destination = destination + 1
SHR destination,count Shift Logical Rigth Dcalage logique droite Si count = 1, division entire par 2, avec le reste dans CF Le bit de poids fort est mis 0. Le bit limin est mis dans CF.
0 CF
ROR destination,count Rotate Right : Rotation droite Faire count fois CF prend la valeur du bit de poids faible Tous les bits sont dcals de 1 vers la droite Le bit de poids fort prend la valeur de CF (de l'ancien bit de poids faible)
CF
RCL destination,count Rotate Left through Carry : Rotation gauche travers "Carry Flag" Faire count fois Tous les bits sont dcals de 1 vers la gauche Le bit de poids faible prend la valeur de CF CF prend la valeur du bit de poids fort limin
CF
Exercices : 1/ Faire l'addition des octets contenus en 40H et 41H, mettre le rsultat en 42H. 2/ Multiplier [40H] par 2, mettre le rsultat en 41H 3/ Mettre zro du quartet de poids fort de [40H], mettre le rsultat en 41H 4/ Mettre zro l'octet [40H] 5/ Partager [40H] en deux quartets l'un en 41H, l'autre en 42H
JAE ou JNC ou JNB CF = 0 Jump if Above or Equal / if Not Carry / if Not Below JB ou JC ou JNAE CF = 1 Jump if Below / if Carry / if Not Above or equal
Utilisation
Utilisation aprs un CMP destination,source : Saut si destination = source destination # source destination > source destination >= source destination < source destination <= source Entiers non signs JE JNE JA JAE JB JBE Entiers signs JE JNE JG JGE JL JLE
Exercices
1/ Trouver le plus grand (puis le plus petit) des deux nombres des adresses 38H et 40H, la mettre en 42H 2/ Faire la somme des valeurs contenues partir de l'adresse 42H, le nombre de valeurs additionner tant en 40H, mettre la somme en 38H 3/ Trouver le nombre de valeurs ngatives contenues partir de l'adresse 42H, le nombre de valeurs tant en 40H, mettre le rsultat en 38H 4/ De la mme manire, trouver la valeur minimum puis la valeur maximum, puis les deux en mme temps 5/ Trouver le nombre de caractres d'une chane ASCII termine par le caractre nul de code ASCII '0' 6/ Faire la concatnation de deux chanes ASCII termines par 0 (CH1 et CH2) dans une chane RES, mettre le nombre de caractres de la chane obtenue dans LG 7/ Convertir un octet NB en une chane de caractres numriques RES ( 123 --> '123' )
Correction exercice 1
program plusgrandasm; function plusgrand:integer;assembler; asm MOV AX,5 MOV BX,40h MOV [BX],AX mov ax,[40h] MOV AX,3 MOV BX,38h MOV [bx],ax mov bx,ax mov ax,[40h]
cmp AX,BX ja @plusgrand jmp @pluspetit @plusgrand: mov BX,42h mov [bx],ax jmp @fin @pluspetit: mov AX,bx mov bx,42h mov [bx],ax jmp @fin @fin: mov ax,[42h] end; var i:integer; begin writeln(plusgrand); readln; end.
Correction exercice 2
program sommes; procedure initso(nb:integer);assembler; asm mov ax,1 mov [42h],ax {ranger 1 dans 42h} mov ax,2 mov [44h],ax {ranger 2 dans 44h} mov ax,3 mov [46h],ax mov ax,4 mov [48h],ax mov ax,5 mov [50h],ax mov ax,[nb] mov [40h],ax {ranger le nombre de repetitions dans 40h} end;
function so:integer;assembler; asm mov bx,40h mov ax,0 mov si,0 @debut: inc si cmp si,[40h] jg @fin {si si > [40h] arreter} inc bx inc bx {passe a l adresse des donnees suivante} add ax,[bx] jmp @debut { et recommence} @fin: mov bx,38h {stocke resultat dans 38h} mov [bx],ax end; var i:integer; begin initso(2); writeln(so); end.
Les interruptions
Une interruption est semblable un appel de sous-programme mais fait toujours un appel long (segment + offset). L'adresse de branchement n'est pas dans l'instruction, elle est indique par le numro et se trouve dans la table des interruptions dans le segment 0. On peut donc faire appel aux interruptions indpendamment des adresses mmoires o elles se trouvent. Les interruptions peuvent tre dclenches par le matriel (clavier, horloge par exemple) ou par un logiciel.
Codage dalgorithmes
Algorithme Si A = B Alors C 100 Sinon C 200 Finsi Assembleur MOV AX, a MOV BX, b CMP AX, BX JNE sinon alors: MOV AX, 100 MOV c, AX JMP finsi sinon: MOV AX, 200 MOV c, AX finsi: Assembleur optimis MOV AX, a MOV BX, b CMP AX, BX JNE sinon alors: MOV AX, 100 JMP finsi sinon: MOV AX, 200 finsi: MOV c, AX
Assembleur optimis MOV b, 10 MOV a, 1 PUSH AX PUSH BX MOV AX, a MOV BX, b debtq: CMP AX, BX JG fintq INC AX JMP debtq fintq: MOV a, AX POP BX POP AX