Assemblée - Registres
Les opérations du processeur impliquent principalement le traitement des données. Ces données peuvent être stockées en mémoire et accessibles à partir de celle-ci. Cependant, la lecture et le stockage de données dans la mémoire ralentissent le processeur, car cela implique des processus compliqués d'envoi de la demande de données sur le bus de commande et dans l'unité de stockage de mémoire et d'obtenir les données via le même canal.
Pour accélérer les opérations du processeur, le processeur inclut certains emplacements de stockage de la mémoire interne, appelés registers.
Les registres stockent des éléments de données à traiter sans avoir à accéder à la mémoire. Un nombre limité de registres est intégré à la puce du processeur.
Registres du processeur
Il existe dix registres de processeur 32 bits et six registres de processeur 16 bits dans l'architecture IA-32. Les registres sont regroupés en trois catégories -
- Registres généraux,
- Registres de contrôle, et
- Registres de segment.
Les registres généraux sont divisés en groupes suivants -
- Registres de données,
- Registres de pointeur, et
- Registres d'index.
Registres de données
Quatre registres de données 32 bits sont utilisés pour les opérations arithmétiques, logiques et autres. Ces registres 32 bits peuvent être utilisés de trois manières:
En tant que registres de données 32 bits complets: EAX, EBX, ECX, EDX.
Les moitiés inférieures des registres 32 bits peuvent être utilisées comme quatre registres de données 16 bits: AX, BX, CX et DX.
Les moitiés inférieure et supérieure des quatre registres 16 bits mentionnés ci-dessus peuvent être utilisées comme huit registres de données 8 bits: AH, AL, BH, BL, CH, CL, DH et DL.
Certains de ces registres de données ont une utilisation spécifique dans les opérations arithmétiques.
AX is the primary accumulator; il est utilisé dans les entrées / sorties et la plupart des instructions arithmétiques. Par exemple, lors d'une opération de multiplication, un opérande est stocké dans le registre EAX ou AX ou AL en fonction de la taille de l'opérande.
BX is known as the base register, car il pourrait être utilisé dans l'adressage indexé.
CX is known as the count register, comme l'ECX, les registres CX stockent le nombre de boucles dans des opérations itératives.
DX is known as the data register. Il est également utilisé dans les opérations d'entrée / sortie. Il est également utilisé avec le registre AX avec DX pour les opérations de multiplication et de division impliquant de grandes valeurs.
Registres de pointeurs
Les registres de pointeur sont des registres EIP, ESP et EBP 32 bits et les parties droites 16 bits correspondantes IP, SP et BP. Il existe trois catégories de registres de pointeurs -
Instruction Pointer (IP)- Le registre IP 16 bits stocke l'adresse de décalage de la prochaine instruction à exécuter. IP en association avec le registre CS (comme CS: IP) donne l'adresse complète de l'instruction courante dans le segment de code.
Stack Pointer (SP)- Le registre SP 16 bits fournit la valeur de décalage dans la pile de programmes. SP en association avec le registre SS (SS: SP) fait référence à la position actuelle des données ou de l'adresse dans la pile de programmes.
Base Pointer (BP)- Le registre BP 16 bits aide principalement à référencer les variables de paramètres passées à un sous-programme. L'adresse dans le registre SS est combinée avec le décalage dans BP pour obtenir l'emplacement du paramètre. BP peut également être combiné avec DI et SI comme registre de base pour un adressage spécial.
Registres d'index
Les registres d'index 32 bits, ESI et EDI, et leurs parties 16 bits les plus à droite. SI et DI, sont utilisés pour l'adressage indexé et parfois utilisés en addition et soustraction. Il existe deux ensembles de pointeurs d'index -
Source Index (SI) - Il est utilisé comme index source pour les opérations de chaîne.
Destination Index (DI) - Il est utilisé comme index de destination pour les opérations de chaîne.
Registres de contrôle
Le registre de pointeur d'instructions 32 bits et le registre d'indicateurs 32 bits combinés sont considérés comme les registres de contrôle.
De nombreuses instructions impliquent des comparaisons et des calculs mathématiques et modifient l'état des indicateurs et certaines autres instructions conditionnelles testent la valeur de ces indicateurs d'état pour amener le flux de contrôle vers un autre emplacement.
Les bits d'indicateur communs sont:
Overflow Flag (OF) - Il indique le débordement d'un bit de poids fort (bit le plus à gauche) de données après une opération arithmétique signée.
Direction Flag (DF)- Il détermine la direction gauche ou droite pour déplacer ou comparer des données de chaîne. Lorsque la valeur DF est 0, l'opération de chaîne prend la direction de gauche à droite et lorsque la valeur est définie sur 1, l'opération de chaîne prend la direction de droite à gauche.
Interrupt Flag (IF)- Il détermine si les interruptions externes telles que la saisie au clavier, etc., doivent être ignorées ou traitées. Elle désactive l'interruption externe lorsque la valeur est 0 et active les interruptions lorsqu'elle est définie sur 1.
Trap Flag (TF)- Il permet de paramétrer le fonctionnement du processeur en mode pas à pas. Le programme DEBUG que nous avons utilisé définit l'indicateur d'interruption, afin que nous puissions parcourir l'exécution une instruction à la fois.
Sign Flag (SF)- Il montre le signe du résultat d'une opération arithmétique. Cet indicateur est positionné en fonction du signe d'une donnée après l'opération arithmétique. Le signe est indiqué par l'ordre supérieur du bit le plus à gauche. Un résultat positif efface la valeur de SF à 0 et un résultat négatif la définit à 1.
Zero Flag (ZF)- Il indique le résultat d'une opération d'arithmétique ou de comparaison. Un résultat différent de zéro efface l'indicateur zéro sur 0 et un résultat zéro le définit sur 1.
Auxiliary Carry Flag (AF)- Il contient le report du bit 3 au bit 4 suite à une opération arithmétique; utilisé pour l'arithmétique spécialisée. L'AF est mis à 1 lorsqu'une opération arithmétique à 1 octet provoque un report du bit 3 au bit 4.
Parity Flag (PF)- Il indique le nombre total de 1 bits dans le résultat obtenu à partir d'une opération arithmétique. Un nombre pair de 1 bits efface l'indicateur de parité à 0 et un nombre impair de 1 bits définit l'indicateur de parité sur 1.
Carry Flag (CF)- Il contient le report de 0 ou 1 à partir d'un bit de poids fort (le plus à gauche) après une opération arithmétique. Il stocke également le contenu du dernier bit d'une opération de décalage ou de rotation .
Le tableau suivant indique la position des bits d'indicateur dans le registre d'indicateurs 16 bits:
Drapeau: | O | ré | je | T | S | Z | UNE | P | C | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit non: | 15 | 14 | 13 | 12 | 11 | dix | 9 | 8 | sept | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Registres de segments
Les segments sont des zones spécifiques définies dans un programme pour contenir des données, du code et une pile. Il existe trois segments principaux -
Code Segment- Il contient toutes les instructions à exécuter. Un registre de segment de code de 16 bits ou un registre CS stocke l'adresse de début du segment de code.
Data Segment- Il contient des données, des constantes et des zones de travail. Un registre de segment de données de 16 bits ou registre DS stocke l'adresse de départ du segment de données.
Stack Segment- Il contient des données et des adresses de retour de procédures ou de sous-programmes. Il est implémenté comme une structure de données «pile». Le registre de segment de pile ou registre SS stocke l'adresse de départ de la pile.
Outre les registres DS, CS et SS, il existe d'autres registres de segments supplémentaires - ES (segment supplémentaire), FS et GS, qui fournissent des segments supplémentaires pour le stockage des données.
Dans la programmation d'assemblage, un programme doit accéder aux emplacements de mémoire. Tous les emplacements de mémoire dans un segment sont relatifs à l'adresse de départ du segment. Un segment commence dans une adresse uniformément divisible par 16 ou hexadécimal 10. Ainsi, le chiffre hexadécimal le plus à droite dans toutes ces adresses de mémoire est 0, qui n'est généralement pas stocké dans les registres de segment.
Les registres de segments stockent les adresses de départ d'un segment. Pour obtenir l'emplacement exact des données ou des instructions dans un segment, une valeur de décalage (ou déplacement) est nécessaire. Pour référencer n'importe quel emplacement de mémoire dans un segment, le processeur combine l'adresse de segment dans le registre de segment avec la valeur de décalage de l'emplacement.
Exemple
Regardez le programme simple suivant pour comprendre l'utilisation des registres dans la programmation d'assemblage. Ce programme affiche 9 étoiles à l'écran avec un message simple -
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
Displaying 9 stars
*********