You are on page 1of 45

Assembleur du 8086

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

Bas 0000:0000 = 00000

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.

Les registres de donnes

Les registres de segments


Ces registres indiquent les segments des zones standards d'un programme : + CS (Code Segment) : Segment de code c'est dire contenant les instructions en cours d'excution, + SS (Stack Segment) : Segment de pile c'est dire contenant la pile, + DS (Data Segment) : Segment de donnes c'est dire contenant les donnes en cours d'utilisation, + ES (Extra Segment) : Segment de donnes supplmentaire.

Les registres Pointeurs et Index


Ces registres vont contenir des offsets pour adresser la mmoire dans les segments vus prcdemment : + IP (Instruction Pointer), associ CS, CS:IP donne l'adresse de la prochaine instruction excuter, + BP (Base Pointer) et SP (Stack Pointer), associs SS, SS:SP indique le sommet de la pile, + SI (Source Index) et DI (Destination Index), registres d'index, utiliss pour parcourir des tableaux, en standard, SI est associ DS, DI ES.

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

Interruption Flag : Autorisation des interruptions DI : Disable Interruption EI : Enable Interruption

Sign Flag : Bit de signe (bit 7 ou 15) PL : Plus NG : NeGative

Zero Flag : Bit 1 si le rsultat est 0 NZ : Not Zero ZR : Zero

Les instructions
Les instructions sont constitues de deux zones : mnmonique oprandes de linstruction 0, 1 ou 2 spars par "," destination puis source

Espace ou tabulation Exemple : MOV dest,source

pour effectuer un transfert de source vers dest

Les modes dadressage


Il existe diffrentes manires d'accder aux informations, diffrents modes d'adressage : - adressage par registre : Utilisation des noms des registres (AX, BX, CX, ...) Exemples : MOV AX,BX MOV AL,BL

- adressage immdiat : Utilisation d'une valeur donne, d'une constante Exemples : MOV AX,460H MOV AL,-30

Les modes dadressage (2)


- les adressages en mmoire : + adressage direct : Utilisation de l'adresse mmoire o aller chercher la donne Exemple : MOV AX,[300H] --> Offset dans DS

+ adressage indirect par registre : Utilisation de l'adresse mmoire contenue dans un registre (BX, BP, SI, DI) Exemple : MOV BX,300H MOV AX,[BX]

Les modes dadressage (3)


+ adressage relatif une base : Utilisation de l'adresse mmoire obtenue par la somme d'un registre de base (BX ou BP) et un dplacement (dep) Il existe diffrentes notations : [BX + dep] [BX] + dep dep[BX] Exemple : MOV BX,2F0H MOV AX,[BX+10H]

+ 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]

Les modes dadressage (4)

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

Les instructions de transfert


La principale instruction de transfert : MOV destination,source Transfert de l'octet ou du mot de source dans destination impossible de faire les transferts mmoire/mmoire, registre de segment/immdiat, impossible d'utiliser IP

Les instructions de transfert (2) Principe de la pile


0000

PUSH source Empiler un mot sur la pile

<== SP : sommet de la Pile

SP = SP - 2 (SP+1; SP) = source POP destination Dpiler un mot sur la pile

Bas de la pile Segment SS FFFF

destination = (SP+1; SP) SP= SP + 2

Les oprations logiques


AND destination,source ET logique entre destination et source, le rsultat est mis dans destination OR destination,source OU logique entre destination et source, le rsultat est mis dans destination XOR destination,source OU exclusif entre destination et source, le rsultat est mis dans destination NOT destination Ngation logique de destination, le rsultat est mis dans destination TEST destination,source ET logique entre destination et source pour positionner les indicateurs sans modification de destination

Les oprations arithmtiques


CBW Convertir un octet en un mot en tenant compte du signe (AL --> AX) ADD destination,source destination = destination + source Addition

ADC destination,source Addition avec retenue (Add with carry) destination = destination + source + CF INC destination Incrmentation destination = destination + 1

Les oprations arithmtiques (2)


Soustraction SUB destination,source destination = destination - source SBB destination,source Soustraction avec retenue (Subtract with Borrow) destination = destination - source - CF DEC destination Dcrmentation destination = destination - 1

Les oprations arithmtiques (3)


NEG destination Ngation destination = - destination CMP destination,source Comparaison Soustraction (destination - source) pour le positionnement des indicateurs, sans modification de destination

Les oprations arithmtiques (4)


Multiplication MUL source Multiplication non signe si source est un octet, AX = AL * source si source est un mot, (DX; AX) = AX * source IMUL source Multiplication signe si source est un octet, AX = AL * source si source est un mot, (DX; AX) = AX * source

Les oprations arithmtiques (5)


DIV source Division non signe si source est un octet, AL = AX DIV source AH = AX MOD source si source est un mot, AX = (DX; AX) DIV source DX = (DX; AX) MOD source IDIV source Division signe si source est un octet, AL = AX DIV source AH = AX MOD source si source est un mot, AX = (DX; AX) DIV source DX = (DX; AX) MOD source Division

Les oprations de dcalage


SAR destination,count (o count = 1 ou CL pour toutes les oprations de dcalage et de rotation) Shift Arithmetic Right : Dcalage arithmtique droite Si count = 1, division entire par 2, avec le reste dans CF Le bit de poids fort est laiss son ancienne valeur (conservation du signe). Le bit limin est mis dans CF.
CF

Les oprations de dcalage (2)


SHL destination,count ou SAL destination,count Shift Logical Left ou Shift Arithmetic Left : Dcalage gauche Si count = 1, multiplication par 2 Le bit de poids faible est mis 0. Le bit limin est mis dans CF.
CF 0

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

Les oprations de dcalage (3)


ROL destination,count Rotate Left : Rotation gauche Faire count fois CF prend la valeur du bit de poids fort Tous les bits sont dcals de 1 vers la gauche Le bit de poids faible prend la valeur de CF (de l'ancien bit de poids fort)
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

Les oprations de dcalage (5)


RCR destination,count Rotate Right through Carry : Rotation droite travers "Carry Flag" Faire count fois Tous les bits sont dcals de 1 vers la droite Le bit de poids fort prend la valeur de CF CF prend la valeur du bit de poids faible 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

Les instructions de contrle Les instructions de branchement inconditionnel


JMP destination Jump Saut dans le mme segment (NEAR) ou dans un autre segment (FAR) Modification de IP (Saut Intra-segment) ou CS et IP (Saut Inter-segment)

Les instructions de branchement conditionnel


JA ou JNBE Jump if Above / if Not Below or Equal JBE ou JNA Jump if Below or Equal / if Not Above CF = 0 et ZF = 0 CF = 1 ou ZF = 1

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

Les instructions de branchement conditionnel (2)


JCXZ Jump if CX is Zero JE ou JZ Jump if Equal / if Zero JNE ou JNZ Jump if Not Equal / if Not Zero JNP ou JPO Jump if No Parity / if Parity Odd JP ou JPE Jump if Parity / if Parity Even (CX) = 0 ZF = 1 ZF = 0 PF = 0 PF = 1

Les instructions de branchement conditionnel (3)


JG ou JNLE Jump if Greater / if Not Less nor Equal JLE ou JNG Jump if Less or Equal / if Not Greater JGE ou JNL Jump if Greater or Equal / if Not Less JL ou JNGE Jump if Less / if Not Greater nor Equal ZF = 0 et OF = SF ZF = 1 ou OF # SF OF = SF OF # SF

Les instructions de branchement conditionnel (4)


JNO Jump if No Overflow JO Jump if Overflow JNS Jump if No Sign JS Jump if Sign OF = 0 OF = 1 SF = 0 SF = 1

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 instructions de contrle du processeur et du registre d'tat


NOP No Opration CLC Clear Carry STC Set Carry CMC Complement Carry CF = 0 CF = 1 CLD Clear Direction Flag STC Set Direction Flag CLI Clear Interruption Flag DF = 0 DF = 1 IF = 0 IF = 1

STI CF = not CF Set Interruption Flag

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.

Les interruptions (2)


INT numro Appel d'une interruption Sauvegarde du registre d'tat sur la pile Mise 0 des indicateurs pas pas (TF) et d'autorisation d'interruption (IF) Sauvegarde de CS sur la pile Calcul de l'adresse de la table d'interruption (numro x 4) Chargement dans CS du second mot Sauvegarde de IP sur la pile Chargement du premier mot de la table dans IP donc Saut l'adresse CS:IP

Les interruptions (3)


IRET Retour d'une interruption Restauration de CS, IP et du registre d'tat Exemples d'interruptions : Interruption 0 : Division par 0 Interruption 10H : Gestion d'cran Interruption 16H : Gestion clavier

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

Codage dalgorithmes (2)


Algorithme B 10 A1 Tantque A B faire AA+ 1 Fintq Assembleur MOV b, 10 MOV a, 1 PUSH AX debtq: MOV AX, a CMP AX, b JG fintq ADD a, 1 JMP debtq fintq: POP 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

You might also like