0% ont trouvé ce document utile (0 vote)
7 vues36 pages

Génération de Code Machine 8086

Transféré par

rania azira
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
7 vues36 pages

Génération de Code Machine 8086

Transféré par

rania azira
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

FACULTÉ INFORMATIUQE - USTHB 2024-2025

GÉNÉRATION DE CODE MACHINE


(ASSEMBLEUR 8086)

114
FACULTÉ INFORMATIUQE - USTHB 2024-2025

Génération de code machine


(assembleur 8086)
La génération de code machine pour l'assembleur 8086 se situe dans la dernière phase du

processus de compilation.

Elle consiste à traduire le code intermédiaire en instructions assembleur spécifiques à

l'architecture Intel 8086.

SAYOUD Lynda 115


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Rappel: Niveaux de programmation


Circuits logiques (0/1)

L'UAL est intégrée dans le processeur, et ses

opérations sont effectuées en binaire,

manipulant des données sous forme de 0 et 1.

L’Unité de Commande envoie des signaux de

contrôle pour exécuter les instructions sous

forme de micro-instructions.

Les circuits logiques jouent un rôle central dans l'exécution des instructions sur le processeur.

SAYOUD Lynda 116


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Rappel: Niveaux de programmation


Codop
C'est la représentation binaire d'une instruction machine.

Un programme en langage machine est une suite de bits (0 et 1) que le processeur peut exécuter

directement.

Exemple: 111111 000011101010101 peut correspondre à une instruction machine dans une architecture

spécifique.

Langage assembleur
Il utilise des mnémoniques pour représenter les instructions machines sous une forme plus lisible.

Ce sont des représentations textuelles des instructions machine, plus lisibles pour les humains. Par

exemple, ADD (addition), MOV (déplacement), JZ (saut si zéro), etc.

SAYOUD Lynda 117


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Structure d’un programme assembleur 8086


TITLE nom ; Définir le nom du programme

PILE SEGMENT STACK ; Déclaration d’un segment de pile nommé "PILE"

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

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

PILE ENDS ; Fin de la déclaration de la pile

DONNEE SEGMENT ; Déclaration du segment de données

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

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

DONNEE ENDS ; Fin de la déclaration de données

LECODE SEGMENT ; Déclaration du segment de code qui va contenir le code

Debut: ; etiquette indiquant le point d'entrée du programme

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

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

LECODE ENDS ; Fin de la déclaration de code

; --------- Fin du Programme ---------


SAYOUD Lynda 118
END Debut ; Indiquer la fin du point d'entrée du code
FACULTÉ INFORMATIUQE - USTHB 2024-2025

Exemple sur ROL: CODE segment

MAIN: ASSUME CS:CODE, DS:DATA

MOV AX,DATA

TITLE [Link] MOV DS, AX

XOR BL, BL ; Mettre BL à 0 (ou bien SUB)


Pile segment stack ;
MOV DL, 16 ; rotation 16 fois
dw 100 dup(?)
MOV AX, DATA1
Pile ends
ENCORE: ROL AX, 1 ; Rotation a gauche (a droite aussi si on préfère)
DATA segment JNC PROCHAIN ; Test si CF=0
DATA1 DW 5F97H INC BL ; Si CF = 1, incrémenter le compteur du nombre de ‘1’

COMPTE DB ? PROCHAIN: DEC DL ; répéter 16 fois

DATA ends JNZ ENCORE ; encore une fois si ce n’est pas fini

MOV COMPTE, BL ; sauvegarder le résultat dans la case mémoire

COMPTE

MOV AH, 4Ch

INT 21h

MAIN ENDS

END MAIN

SAYOUD Lynda 119


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Extension
Vos programmes compilés doivent avoir l’extension :

.asm pour ASseMbler

→ Les programmes écrits en langage assembleur doivent être enregistrés avec l'extension .asm

pour être reconnus et traités correctement par les outils de compilation et d'assemblage.

SAYOUD Lynda 120


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Quelques registres les plus utilisés


Les registres sont des emplacements de mémoire très rapides situés directement dans le processeur.

Ils sont utilisés pour stocker temporairement des données ou des résultats d'opérations.

Dans l'assembleur 8086, on distingue plusieurs types de registres :

1. Registres généraux
AX (Accumulateur) : Utilisé pour les opérations arithmétiques et logiques, il joue le rôle d’opérande implicite dans

plusieurs opérations: MUL, DIV, INC ...etc.

BX (Base) : Utilisé pour les adresses ou dans des calculs.

CX (Compteur) : Utilisé pour des boucles, par exemple pour répéter une opération un certain nombre de fois (

instruction LOOP).

DX (Data Extension Register) : est un registre polyvalent, mais a un rôle spécial dans les opérations de

multiplication et division.

SAYOUD Lynda 121


FACULTÉ INFORMATIUQE - USTHB 2024-2025

SP (Stack Pointer - Pointeur de pile) : Il pointe toujours vers le sommet actuel de la pile. Son contenu est

automatiquement changé par les instructions PUSH et POP.

BP (Base Pointer) : sert de pointeur sur la base de la pile, et permet d’atteindre n’importe quel élément de la pile

(exemple: MOV AX,[BP+2]). Contrairement à SP, BP est souvent manipulé manuellement pour naviguer dans la

pile.

2. Registres Spéciaux

Ce sont des registres qui ont un usage précis et ne servent pas au stockage générique comme AX, BX, etc.

DS (Data Segment): Pointe sur le début du segment qui contient les données.

CS (Code Segment): Pointe sur le segment qui contient le code du programme.

SS (Stack Segment): segment contenant la pile.

SAYOUD Lynda 122


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Format standard d’une instruction


Les instructions sont les commandes que le processeur exécute. Le format standard d’une instruction est le suivant:

Label: Mnémonique Opérandes ;commentaire

Qu’est-ce qu’un label ?


Les labels (étiquettes) sont des repères dans le code, utilisés pour indiquer des positions spécifiques dans le

programme. Ce sont des noms auxquels le code fait référence lors de l'utilisation de sauts conditionnels ou non

conditionnels. Si le label est placé avant une instruction, on fait référence l’adresse de cette instruction. Il sert général

comme destination des instructions ou des retour de début des boucles de répétition.

Exemple :
START: ........ ;label de début

→ Les labels servent à rendre le code lisible et à contrôler le flux d'exécution.


SAYOUD Lynda 123
FACULTÉ INFORMATIUQE - USTHB 2024-2025

Qu’est-ce qu’un Mnémonique ?


Il sert à identifier une instruction donnée. Quelques instructions de base sont résumées dans la prochaine section.

Exemples :

MOV = move (copy)

ADD = addition

JMP = jump

CMP = compare

INT = interrupt
Qu’est-ce qu’un opérande?
Un opérande est un élément sur lequel une instruction assembleur agit. C’est ce qu’on lit, écrit, déplace, additionne,

compare, etc.

Une instruction peut avoir 0 à 3 opérandes selon le contexte.

Un opérande peut être : Un registre, une adresse mémoire, une valeur constante, un port d’entrée/sortie

Commentaire
Tout ce qui suit ; sur la même ligne est considéré comme un commentaire.
SAYOUD Lynda 124
FACULTÉ INFORMATIUQE - USTHB 2024-2025

Quelques instructions
1. Affectations
Registres ⟵ Valeurs : On place une valeur constante directement dans un registre.

MOV AX, 65535 ; Met la valeur décimale 65535 dans AX


MOV CL, 01101b ; Met la valeur binaire 01101 (13 décimal) dans CL
MOV DH, 0FAh ; Met la valeur hexadécimale FA (250 décimal) dans DH

Entre registres : On copie la valeur d’un registre dans un autre.

MOV AX, BX ; AX reçoit la valeur de BX


MOV CL, DH ; CL reçoit la valeur de DH

Registres ⟷ Variables mémoire: On lit ou écrit une valeur en mémoire (variable) via les registres.

MOV CX, variable_de_deux_octets ; CX reçoit la valeur de la variable (2 octets)


MOV variable_de_un_octet, DL ; la variable reçoit la valeur de DL

SAYOUD Lynda 125


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Registres ⟵ Adresses mémoire

MOV AX, OFFSET variable ; AX reçoit l'adresse mémoire de la variable


MOV CX, [5Ah] ; CX reçoit la valeur stockée à l'adresse 5Ah

OFFSET : donne l'adresse de la variable, pas sa valeur.

[5Ah] : accède à la valeur contenue à l'adresse mémoire 5A (accès direct)

2. Arithmétique
Ces instructions permettent de faire des opérations de base : addition, soustraction, incrémentation,

décrémentation.

Incrémentation (INC) : Elle augmente de 1 la valeur d’un registre ou d’une variable mémoire.

INC AX ; AX <- AX + 1
INC ma_variable ; ma_variable <-ma_variable + 1

Ne prend qu’un seul opérande.

SAYOUD Lynda 126


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Décrémentation (DEC): Elle diminue de 1 la valeur d’un registre ou d’une variable.

DEC AX ; AX <- AX -1
DEC ma_variable ; ma_variable <- ma_variable - 1

C’est une instruction unaire.


Addition (ADD): Effectue une addition classique de deux opérandes.

ADD AX, 5 ; AX <- AX + 5 (constante immédiate)


ADD BH, toto ; BH <- BH + valeur de la variable toto
ADD toto, CX ; toto <- toto + contenu de CX

Syntaxe : ADD destination, source ; Le résultat est stocké dans l'opérande destination
Soustraction SUB: Effectue une soustraction entre deux opérandes.

SUB AX, 5 ; AX <- AX - 5


SUB BH, toto ; BH <- BH - valeur de la variable toto
SUB toto, CX ; toto <- toto - CX

Syntaxe : SUB destination, source


SAYOUD Lynda 127
FACULTÉ INFORMATIUQE - USTHB 2024-2025

3. Comparaison
Toutes les comparaisons se font à l'aide de l'instruction CMP

L'instruction CMP (Compare): CMP compare deux opérandes en effectuant une soustraction implicite.

CMP A, B ; Internement fait A - B

Mais le résultat n'est PAS stocké dans A. L'opération sert uniquement à mettre à jour les flags (dans le

registre FLAGS.

Après un CMP, le processeur regarde certains drapeaux (flags) pour décider du saut :

ZF (Zero Flag) : Résultat = 0 → A == B

SF (Sign Flag) : Résultat négatif

CF (Carry Flag) : Sous-dépassement (A < B)

OF (Overflow Flag) : Dépassement arithmétique

SAYOUD Lynda 128


FACULTÉ INFORMATIUQE - USTHB 2024-2025

4. Sauts conditionnels (Jump if...)


Après un CMP, on peut utiliser un saut conditionnel

(jump) pour rediriger le flux d'exécution selon le

résultat.

Il faut définir des labels (étiquettes): les

endroits dans le programme où va sauter si le

test est vérifié.

SAYOUD Lynda 129


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Exemple:

; Egalité ( JE : Jump if Equal)


CMP AX, 5
JE LABEL_1 ; SI AX == 5 → SAUT À LABEL_1
; Différence ( JNE : Jump If Not Equal)
CMP AX, MA_VARIABLE Label_1: instructions...
JNE LABEL_2 ; SI AX ≠ MA_VARIABLE → SAUT À LABEL_2 Label_2: instructions...
;Inférieur, Supérieur, Inf. ou égal, Sup. ou égal Label_3: instructions...
;(Jump if Lower, Greater, Lower or Equal, Greater or Equal) Label_4: instructions...
CMP CH, 0 ; Saut non conditionnel
JL LABEL_3 ; SI CH < 0 → SAUT À LABEL_3 (VALEURS SIGNÉES) JMP label_1
CMP DH, 0AH
JG LABEL_4 ; SI DH > 10 EN HEXADÉCIMAL → SAUT À LABEL_4
CMP AL, 01001B
JLE LABEL_5 ; SI AL ≤ 9 → SAUT À LABEL_5
CMP VARIABLE, 65
JGE LABEL_6 ; SI VARIABLE ≥ 65 → SAUT À LABEL_6

SAYOUD Lynda 130


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Remarques:

CMP sert uniquement à mettre à jour les flags, qui sont ensuite utilisés par les instructions de

saut.

Il permet de sauter à un label qui est à une adresse de 16 bits.

Les sauts à un label sont souvent courts (short jump) :à peu prés de 127octets.

Il faut donc prendre garde que ce label puisse être atteint.

SAYOUD Lynda 131


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Récaputilatif de l’instruction MOV - Transfert de


données

Attention !!!!!!

❌ Pas de mémoire à mémoire directe


SAYOUD Lynda 132
FACULTÉ INFORMATIUQE - USTHB 2024-2025

Exemple interdit !!!!

MOV [1234h], [5678h]


→ Ce type de transfert doit être fait en deux étapes via un registre

MOV AX, [5678h] ; charger dans un registre


MOV [1234h], AX ; transférer à l'autre adresse

SAYOUD Lynda 133


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Trois Parties du Code Assembleur


Un programme assembleur typique est structuré en trois parties : Pile, Données, et code.
1. Partie Pile (Stack Segment)
Qu’est ce qu’une pile ?
est une zone mémoire spéciale utilisée pour sauvegarder temporairement des

données (souvent des registres).

Elle fonctionne selon le principe LIFO (Last In, First Out).

Instructions liées à la pile

PUSH registre

Sauvegarde le contenu d’un registre sur la pile.

Exemple: PUSH AX ; Empile le contenu du registre AX

POP registre

Restaure une valeur depuis la pile vers un registre.

Exemple: POP AX ; Dépile contenu du sommet de la pile et le transfère dans

AX
SAYOUD Lynda 134
FACULTÉ INFORMATIUQE - USTHB 2024-2025

Utilisation de la pile sur un exemple:

PUSH AX ; Sauvegarder la valeur actuelle de AX sur la pile

PUSH BX ; Sauvegarder la valeur actuelle de BX sur la pile

MOV AX, [0140] ; Charger en AX la valeur contenue à l'adresse mémoire 0140

ADD BX, AX ; Ajouter cette valeur à BX (BX = BX + [0140])

MOV [0140], BX ; Stocker le nouveau contenu de BX dans l'adresse 0140

POP BX ; Restaurer l'ancienne valeur de BX depuis la pile

POP AX ; Restaurer l'ancienne valeur de AX depuis la pile

→ Cela permet de faire des opérations en utilisant AX et BX sans perdre leurs valeurs initiales.

SAYOUD Lynda 135


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Déclaration d’une pile (Stack Segment)


Avant de pouvoir utiliser les instructions PUSH et POP, il faut :

Réserver un espace mémoire (pile).

Définir un segment de pile grâce à la directive SEGMENT stack.

Initialiser les registres SS (Segment Stack) et SP (Stack Pointer)

Structure de déclaration d'une pile

segment_pile SEGMENT stack ; Début du segment de pile (mot-clé `stack`)

DW 100 DUP (?) ; Réserve 100 mots = 200 octets non initialisés

base_pile EQU $ ; Étiquette pour repérer la base de la pile

;(c’est-à-dire l’adresse juste après la fin de la zone réservée)

segment_pile ENDS ; Fin du segment de pile

-> Quand la pile est vide, SP doit pointer sous la zone réservée, c’est-à-dire au "haut" de la pile → c’est ce qu’on

appelle ici la base de la pile.


SAYOUD Lynda 136
FACULTÉ INFORMATIUQE - USTHB 2024-2025

Déclaration d’une pile (Stack Segment)


Initialisation des registres pour utiliser la pile

Après la déclaration, on doit initialiser la pile comme suit :

ASSUME SS:segment_pile ; Informe l'assembleur du segment à utiliser pour

la pile

MOV AX, segment_pile ; Charge le segment de pile dans AX

MOV SS, AX ; Initialise SS (segment de pile)

MOV SP, base_pile ; Pointeur SP positionné en bas de la pile (pile vide)

Remarques:

On ne peut pas faire MOV SS, segment_pile directement, car ce n’est pas autorisé.

On doit passer par un registre (souvent AX) pour transférer une valeur dans SS.

SAYOUD Lynda 137


FACULTÉ INFORMATIUQE - USTHB 2024-2025

2. Partie Données (Data Segment)


La section des données est utilisée pour déclarer les variables et les constantes. Elle sert à réserver de la mémoire

pour stocker des données utilisées dans le programme.

DATA SEGMENT

; déclarations ici

DATA ENDS

2.2. Déclaration des variables

Syntaxe:

nom_variable type valeur

SAYOUD Lynda 138


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Exemples:
datas1 DB ? ; 1 octet non initialisé

datas2 DB 255 ; 1 octet initialisé à 255

datas3 DW ? ; 2 octets non initialisés

datas4 DB 5 DUP(?) ; tableau de 5 octets non initialisés

datas5 DW 10 DUP(15) ; tableau de 10 mots initialisés à 15

Types de données:

SAYOUD Lynda 139


FACULTÉ INFORMATIUQE - USTHB 2024-2025

2.2. Représentation des constantes


Décimale (base 10)
Écriture simple, sans suffixe.

Exemples : 0, 15, 123


Hexadécimale (base 16)

Suffixe : h

Les lettres vont de A à F (équivalent de 10 à 15).

Si le nombre commence par une lettre, on ajoute un 0 devant.

Exemple : 0Ah, 0Fh, 1B2Ch


Binaire (base 2)
Suffixe : b

Composé uniquement de 0 et 1.

Exemple : 1010b, 0001b, 11110101b


SAYOUD Lynda 140
FACULTÉ INFORMATIUQE - USTHB 2024-2025

2.3. Déclaration des vecteurs (tableaux)

Les vecteurs permettent de stocker une série d’éléments du même type.

Vecteurs d’entiers
Chaque élément peut être sur un byte ou un word.

Exemple:

T DW 1, 4, 7, -1 ; vecteur de 4 entiers (2 octets chacun) initialisés

respectivement

; aux valeurs 1, 4, 7 et ‐1

T1 DW 100 DUP(?) ; vecteur de 100 entiers non initialisés

SAYOUD Lynda 141


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Accès aux éléments d’un vecteur

Puisque chaque élément occupe 2 octets (DW) dans l’exemple précédent, il faut multiplier l’indice par 2

pour accéder au bon emplacement mémoire.

MOV SI, i ; i est l’indice MOV SI, i

ADD SI, SI ; SI = i * 2 ADD SI, SI

MOV AX, T[SI] ; AX <-- T[i] MOV T[SI], AX ; T[i] <-- AX

SAYOUD Lynda 142


FACULTÉ INFORMATIUQE - USTHB 2024-2025

3. Partie Code ( Code Segment)


Cette partie contient le programme exécutable, les instructions qui sont traitées par le processeur. C'est

ici que se trouve la logique de votre programme, les calculs, et les appels système.

CODE SEGMENT

START:

MOV AX, 10 ; Charger 10 dans AX

ADD AX, 5 ; Ajouter 5 à AX

MOV BX, AX ; Copier AX dans BX

RET ; Retour de la fonction

CODE ENDS

Ici, START est un label qui représente le début du programme, et les instructions MOV, ADD, RET sont

exécutées dans cet ordre.

SAYOUD Lynda 143


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Modes d’adressages
1. Adressage immédiat (Immediate)
L’opérande est une valeur constante donnée directement dans l’instruction.

Il est utilisé pour : affecter une valeur constante à un registre ou une variable.

MOV AX, 5 ; AX <- 5

MOV BL, 0Fh ; BL <-0Fh

2. Adressage direct (Direct)


L’opérande est situé à une adresse mémoire explicite.

il est utilisé pour : accéder directement à une case mémoire précise.

mov [0C040h], AL ; mémoire à l'adresse 0C040h <- AL

mov DS:[0C040h], AL ; même opération, segment DS précisé

mov CS:var2, AX ; variable dans le segment CS <- AX

SAYOUD Lynda 144


FACULTÉ INFORMATIUQE - USTHB 2024-2025

Modes d’adressages
3. Adressage indirect (Indirect)
L’opérande est un registre (de données ou d’adresses).

Utilisé pour des transferts ou calculs rapides entre registres.

mov AX, BX ; AX <- contenu de BX

SAYOUD Lynda 145


FACULTÉ INFORMATIUQE - USTHB 2024-2025

L’équivalent de quelques instructions du langage C


en assembleur
if: CMP AX, 1 ; Compare AX avec 1
1. Équivalent if / else en assembleur
JNZ Else ; Si AX ≠ 1, sauter à l’étiquette Else

Then: ; Partie "if"

MOV BX, 10 ; BX <- 10

JMP EndIf ; Saut inconditionnel vers la fin

Else: ; Partie "else"

MOV BX, 0 ; BX <- 0

EndIf: ; Suite du programme

MOV CX, 10 ; CX <- 10

SAYOUD Lynda 146


FACULTÉ INFORMATIUQE - USTHB 2024-2025

2. Boucle for en Assembleur

MOV BX, 0 ; Initialisation de BX à 0 → BX = BX + k à chaque itération

MOV CX, 0 ; Initialisation de k (ici représenté par CX)

For: CMP CX, 10 ; Test : si CX > 10 → fin de la boucle

JA EndFor ; JA = Jump if Above (utilisé ici comme CX > 10 → sortir)

ADD BX, CX ; BX = BX + CX (on ajoute la valeur courante de k)

INC CX ; k++ (incrémentation)

JMP For ; Retour au début de la boucle

EndFor: ; Étiquette de fin de boucle

SAYOUD Lynda 147


FACULTÉ INFORMATIUQE - USTHB 2024-2025

2. Équivalent Switch case en CMP n, 1 ; Comparer n à 1

JNE case2 ; Si n ≠ 1, aller à case2


Assembleur ; ===== CASE 1 =====

; instructions du case 1

JMP endswitch ; Aller à la fin du switch

case2:

CMP n, 2 ; Comparer n à 2

JNE default ; Si n ≠ 2, aller au default

; ===== CASE 2 =====

; instructions du case 2

JMP endswitch ; Aller à la fin du switch

default:

; ===== DEFAULT =====

; instructions par défaut

endswitch:

; ===== FIN DU SWITCH =====

SAYOUD Lynda 148


Merci pour votre
attention
Bon courage ...

Vous aimerez peut-être aussi