Académique Documents
Professionnel Documents
Culture Documents
- Catégories de mémoire :
- Registres : type de mémoire à capacité réduite présente dans l’UCT
- Mémoire cache : mémoire intermédiaire accessible directement par le microprocesseur
- Mémoire centrale : mémoire accessible via le bus
- Mméoire de masse : accessible via les dispositifs d’entrée-sortie avec un temps d’accès
plus long
- Structure de la mémoire :
- Composée de cases mémoires (cellule élémentaire d’un octet) de taille fixe (généralement
1 octet = 8 bits)
- Information codée sur plusieurs octets se stocke sur plusieurs cases mémoire consécutives
- Donc un octet c’est 8 bits et donc deux nombres hexadécimaux, exemple : 0D.
BUS de taille n :
- Ensemble de fils électriques
- 1 fil conducteur = 1 signal binaire transporté
- Informations de 0 à 2n-1
Type de Bus :
- Bus de données : bidir
- Bus de commande :
- Bus d’adresse :
H
- Processeur n bits = taille de ses registres.
- Bus d’adresse 16 bits ⇒ 2^16 = 65,536 adresse possibles = 65,536 octets / 1024 = 64 ko
- Bus d’adresse 20 bits ⇒ 2^20 = 1 048 576 adresse possibles = 1 048 576 octets / (1024*1024) =
1 MO
-Séquences d’instructions d’un programme : par l’UCT
Registres :
- Intégrés directement à l’UCT
- Types :
- IR : Registre d’instruction :
- Contient l’instruction en cours d’exécution par l’unité de traitement
- Instruction en amont décodée par l’unité de contrôle
- CO : compteur ordinal :
- Appelé « compteur programme »
- En anglais : CP ou IP « Instruction Pointer »
- Contient l’adresse de la prochaine instruction que doit exécuter l’unité de traitement
- Registre d’état :
- Mémorise l’état de l’UAL à l’issue d’une opération.
- Registre formé de bits « drapeaux » ou indicateurs
- Registres tampons :
- Mémorise l’état des registres de données et d’adresse
- Des registres d’interface avec les bus de données et d’adresse
- Registres généraux :
- Stocker temporairement les données manipulées par l’UCT, dont :
- Les opérandes de l’UAL
- Les résultats de l’opération réalisée par l’UAL
- PF (Parity Flag = Drapeau de parité) : armé si l’octet de poids faible du résultat généré d’une opération
arithmétique contient un nombre pair de bits à 1 , désarmé sinon.
- ZF (Zero Flag = Drapeau zéro) : armé si résultat d’opération arithmétique vaut zéro, désarmé sinon.
- SF (Sign Flag = Drapeau de signe) :
- Armé si le résultat d’opération arithmétique possède un bit de poids fort à 1 (indiquant ainsi un nombre
signé)
- Désarmé dans les autres cas (indiquant possiblement résultat non signé, c-à-d positif)
DU LOGICIEL AU MATÉRIEL :
- Langage machine : L'ensemble des instructions disponibles pour un processeur donné constitue le langage
machine. Chaque instruction logicielle correspond à une séquence de micro-instructions matérielles.
- Exécutable : ensemble d’instructions machines constituant un programme
- Langage assembleur : traduit chaque instruction binaire en un code plus compréhensible et intuitif, généralement
une abréviation d'un mot anglais, appelé mnémonique.
PROCESSEUR 8086 :
- Particularité :
- Bus d’adresse de 20 bits (5 symboles hexa) = 1 Mo adressable
- Bus de données de 16 bits (4 symboles hexa)
- Registres de 16 bits (y compris registre d’adresse)
- Mécanisme d’adressage particulier :
- Pour adresser les 2^20 adresses possibles
- L’adresse est décomposée et stockée en deux parties dans deux registres
- Données stockées en mode little endian
- Unité d'Exécution (UE) : Réalise les opérations arithmétiques/logiques et gère les registres de données.
- Unité d'Interface avec le Bus (UIB) : Assure la communication entre le processeur et les autres
composants du système via le bus système.
- Paragraphes en mémoire : La mémoire est divisée en paragraphes, chaque paragraphe étant un ensemble
de 16 adresses consécutives dont la première est un multiple de 16. Les paragraphes sont repérés par les
chiffres hexadécimaux de poids forts (16 premiers bits) d’une adresse.
- Bus d'adresse et registres : Le bus d'adresse de 20 bits permet d'adresser 2^20 adresses physiques, mais
les registres ne peuvent stocker que des adresses sur 16 bits
- Adresses logiques : Chaque adresse physique est décomposée en un couple de valeurs : numéro de
segment / déplacement dans le segment (offset). Ce couple est désigné sous le terme adresse logique.
- Segments : Un segment est un ensemble de 64 Ko consécutifs, dont le premier élément coïncide avec le
début d'un paragraphe. Le déplacement (offset) spécifie un octet particulier dans un segment.
- Relation entre adresse physique et logique : La relation entre adresse physique et adresse logique est :
adresse physique = 16 x segment + déplacement. Ainsi, à chaque adresse physique peut correspondre
plusieurs couples segment/déplacement. En effet, chaque adresse physique peut correspondre à 4096
adresses logiques différentes.
- Segments utilisés par un programme : Lors de son exécution, un programme utilise plusieurs segments
mémoire, Ces trois segments peuvent se situer n'importe où en mémoire et peuvent même se recouvrir
partiellement. :
• Le segment de code , qui contient les instructions du programme.
• Le segment de données , qui contient les données du programme.
• Le segment de pile , qui contient la pile du programme.
LES REGISTRES DU 8086 :
1. Registres de segment : Ils stockent les numéros de segments de mémoire. Chaque registre a un rôle
précis :
• CS (Code Segment) : Stocke le numéro de segment où se trouve le programme en cours d'exécution.
• DS (Data Segment) : Stocke le numéro de segment où sont stockées les données. Doit être initialisé
dans le programme.
• SS (Stack Segment) : Stocke le numéro de segment où est stockée la pile.
• ES (Extra Segment) : Stocke un numéro de segment supplémentaire pour l'adressage de données.
2. Registres généraux : Ils servent à stocker des données. Ils sont subdivisés en registres de 8 bits (haute et
basse) :
• AX, BX, CX, DX : Registres généraux. Ils se décomposent en registres de 8 bits : AH/AL, BH/BL,
CH/CL, DH/DL.
• SI (Source Index) et DI (Destination Index) : Ils contiennent le déplacement dans le segment de
données et sont généralement utilisés pour le transfert d'un ensemble d'octets dans la mémoire.
• SP (Stack Pointer) et BP (Base Pointer) : Ils gèrent la pile et sont associés par défaut à SS.
• SP est le pointeur de pile qui contient le déplacement dans le segment de pile de l'adresse de
la case mémoire courante de la pile (change constamment à mesure que des éléments sont
poussés et retirés de la pile.) .
• BP permet d'adresser une case mémoire particulière de la pile. (souvent utilisé pour accéder à
des éléments spécifiques sur la pile, comme les arguments de fonction et les variables locales,
qui sont à des positions fixes par rapport à BP)
3. Registres spéciaux : spéciaux en ce sens qu'ils ne sont pas accessibles pour une manipulation directe par
les instructions standard, mais leur contenu peut être modifié indirectement par certaines instructions.
• FLAG (Registre d'état) : Il contient les drapeaux indiquant l'état de l'Unité Arithmétique et Logique
(UAL) après une opération. Ces drapeaux peuvent être utilisés par des instructions de branchement
conditionnel.
• IP (Instruction Pointer) : Il spécifie le déplacement dans le segment de code de l'adresse mémoire
de la prochaine instruction à exécuter. L'adresse mémoire spécifiée par CS:IP pointe sur la case
mémoire contenant la prochaine instruction à exécuter.
Détails sur le registre d'état (FLAG) :
• CF (Carry Flag) :
Type
Armé si Désarmé si
d'arithmétique
- Retenue générée sur Pas de retenue sur le bit de
Signée
le bit de poids fort poids fort
- Retenue générée sur - Pas de retenue sur le bit
Non signée le bit de poids fort de poids fort
- Débordement - Pas de débordement
• PF (Parity Flag) : armé si l’octet de poids faible du résultat généré d’une opération arithmétique
contient un nombre pair de bits à 1 , désarmé sinon.
• AF (Auxiliary Flag) : Indique une demi-retenue (retenue est générée en sortie du quarter de poids
faible (4 bits de poids faible) sur le quarter de poids fort (4 bits de poids fort)
• ZF (Zero Flag) : Indique que le résultat de l'opération est zéro.
• SF (Sign Flag) : Indique le signe du résultat pour les opérations sur des entiers signés.
• OF (Overflow Flag) : Indique un débordement arithmétique sur entiers signés
• DF (Direction Flag) : Indique la direction pour les instructions de manipulation de chaînes de
caractères.
• IF (Interrupt Flag) : Autorise la prise en compte des interruptions externes.
• TF (Trap Flag) : Autorise l'exécution en mode pas à pas du programme.
1. Adressage immédiat : Dans ce mode, l'opérande est directement donnée dans l'instruction elle-
même. Par exemple, dans l'instruction MOV AX, 8, 8 est une valeur immédiate. Le processeur
prend simplement cette valeur et la met dans le registre AX.
1. Adressage registre : Ici, l'opérande est un registre du processeur. Par exemple, dans MOV AX, BX,
le contenu du registre BX est copié dans le registre AX.
2. Adressage direct : Dans ce mode, l'adresse de la mémoire où se trouve l'opérande est spécifiée
directement dans l'instruction. Par exemple, dans MOV AL, [0008], l'opérande est à l'adresse
mémoire 0008. Le processeur va à cette adresse, récupère la valeur stockée là-bas et la place dans le
registre AL.
MOV AL, [0008]
MOV AX, DS :1999
MOV AX, Variable ; (variable étant une étiquette)
3. Adressage indirect : Dans ce mode, l'adresse de l'opérande est stockée dans un registre. Par
exemple, dans MOV AX, [BX], l'adresse de l'opérande est stockée dans le registre BX. Le
processeur va à l'adresse spécifiée par BX, récupère la valeur stockée à cette adresse et la place dans
AX. Ce mode a plusieurs variantes :
• Adressage basé : L'adresse est déterminée par le contenu d'un registre de base. Par exemple,
MOV AX,[BP] utilise le contenu de BP comme adresse.
• Adressage indexé : L'adresse est déterminée par le contenu d'un registre d'index additionné à
une valeur constante. Par exemple, MOV AX,[SI +123h] utilise le contenu de SI plus la
constante hexadécimale 123h comme adresse.
• Adressage basé indexé : L'adresse est déterminée en additionnant le contenu de deux
registres. Par exemple, MOV AX,[BP + SI + 123h] utilise le contenu de BP plus le
contenu de SI plus la constante hexadécimale 123h comme adresse.
STRUCTURE D’UN PROGRAMME 8086 :
Directives : Les directives sont des instructions spéciales que vous donnez à l'assembleur. Elles ne sont pas
traduites en code machine mais servent à contrôler le processus d'assemblage.
• SEGMENT : Cette directive indique le début d'un segment. Un segment peut être un segment de
code, un segment de données ou un segment de pile.
• ENDS : Cette directive indique la fin d'un segment.
• END : Cette directive indique la fin du programme. Elle doit être suivie de l'étiquette du point
d'entrée du programme.
• Assume : permet de spécifier quelle partie du programme constitue le code (étiquette associée à CS)
et quelle partie du programme est associée aux données (étiquette associée à DS)
Etiquette :
- Les étiquettes peuvent être nommées de façon arbitraire (au choix du programmeur).
- Une étiquette est une manière symbolique de représenter une adresse en mémoire.
- Etiquette main : spécifie le point d’entrée du programme
DÉCLARATION DE VARIABLES :
J
- Variable de type WORD
N1 dw 25h //Variable de type WORD initialisée à 25 (en héxa)
N2 dw 4 //Variable de type WORD initialisée à 4 (en décimal)
Prod dw ? //Varibale de type WORD non initialisée.
- Instructions arithmétiques et logiques : Ces instructions sont utilisées pour effectuer des opérations arithmétiques
et logiques sur des valeurs. Par exemple, l'instruction ADD AX, BX ajoute le contenu du registre BX à celui du
registre AX. Les opérations arithmétiques courantes incluent l'addition, la soustraction, la multiplication, la division,
etc. Les opérations logiques courantes incluent les opérations ET, OU, NON, etc.
- Instructions de transfert : Ces instructions permettent de déplacer des données entre les registres, la mémoire et le
processeur. Par exemple, l'instruction MOV AX, [BX] copie le contenu de l'adresse mémoire pointée par BX dans
le registre AX.
- Permettant de copier le contenu d’une (variable, registre, case mémoire) dans une autre (variable, registre, case
mémoire).
Exemple : MOV, XCHG, LEA, PUSH, POP, PUSHA, POPA
- Instructions de test : Ces instructions permettent de comparer des valeurs et de modifier l'état des drapeaux du
processeur en conséquence. Par exemple, l'instruction CMP AX, BX compare les valeurs des registres AX et BX et
définit les drapeaux ZF (Zero Flag), SF (Sign Flag) et CF (Carry Flag) en fonction du résultat.
- Instructions de modification de séquence : Ces instructions permettent de changer l'ordre d'exécution des
instructions en modifiant la valeur du registre d'instruction du processeur (IP - Instruction Pointer). Par exemple,
l'instruction JMP label fait un saut inconditionnel à l'instruction marquée par label, tandis que JE label fait
un saut à label seulement si le drapeau ZF (Zero Flag) est défini, c'est-à-dire si la dernière opération de
comparaison a donné un résultat égal à zéro.
INSTRUCTION MOV :
INSTRUCTION XCHG :
INSTRUCTION LEA :
• Quelques intructions :
◦ ADD : ajoute op2 à op1
◦ SUB : soustrait op2 de op1
◦ CMP : Idem à SUB mais pour les flags uniquement
◦ AND : compare par ET logique, tous les bits des deux ops
◦ TEST : Idem à AND mais pour les flags uniquement
◦ OR : effectue OU logique entre tous les bits des deux ops
◦ XOR : effectue OU exclusif entre tous les bits des deux ops
• Exemples :
◦ Mise à 0 du bit 3 de AX en laissant le reste intact : AND AL, F7h
◦ Mise à 1 du but 3 de AX en laissant le reste intact : OR AL, 08h
• Opérations logiques :
◦ AND/OR/XOR registre ou variable, registre
◦ AND/OR/XOR registre, registre ou variable
◦ AND/OR/XOR registre ou variable, constante
◦ AND/OR/XOR registre ou variable, nombre
◦ NOT registre ou variable
• Exemples :
◦ MOV AL, 01100001b
◦ AND AL, 11011111b ; --> donne 01000001b
◦ OR AL, 01110110b ; --> donne 01110111b
◦ NOT AL ; --> donne 10001000b
◦ XOR AL, 01010101b ; --> donne 11011101b
◦ XOR BX, BX ; --> donne 0000000000000000b
◦ XOR AL, AL ; --> donne 000000000b
OPÉRATIONS DE DÉCALAGE :
OPÉRATIONS DE ROTATION :
• Rotation normale :
◦ CF charge le bit expulsé, pas intermédiaire
◦ ROL, ROR
◦ Bits expulsés remis classiquement dans les trous formés par décalage
• Rotation CF intermédiaire :
◦ CF remplit le trou avec son contenu actuel
◦ CF chargé du bit expulsé
◦ RCL, RCR
• Nombre de bits de décalage indiqué dans la seconde opérande
• Exemples :
◦ MOV AL, 11110000b
◦ ROL AL, 1 ; --> donne 11100001b en supposant que CF=0
◦ RCL AL, 1 ; --> donne 11000010b et CF = 1
◦ RCR AL, 1 ; --> donne 11100001b et CF = 0
◦ ROR AL, 1 ; --> donne 01111000b
OPÉRATIONS ARITHMÉTIQUES :
• ADD et SUB :
◦ Pour une addition ou soustraction codées sur 16 bits ⇒ résultat codé sur 16+1 bits de résultat et bit de
retenue (bit CF)
◦ Tient pas compte de l’état initial du bit CF
◦ bit CF peut être modifié à l’issue de l’opération
◦ Addition ADD:
▪ ADD registre, registre ou variable
▪ ADD registre ou variable, registre
▪ ADD registre ou variable, constante
◦ Substracion SUB :
▪ SUB registre, registre ou variable
▪ SUB registre ou variable, registre
▪ SUB registre ou variable, constante
• ADC et SBB
◦ Permettent d’effectuer addition/soustraction sur 32 bits, 48 bits, 64 bits
◦ Tiennent compte du flag CF provenant de l’ADD/SUB précédente.
◦ Exemple ADC (ADD with Carry) :
▪ Addition de deux nombres 32 bits, on les divise en parties de 16 bits :
▪ Nombre 1 : 12345678h , 1234h (partie haute), 5678h (partie basse)
▪ Nombre 2 : 90ABCDEFh , 90ABh (partie haute), CDEFh (partie basse)
• CMP
◦ Comparer valeurs données (registres ou variables)
◦ Soustrait la source de la destination sans stocker le résultat dans destination
◦ Modifie les flags pour servir aux instructions de branchement conditionnel :
◦
• INC, DEC
◦ INC :
▪ Incrémenter registre ou variable
▪ INC AX //mnémonique codop 1 octet
▪ Équivaut à ADD AX, 1 //mnémonique codop 3 octets
◦ DEC :
▪ Décrémenter registre ou variable
▪ DEC BX // mnémonique codop 1 octet
▪ Équivaut à SUB BX, 1 //mnémonique codop 3 octets
• Multiplicatoin et division :
◦ Prennent un seul opérande (registre ou mémoire)
◦ Registres utilisables
▪ AX, BX, CX, DX
▪ AH, AL, BH, BL, CH, CL, DH, DL
▪ DI, SI, BP, SP
◦ Multiplicatoin et divison non signés : MUL et DIV
▪ MUL :
• byte : AX 16 bits = AL 8 bits * OP2 DB
◦ Exemple :
MOV AL, OP1 DB
MUL OP2 DB
▪ DIV :
• byte : AL = AX / opérande ; AH = reste (modulo)
◦ Exemple :
MOV AX, 0006h
DIV Operand1 DB
• INSTRUCTIONS DE BRANCHEMENT :
◦ Modifient IP en fonction du résultat d’opération, trois types :
◦ SAUTS INCONDITIONNELS :
▪ myLabel: MOV AX, 10
JMP myLabel //myLabel est une étiquette
▪ Référencement relatif :
• L’assembleur calcule automatiquement l’adresse associée à l’étiquette
• Être insensible à des rajouts de ligne de code dans le programme
◦ SAUTS CONDITIONNELS :
▪ Testent un ou plusieurs flags du registre d’état
▪ Si test vérifié, effectuent un branchement, sinon, exécuter prochaine instruction dans programme
▪ Principales instructions de saut conditonnel :
Tests conditionnels :
data segment
; Définir les messages à afficher
msg1 db "Value1 is greater than Value2", '$'
msg2 db "Value2 is greater than or equal to Value1", '$'
code segment
start:
mov ax, data
mov ds, ax
print_msg2:
; Si on est ici, cela signifie que value1 <= value2
; Afficher le message 2
mov ah, 9
lea dx, msg2
int 21h
jmp end_program
print_msg1:
; Si on est ici, cela signifie que value1 > value2
; Afficher le message 1
mov ah, 9
lea dx, msg1
int 21h
end_program:
; Terminer le programme
mov ax, 4c00h
int 21h
code ends
end start
Boucles :
- Nombre d’itération déteministe : fixé à l’avance
- Nombre d’itératoin conditionnel : dépendant d’une expressoin booléenne
debut_boucle :
TEST
JUMP à fin_boucle si condition fausse
;instructions
JUMP debut_boucle pour tester encore
fin_boucle :
suite programme
debut_boucle :
;instructions
TEST
JUMP debut_boucle si condition vraie
fin_boucle :
suite programme
debut_boucle :
CMP CX, val_finale
JG fin_boucle; si on dépasse l’indice finale,
;si on dépasse pas indice final, instructions
INC CX
JMP debut_boucle pour tester encore
fin_boucle :
;suite programme
SOMME N ELEMENTS DU TABLEAU TAB :
debut_boucle :
CMP CX, N
JG fin_boucle
ADD AX, TAB[SI]
INC SI
INC CX
JMP debut_boucle
fin_boucle :
;suite programme
debut_boucle :
CMP SI, N-1 ;BOUCLE FOR SANS CX
JF fin_boucle
CMP BX, TAB[SI]
JE fin_boucle
INC SI
JMP debut_boucle
fin_boucle :
CMP SI, N-1 ;CHECK SI ON A PARCOURU TOUT LE TABLEAU
JG fin_si
• Indicateur d’interruption (IF) peut être positionné par ces deux instructions :
◦ L’instruction STI (set interrupt) qui positionne l’indicateur IF à 1 pour autoriser la prise en compte des
interrputions masquables
◦ L’instruction CLI (clear interrupt) qui met l’indicateur IF à 0 pour masquer les interruptions
• BIOS :
◦ Ensemble de programmes stockés dans une puce de mémoire ROM de la carte mère.
◦ Programmes essentiels pour :
▪ Démarrage de l’ordinateur
▪ Communication entre CPU et périphériques matériels
◦ Interruptions logicielles du BIOS :
▪ Portes d’entrée vers fonctions du BIOS
▪ Chaque INT ⇒ associée à certaines fonctions (les sélectionner via AH)
◦ Fonctions du BIOS et registres CPU :
▪ Passage des paramètres des fonctions via registres CPU
▪ Renvoi du résultat via regisres CPU aussi
◦ Appel d’une fonction du BIOS : 3 étapes :
▪ 1- Initialiser registres CPU avec paramètres de fonction
▪ 2- Appel d’INT associée
▪ 3- Registres CPU reçoivent résultat de fonction
◦ Fonctions BIOS non génériques : pas universelles ou standardisées, varient en fonction du fabriquant.