Attention : Cette page n'est pas une initiation à l'assembleur. Son objectif est uniquement de
poser quelques principes de bases nécessaires pour comprendre la programmation du mode 13h.
Segment et Offset
La mémoire d'un ordinateur n'est en réalité qu'une série d'octets consécutifs qui forment un très gros tableau à une seule
dimension.
Sur les PC, cette mémoire est divisée en zones de 64 Ko (65536 Octets) appelées segments.
L'adresse mémoire d'un octet se décompose selon 2 éléments : un numéro de segment et une position dans le segment (l'offset).
La notation courante est la suivante Segment:Offset.
Exemple :
A000:0001 représente le deuxième octet du segment A000 (40960 en décimal).
Les registres
Les registres sont des zones mémoires très rapides situées à l'intérieur du microprocesseur.
Il en existe de plusieurs sortes :
Les registres de travail :
Il y en a 4 (EAX, EBX, ECX et EDX) et ils servent à manipuler des données ou à stocker des paramètres lors d'appels d'interruptions.
Historiquement, ils etaient 16 bits avant d'être étendu à 32 bits.
| 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 |
| Registre étendu |
Registre |
Partie forte du registre |
Partie faible du registre |
Fonction |
| EAX |
AX |
AH |
AL |
Accumulateur |
| EBX |
BX |
BH |
BL |
Base |
| ECX |
CX |
CH |
CL |
Compteur |
| EDX |
DX |
DH |
DL |
Pointeur de donnée |
| ESI |
SI |
Non accessible directement |
| Index de source |
| EDI |
DI |
Non accessible directement |
Non accessible directement |
Index de destination |
| ESP |
SP |
Non accessible directement |
Non accessible directement |
Pointeur de pile |
| EBP |
BP |
Non accessible directement |
Non accessible directement |
Pointeur de base |
Remarque : lorsque que l'on modifie une partie de registre, les sous-parties sont bien sur touchées.
Exemple si je modifie la valeur de EAX alors AX, AH et AL sont modifiées mais l'opération inverse n'est pas vraie,
si je touche à AL, la valeur de AH n'est pas modifiée.
Les registres de segment :
Ils sont utilisés pour stocker l'adresse du début d'un segment. Cela peut être un segment d'instruction de programme, de début de données ou de la pile.
| Nom |
Fonction |
| CS |
Segment de code |
| DS |
Segment de données |
| ES |
Extra Segment |
| SS |
Segment de pile |
| FS |
Segment supplémentaire (386 et +) |
| GS |
Segment supplémentaire (386 et +) |
Les autres registres :
Il existe un registre contenant le déplacement à effectuer par rapport au début d'un segment (EIP) et un registre Flag qui comporte des bits d'informations (débordement, signe, retenue , ...).
Les opérations de base
L'affectation :
Pour donner à une variable ou à un registre une valeur on utilise la fonction mov
Exemple : faire prendre au registre AX la valeur 123
mov ax, 123 ;
L'addition :
L'addition se fait à l'aide de add.
Exemple : additionner 12 et 53, le resultat sera automatiquement stocké dans AX
mov ax, 12 ;
add 53 ;
La multiplication :
L'addition se fait à l'aide de mul.
Exemple : multiplier 5 et 9, le resultat sera automatiquement stocké dans AX
mov ax, 5 ;
mul 9 ;
Les interruptions
Les interruptions sont des fonctions du Bios ou du système d'exploitation. Certaines fonctions ont besoin de paramètres,
on les transmet alors à l'aide des registres. On exécute une interruption grâce a la fonction
int.
Exemple :
Exécution de l'interruption 10h avec passage de paramètres dans AH et AL
mov ah, 00h ;
mov al, 13h ;
int 10h ;
Ce sera tout pour l'assembleur, cela suffît pour comprendre le fonctionnement mode 13h.