# Programmation Assembleur/x86/Registres

* Programmation Assembleur/x86
* Introduction
* Registres
* Les flags
* Copie entre registres et mémoire
* Les branchements
* La pile
* Les interruptions
* Opérations arithmétiques et logiques
* Interactions avec les périphériques
* Index
* Conclusion
* Modifier ce modèle
Dans l'architecture x86 16 bits, le processeur comporte quatre registres de travail, six registres d'offset, six registres de segment, 1 registre d'état (flags) et un pointeur d'instruction.

## Les registres de travaux

Les quatre registres de travaux sont principalement utilisés pour stocker des résultats :
* EAX : registre accumulateur (accumulator register).
    Utilisé pour les opérations arithmétiques et le stockage de la valeur de retour des appels systèmes.
* EDX : registre de données (data register).
    Utilisé pour les opérations arithmétiques et les opérations d'entrée/sortie.
* ECX : registre compteur (counter register).
    Utilisé comme compteur par certaines instructions, permettant de répéter une série d'instructions un nombre de fois prédéterminé.
* EBX : registre de base (base register).
    Utilisé comme pointeur de donnée (située dans DS en mode segmenté, segment par défaut) ou sert de base au calcul d'une adresse.
Ce sont des registres 32 bits ; pour des raisons historiques, les 16 bits de poids faible sont constitués respectivement des registres AX, DX, CX et BX.
Ces 4 registres 16 bits sont également décomposés en 8 registres de 8 bits :
* AL : octet de poids faible de AX
* AH : octet de poids fort de AX
* BL : octet de poids faible de BX
* BH : octet de poids fort de BX
* CL : octet de poids faible de CX
* CH : octet de poids fort de CX
* DL : octet de poids faible de DX
* DH : octet de poids fort de DX
La valeur initiale de ces registres à l'allumage de la machine est 0.

## Les registres d'offset

Les registres d'offset sont utilisés lors de l'adressage indirect de la mémoire (pointeurs). Ces registres complémentaires sont :
* EBP : (Extended Base Pointer) pointeur de base, utilisé dans le calcul d'adresse mémoire (segment par défaut : SS).
* ESP : (Extended Stack Pointer) pointeur de pile (segment par défaut : SS).
* ESI : (Extended Source Index) pointeur source (segment par défaut : DS).
* EDI : (Extended Destination Index) pointeur destination (segment par défaut : ES).
Le nom des deux derniers registres vient du fait qu'ils sont utilisés pour la copie d'une zone mémoire vers une autre. Sur les processeurs x86 limités à 16 bits, ces registres n'ont pas le préfixe E et sont donc nommés : BP, SP, SI et DI.
La valeur initiale de ces registres à l'allumage de la machine est 0.

## Les registres de segment

La gestion de la mémoire dans l'architecture x86 est particulière : celle-ci est divisée en segments. Les registres de segment permettent d'accéder, soit au segment de programme qui est la zone mémoire des instructions de programme, soit au segment de données (zone mémoire contenant les données du programme), ou encore au segment de pile.
* CS : pointe vers les instructions du programme (code segment).
* DS : pointe vers les données du programme (data segment).
* SS : pointe vers la pile programme (stack segment).
* ES : pointe vers les données du programme multi-segments (extra segment).
* FS : pointe vers les données du programme multi-segments en mode protégé.
* GS : pointe vers les données du programme multi-segments en mode protégé.
La gestion de mémoire en multi-segments permet d'utiliser tous les registres d'offset. La plupart des systèmes d'exploitation actuels utilisent un mode protégé où tous les registres de segment pointent vers le même segment.
La valeur initiale de ces registres à l'allumage de la machine est 0, sauf CS initialisé à FFFF (hex). En mode segmenté, cela signifie que la routine de démarrage doit se situer à l'adresse FFFF:0000 en mémoire.

## Le registre d'états

Chaque bit du registre EFLAGS est un indicateur d'état qui peut être modifié à chaque instruction exécutée :
* retenue (addition ou soustraction),
* dépassement,
* comparaison,
* autoriser les interruptions,
Sur les processeurs x86 limités à 16 bits, ce registre n'a pas le préfixe E et est donc nommé FLAG.
Son nom est abrégé par son initiale F dans le nom de certaines instructions.

## Le pointeur d'instruction

Le registre EIP est utilisé avec le segment du registre CS par le processeur pour connaitre la prochaine instruction à exécuter. Ce registre est donc modifié implicitement par le processeur (instruction suivante, saut à l'adresse indiquée, appel d'une fonction, interruption ...).