|
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).
PUSHADPour empiler le contenu de tous les registres du microprocesseur (en 32 bits). POPADPour 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.
|