Next: Le processeur Pentium Up: Les microprocesseurs xxx86 Previous: Caractéristiques de l'architecture

Le jeu d'instructions CISC Intel

Comme on l'a dit précédemment, le jeu d'instructions mis en oeuvre sur les processeurs Intel est de type CISC. Aussi, cette partie va largement différer de celle consacrée aux processeurs RISC dont on rappelle ici les principales caractéristiques à titre de comparaison :

On peut également rappeler que le concept RISC privilégie des opérations << simples >>. Le faible nombre de formats d'instructions permet un décodage rapide et une anticipation au niveau de la lecture des opérandes.
Les processeurs Intel assurent tous une totale compatibilité binaire. Aussi, l'étude du jeu d'instructions se fera à travers celui du dernier processeur Intel, le Pentium, qui constitue un sur-ensemble des jeux d'instructions (le lecteur pourra consulter [3] et [12] pour plus de détails à ce sujet).

Types de données

Les processeurs Intel reconnaissent les types fondamentaux suivants : octets, mots, double-mot et quadruple-mot (64 bits). Les processeurs rangent les données selon un format little-endian, l'octet de poids faible est donc rangé à l'adresse la plus basse.

Les modes d'adressage

Comme l'ensemble des processeurs, les modes d'adressage courants (absolu, indirect, basé, indexé) sont réalisés en une seule instruction. Les processeurs Intel disposent d'un mode d'adressage supplémentaire, l'adressage basé indexé.

Le mode de calcul de l'adresse est déterminé dans l'octet suivant immédiatement le code opération. En plus du segment adressé qui peut être défini de façon explicite par le préfixe de l'instruction ou bien de façon implicite en utilisant, par défaut, le contenu du registre de segment adéquat, quatre éléments servent au calcul de l'adresse :

La taille des instructions n'étant pas fixe, toutes les composantes utiles au calcul de l'adresse peuvent être présentes dans la même instruction, ce qui a pour effet d'obtenir l'adressage basé indexé : base + (index * facteur d'échelle) + constante. Intel annonce que ce mode d'adressage est particulièrement efficace pour adresser des tableaux à deux dimensions d'éléments de 2, 4 ou 8 octets. Il permet, à priori, au programmeur d'adresser de façon explicite un tableau à deux dimensions (exemple : ). La figure récapitule le calcul d'une adresse linéaire à partir d'un tel mode d'adressage.

Format des instructions

Sur une architecture de type CISC comme celle des processeurs Intel, le jeu d'instructions contient un certain nombre de primitives employées par les langages de haut niveau. Les codes assembleurs, c'est-à-dire ceux compris par la machine, ressemblent donc aux codes sources initiaux écrits par les programmeurs. De tels microprocesseurs possèdent de ce fait des instructions très variées et complexes obtenues par le biais d'un certain nombre de champs optionnels.

Chaque instruction du Pentium peut adresser deux opérandes. À la différence des processeurs de type RISC, ces deux opérandes peuvent être contenus dans des registres ou l'un d'entre eux peut désigner un emplacement mémoire. Le résultat de l'instruction peut être stocké dans l'un ou l'autre de ces emplacements.

Par conséquent, l'information codée dans une instruction inclut la spécification de l'opération, le type des opérandes manipulés ainsi que leur localisation. Si l'un d'entre eux est situé en mémoire, l'instruction doit aussi sélectionner, de manière explicite ou implicite, le segment qui contient l'opérande.

La figure récapitule l'ensemble des différents champs constituant une instruction. Comme on peut le constater, seul le code opération est obligatoirement présent.
La taille d'une instruction peut varier de un à quinze octets. Le premier cas concerne des instructions qui n'accèdent pas à des opérandes ou alors toujours le même registre. Le cas le plus extrême concerne une instruction dont l'un des opérandes est contenu en mémoire et adressé par l'intermédiaire du mode basé indexé.

Ces divers champs sont explicités ci-dessous :

Les instructions

Les instructions des microprocesseurs peuvent être divisées en quatre classes principales :

Il faut par ailleurs rajouter un nombre non négligeable d'instructions particulières typiques d'un processeur CISC.

Les instructions de transfert de données.

Contrairement aux microprocesseurs RISC, la plupart des instructions xxx86 peuvent accéder à un de leurs opérandes directement en mémoire. Toutefois, nous ne traitons ici que les instructions se limitant à la lecture ou à l'écriture d'une donnée. Dans le jeu d'instructions xxx86, ces dernières ont une importance relative (elles sont peu utilisées). Ceci est accentué par le très petit nombre de registres entiers (huit registres).

Ces instructions sont de trois types :

Les instructions arithmétiques et logiques.

Ces instructions réalisent des opérations arithmétiques, logiques, des décalages, des rotations et des tests en vue de positionner ou non les codes conditions.

En plus des instructions présentes dans les dernières architectures RISC (classiques) comme les décalages, la multiplication ou la division, le Pentium possède des instructions d'opération avec retenue. Ceci permet d'effectuer des opérations sur des opérandes plus larges qu'un mot. De même, certaines instructions fournissent un résultat dans un format différent de ceux des opérandes comme, par exemple, les instructions à double décalage qui effectuent un décalage sur deux opérandes de 32 bits et fournissent un résultat sur 64 bits. Par ailleurs, des instructions d'arithmétique décimale peuvent également être synthétisées à partir d'opérations binaires classiques et d'instructions d'ajustement des résultats. Ceci permet une bonne exécution des codes décimaux. Le Pentium offre la possibilité de ranger les données en mémoire dans un format décimal.

Le Pentium implémente des codes conditions qui valident ou non une instruction de branchement. Toutes les instructions arithmétiques peuvent les modifier mais ne le font pas de façon automatique.

À noter : le jeu d'instructions xxx86 est un jeu d'instructions dit destructeur (à deux opérandes), c'est-à-dire que le résultat d'une opération doit être rangé dans l'un des deux emplacements des opérandes sources. Ceci a pour conséquence de compliquer les compilateurs associés à ce microprocesseur et souvent de ralentir l'exécution du flot d'instructions.

Les instructions de contrôle de flot.

Les instructions de transferts inconditionnels concernent les instructions de saut, d'appel et de retour de procédures. L'adresse destination peut être située dans le même segment de code (near transfert) ou dans un segment de code différent (far transfert).

Les instructions de transferts conditionnels sont relatives à l'état des codes conditions du registre EFLAGS. Ces codes conditions fournissent les informations classiques quant au résultat d'une instruction (débordement, résultat négatif, nul, retenue, etc.).

Certaines instructions permettent de gérer directement les boucles. Ces instructions utilisent la valeur du registre ECX pour comptabiliser un nombre d'exécution de la boucle. Toutes ces instructions décrémentent la valeur de ce registre jusqu'à une valeur nulle.

À noter également la présence d'instructions d'interruptions logicielles. On citera à titre indicatif l'instruction Bound qui compare la valeur d'un registre par rapport à une borne inférieure et supérieure et déclenche une exception si la valeur n'appartient pas à l'intervalle déterminé. Cette instruction est particulièrement utile, par exemple, pour vérifier l'index d'un tableau.

Les opérations sur les chaînes de caractères.

Ces instructions manipulent de larges structures de données en mémoire. Elles sont obtenues à partir d'instructions spécifiques (exécutées une seule fois) auxquelles on ajoute des préfixes (par exemple le préfixe repeat). Elles incluent :

Après l'exécution d'une de ces instructions les pointeurs << source >> et << destination >> désignent directement le prochain élément de la chaîne (l'incrémentation ou la décrémentation est automatique en fonction du nombre d'octets de chaque élément). Les registres source et destination utilisés sont respectivement les registres ESI et EDI.

Les instructions pour les langages structurés.

C'est le type même d'instructions qui caractérisent les architectures CISC. Elles fournissent un support matériel de fonctions utilisées dans les langages structurés.

Elles sont implémentées pour améliorer l'exécution des appels de procédures et leurs retours. Par exemple, l'instruction ENTER range dans la pile toutes les informations qu'il est nécessaire de conserver avant l'exécution d'une procédure. Cette instruction a deux opérandes. Le premier spécifie le nombre d'octets à réserver dans la pile, le second indique le niveau lexical (de 0 à 31) de la procédure. Ce niveau indique la profondeur de la procédure dans la hiérarchie du programme. Par exemple, la procédure main d'un langage C opère au niveau le plus haut, c'est à dire << niveau 1 >>. L'appel à une procédure est effectué au niveau suivant(<< niveau 2 >>). Une procédure de niveau 2 peut accéder aux variables du programme principal qui sont à des endroits spécifiés par le compilateur.

Une procédure qui appelle une autre procédure d'un niveau lexical plus bas donne à la procédure appelée l'accès à ses variables. L'instruction ENTER fournit cet accès par le biais d'un pointeur sur la pile de la procédure appelante.

Une procédure qui appelle une autre procédure du même niveau lexical ne fournit pas l'accès à ses variables. Dans ce cas, l'instruction ENTER ne fournit l'accès qu'aux variables des procédures de plus haut niveau lexical.

L'instruction LEAVE est l'instruction duale de la précédente.

Les instructions flottantes.

Le banc de registres flottants est implémenté sous forme de pile. Le jeu d'instructions flottant du Pentium est différent du jeu d'instructions entier. Le format interne des flottants est de 80 bits.

Les instructions de transfert de données de la mémoire vers le banc de registres effectuent la conversion de format et le transfert en une seule instruction.

Toutes les instructions flottantes doivent avoir un de leurs opérandes situé sur le sommet de la pile (l'autre étant soit en mémoire, soit dans la pile). Ceci constitue un important goulot d'étranglement qu'essaye de compenser l'instruction FXCH (Floating-point register exchange) qui permet l'échange du contenu du sommet de la pile avec l'un des autres éléments.

Un des défauts du jeu d'instructions du Pentium concerne les branchements conditionnés par le résultat d'une opération flottante. En effet, contrairement à la plupart des microprocesseurs de sa génération, le Pentium oblige à transférer le registre d'état flottant dans un registre entier avant de pouvoir l'utiliser pour conditionner un saut. Ainsi, pour réaliser un saut conditionné par le résultat d'une opération flottante, quatre instructions sont nécessaires :

Les opérations de calcul sur les flottants peuvent être divisées en deux catégories. La première comporte toutes les instructions dites << simples >> qui correspondent aux instructions flottantes arithmétiques d'un microprocesseur RISC (addition, multiplication, division, racine carrée...). La deuxième catégorie d'instructions arithmétiques est composée d'instructions dites << transcendantales >> qui réalisent les fonctions trigonométriques, logarithmiques ou hyperboliques.

En outre, afin d'améliorer le support de codes numériques, il existe quelques instructions permettant de charger dans la pile les constantes les plus usuelles dans les calculs logarithmiques ou trigonométriques.

Enfin, l'instruction WAIT peut être utilisée pour synchroniser les instructions flottantes. Elle permet une gestion précise des exceptions.

Conclusion.

Cette étude du jeu d'instructions xxx86 n'est pas exhaustive. Elle permet cependant de prendre conscience des caractéristiques d'un jeu d'instructions CISC. En plus des instructions présentes dans tout processeur (RISC et CISC), le jeu d'instructions CISC introduit une certaine richesse à travers :



Next: Le processeur Pentium Up: Les microprocesseurs xxx86 Previous: Caractéristiques de l'architecture


flloansi@IRISA.irisa.fr
Fri Jun 7 11:05:24 MET DST 1996