|
Attention : cette page n'est pas une initiation à l'assembleur, cette page n'a qu'un seul but : expliquer les 2-3 principes de bases nécessaires pour comprendre la programmation du mode 13h et non de faire apprendre le langage assembleur.
La mémoire d'un ordinateur est comme vous le savez (du moins j'espère) une série d'octets. Sur les PC la mémoire est divisée en zones de 64 Ko (65536 Octets) appelées segments. L'adresse d'un octet en mémoire se compose donc de 2 éléments : un segment et d'un déplacement (l'offset), la notation est la suivante Segment :Offset.
Exemple :
A000 :0001 représente le deuxième octet du segment numéro A000 (40960 en décimal).
Les registres sont des sortes de cases mémoires très rapides situées à l'intérieur du microprocesseur. Il en existe de plusieurs sortes :
Les registres généraux :
Elles ont à manipuler des données et à transmettre des paramètres lors d'appels d'interruptions. On peut les comparer à des variables classiques à un détail prés, elles ont une taille fixe de 32 bits subdivisés en 3 parties, une de 16 bits (les 16 premiers bits que l'on appel aussi bits de poids faible ) et deux de 8 bits (qui ne sont rien d'autre que les 8 premiers et derniers bits des 16 précédents). Ces registres sont les suivants :
Registre étendu (32 bits) |
Registre (16 bits) |
Partie forte du registre (8 derniers) |
Partie faible du registre (8 premiers) |
Fonction |
| EAX |
AX |
AH |
AL |
Accumulateur |
| EBX |
BX |
BH |
BL |
Base |
| ECX |
CX |
CH |
CL |
Compteur |
| EDX |
DX |
DH |
DL |
Données |
| 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 |
J'ai mis ce tableau à titre indicatif car je le répète le but de cette page n'est pas une initiation a l'assembleur.
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 forcément 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 a effectuer par rapport au début d'un segment (EIP) et un registre Flag qui comporte des bits d'informations (débordement, signe, retenue , ...).
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 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 ;
Voilà ce sera tout pour l'assembleur, à mon avis cela suffît pour comprendre le fonctionnement mode 13h. |