Les registres Version imprimable Suggérer par mail
Appréciation des utilisateurs: / 0
FaibleMeilleur 
Registres généraux :


   |  EAX      |   32 bits
   |     | AX  |   16 bits
   |     |AH|AL|    8 bits

   |  EBX      |   32 bits
   |     | BX  |   16 bits
   |     |BH|BL|    8 bits

   |  ECX      |   32 bits
   |     | CX  |   16 bits
   |     |CH|CL|    8 bits

   |  EDX      |   32 bits
   |     | DX  |   16 bits
   |     |DH|DL|    8 bits


Registres d’index :


   |   EDI     |   32 bits
   |     | DI  |   16 bits
   

   |   ESI     |   32 bits
   |     | SI  |   16 bits
 

   |  ESP      |   32 bits
   |     | SP  |   16 bits
 

   |  EBP      |   32 bits
   |     | BP  |   16 bits

Registres de flag  16 bits

EIP / IP   16 bits



Un registre sert à stocker les données nécessaires à l'exécution d'un programme par le microprocesseur. On n'accède pas à un registre avec une adresse, mais avec son appellation.

Pour les exemples qui vont suivre, je vais vous décrire l'instruction la plus utilisée dans le microprocesseur: MOV

MOV registre1, registre2 a pour effet de copier le contenu du registre2 dans le registre1, le contenu préalable du registre1 étant écrasé. Registre1 et registre2 devant être de même taille.

2.4.1 Les registres généraux
Ils se nomment EAX, EBX, ECX, EDX ce sont des registres de 32 bits, qui servent notamment pour stocker les résultats des opérations arithmétiques.

2.4.1.1 Le registre EAX
On peut accéder aux bits 0 à 7 de ce registre, en utilisant la notation :  AL ( L pour LOW (bas en anglais)).

par exemple: MOV AL, 10h

Aura pour effet de placer la valeur 10h dans les bits 0.. 7 du registre EAX, le reste du registre étant inchangé.

Pour accéder aux bits 8 à 15 de ce registre, on doit utiliser la notation AH (H pour HIGH (haut en anglais))

par exemple: MOV AH, 31h

Aura pour effet de placer la valeur 31h dans les bits 8.. 15 du registre EAX, les autres bits restant inchangés.

On peut accéder aux bits 0 à 15 du registre EAX, en une seule fois, on doit alors utiliser la notation AX.

par exemple: MOV AX, 1234h.
Aura pour effet de placer la valeur 1234h dans les bits 0.. 15 du registre EAX. et enfin pour accéder au registre EAX dans son intégralité, il suffit de l'appeler par son nom EAX.

exemple : MOV EAX, 12345678h

Aura pour effet de placer la valeur 12345678h dans le registre EAX.

voyons maintenant un petit programme: ces instructions sont exécutées les unes après les autres.
INSTRUCTION     CONTENU DE EAX    CONTENU DE AX    CONTENU DE AH    CONTENU DE AL
MOV EAX, 12345678h    12345678h    5678h    56h    78h
MOV AL,10h    12345610h    5610h    56h    10h
MOV AX,0000h    12340000h    0000h    00h    00h
MOV AH,31h    12343100h    3100h    31h    00h
MOV AL,AH    12343131h    3131h    31h     31h

2.4.1.2 Les registres EBX, ECX, EDX
Les registres EBX, ECX, et EDX: conformément au schéma du début du chapitre, se manipulent exactement comme le registre EAX.

2.4.2 Les registres de segments
Ces registres, de 16 bits, servent uniquement, à indiquer l'or d'une écriture ou d'une lecture mémoire, à partir de quel segment on veut lire ou écrire.
Pour donner un exemple, je vais vous présenter un autre aspect de l'instruction MOV.

MOV registre1 , segment: taille [OFFSET]

a pour effet de copier la valeur qui se trouve à l'adresse OFFSET+ 16* segment de taille 'taille' dans registre1. On dira que l'on à réalisé un adressage direct ( l'adresse de la donnée est directement comprise dans l'instruction), dans les cas précédents (pour les premiers exemples), il s'agissait d'adressage immédiat.

taille peut être:

- Un octet on écrit alors BYTE PTR pour taille
- Un mot de 16 bits on écrit alors WORD PTR pour taille
- Un double mot (32 bits) on écrit alors DWORD PTR pour taille.

Exemple:

MOV AL , 200h: BYTE PTR [20h]

a pour effet de copier l'octet qui se trouve à l'adresse 200h: 20h, dans le egistre AL.

et bien, si on met la valeur 200h dans le registre de segment DS, on ourra réaliser la même chose avec:

MOV AL , DS: BYTE PTR [20h]

Rien ne nous empêche de réaliser une écriture mémoire plutôt qu'une lecture, par exemple:

MOV DS: BYTE PTR [20h], AL

Copie la valeur stockée dans AL, à l'adresse DS: 20h soit DS* 16+ 20h.

2.4.3 Rôle des registres de segments

DS 'DATA SEGMENT' est généralement utilisé pour adresser des données.

CS 'CODE SEGMENT' représente le segment à partir duquel se trouvent les instructions du programme (et oui les instructions doivent êtres stockée quelques part en mémoire, tous comme les données, vous reverrez ça dans le dernier chapitre).

ES 'EXTRA SEGMENT ' On peut l'utiliser comme on veux, tous comme FS et GS .

SS 'STACK SEGMENT ' Comme je ne vous ai pas encore expliqué ce qu'est la pile, j'y reviendrai plus tard.

On ne peut pas mettre directement une valeur immédiate dans un registre de segment, le microprocesseur ne le permet pas:

MOV DS, 0200h est incorrect

par contre

MOV AX, 0200h

MOV DS, AX est correct.

2.4.4 Les registres d'index
Ce sont des registres de 32 bits, qui peuvent servir à faire un peu n'importe quoi (opérations arithmétiques...), mais qui à l'origine (sur les P. C. XT ) servaient à contenir l'offset d'une adresse.
par exemple:

MOV DI, 20h

MOV DS: BYTE PTR [DI], AL

est équivalent à

MOV DS: BYTE PTR [20h], AL

Une exception : Dans les registres généraux EBX peut être utilisé comme
un registre d'index.
Exemple :

MOV BX, 20h

MOV DS: BYTE PTR[ BX], AL

est équivalent à l'exemple précédent.

2.4.5 Les différents registres d’index (sur 32 bits)

EDI : 'DESTINATION INDEX', Tire son nom des instructions de copie de chaîne de caractères, ou il pointait sur la destination. Ces instructions ne sont quasiment plus utilisées aujourd'hui. On peut s'en servir pour faire ce que l'on veut à partir du 386.

ESI : 'SOURCE INDEX ' tous comme pour EDI, il servait pour copier des chaînes de caractères, il pointait sur la source. On peut s'en servir pour faire ce que l'on veut à partir du 386.

ESP : 'STACK POINTEUR' Il sert à contenir l'offset de l'adresse de la pile, mieux vaut éviter d'y toucher.

EBP : 'BASE POINTEUR' On en fait, tous comme pour EDI et ESI ce que l'on veut .

Bien entendu, DI, SI, SP, BP représentent les bits de 0 à 15 de ces registres.

2.4.6 Les registres de travail du microprocesseur
2.4.6.1 EIP
Il s'agit d'un registre de 32bits (à partir du 386, avant il s'appelait IP et faisait 16 bits), on ne peut pas y accéder, le microprocesseur s'en sert pour savoir quelle instruction il doit exécuter, ce registre contient l'offset par rapport au registre de segment CS, de l'adresse de la prochaine instruction à exécuter.
2.4.6.2 Registre de flag (32 bits à partir du 386)
On ne peut pas non plus y accéder. Son rôle est de positionner ses bits ( à l'état 0 ou 1) selon le résultat arithmétique de la précédente instruction exécutée. Toutes les instructions conditionnelles (instructions qui ne s'exécutent que si une conditions est vérifiée, nous les verrons par la suite.. ) s'y réfèrent.

BIT    APPELLATION    Rôle
0    CF (Carry flag)    Passe à 1 si l'opération arithmétique à engendré une retenue
2    PF (Parity Flag)    Passe à 1 si l'opération arithmétique à engendré un résultat avec un nombre pair de bits à 1.
6    ZF (Zero Flag)    Passe à 1 si le résultat de l'opération arithmétique précédente est nul.
7    SF (Sign Flag)    Passe à 1 si le résultat de l'opération arithmétique précédente est négatif
11    OF (Overflow Flag)    Passe à 1 si la somme de deux nombres positif donne par débordement un résultat négatif (voir cour 1)

2.4.7 La pile
La pile est une zone mémoire, dont le programmeur fixe la taille, et qui sert à sauvegarder la valeur d'un registre, tous comme à faire passer des paramètres à un sous programme.

Pour utiliser la pile nous auront 6 instructions:

PUSH pour empiler une valeur

POP  Pour dépiler une valeur

PUSHA Pour empiler le contenu de tous les registres du microprocesseur (en 16 bits).
POPA Pour dépiler le contenu de tous les registres du microprocesseur (en 16 bits).

PUSHADPour empiler le contenu de tous les registres du microprocesseur (en 32 bits).
POPADPour dépiler le contenu de tous les registres du microprocesseur (en 32 bits).

La pile dans les microprocesseurs INTEL, est une pile LIFO ( Last In First Out) ce qui signifie que la première valeur dépilée, sera la dernière que l'on aura empilé.

Exemple:

MOV AX, 0010h
MOV BX, 1234h
PUSH AX
PUSH BX
POP AX ==> AX contient 1234h
POP BX ==> BX contient 0010h

cet exemple à permis d'échanger le contenu de deux registres, en se servant de la pile comme tampon intermédiaire.

2.5 Assembleur et langage machine
Dans des discutions passionnées sur les compétences de chacun, il est rare que quelqu'un ne sorte pas l'idiotie suivante:

Le langage machine c'est plus rapide que l'assembleur !
Ou pire encore :
L'assembleur, c'est génial, c'est plus rapide que le langage machine !

Rassurer vous, si vous avez à faire à ce genre de personnes, ne vous sentez pas ignorant, il s'agit de personnes qui ne savent pas de quoi elles parlent, et qui se permettent de porter des jugements.

Le langage machine c'est exactement la même chose que l'assembleur, seule l'apparence diffère, je m'explique.

Si vous voulez mettre la valeur FFFFh dans AX vous taperez

MOV AX, FFFFh
et votre assembleur transformera ça en

B8FFFF

soit en binaire %1011 1000 1111 1111 1111 1111.

Quand votre microprocesseur rencontrera la valeur binaire %10111000, il saura que il s'agit de l'instruction MOV AX,? et que vous allez lui fournir à la suite une valeur immédiate sur 16 bits qu'il devra mettre dans AX.

Si vous aviez tapé directement les bits un à un, le résultat aurait été exactement le même, vous auriez simplement beaucoup souffert pour rien, vous auriez alors programmé en langage machine.

L'assembleur, se limite en fait à directement transcrire en code machine votre programme assembleur. L'assembleur ne modifiera en rien vos initiatives , la vitesse d'exécution est donc exactement la même, que le programme ait été programmé en langage machine bit par bit , ou en assembleur avec turbo assembleur (ou watcom assembleur).

Si par contre, vous programmez en basic ou en langage C, vous ne saurez pas ce que le compilateur fera de votre programme quand il le transformera en un programme machine directement compréhensible par le microprocesseur.

Ces petites précision, devraient vous permettre de comprendre maintenant pourquoi les instructions ont une adresse, elles sont pointées par CS: EIP, et c'est le microprocesseur qui les interprétera comme données ou instructions selon le contexte. Vous verrez, que, quand vous programmerez si par mégarde vous allez continuer l'exécution de votre programme dans des données, le microprocesseur se retrouvera alors avec des instructions incohérentes, et plantera assez vite.
Commentaires (0)Add Comment

Ecrivez un commentaire
quote
bold
italicize
underline
strike
url
image
quote
quote
smile
wink
laugh
grin
angry
sad
shocked
cool
tongue
kiss
cry
Réduire l'éditeur | Agrandir l'éditeur

security code
Entrez les caractères affichés


busy
 
< Précédent   Suivant >

Vidéos aléatoires

maths limites de fonctions
Moyenne:
Clics:164
Les ondes lumineuses
Moyenne:
Clics:35
VIDEO-MATHS système d´equations
Moyenne:
Clics:35
Factorisation 3ème
Moyenne:
Clics:131

Liens

Liens

Qui est en ligne

Il y a actuellement 1 invité en ligne

Identification






Mot de passe oublié ?
Pas encore de compte ? Enregistrez-vous