Vocabulaire de l'assembleur Intel x86

Un article de Haypo.

(Différences entre les versions)

Version du 18 octobre 2005 à 03:08

Retour à la page précédente Retour à l'assembleur

Vocabulaire de l'assembleur Intel x86.

Sommaire

Compilateur

Un compilateur est un programme qui traduit un code source en code machine. Il produit un programme exécutable ou un objet pouvant être lié à un projet dans un autre langage. On peut par exemple utiliser une fonction en assembleur dans un programme écrit en langage C.

Notation hexadécimale

La notation usuelle des nombres n'utilise que les chiffres arabes compris entre 0 et 9. On dit qu'on travaille en base 10 ou en notation décimale (déci signifiant dix), car nous utilisons 10 chiffres. On peut par exemple décomposer 452 en 4*100 + 5*10 + 2.

Le système hexadécimal au contraire est en base 16, hexa signifiant seize. Pour les chiffres supérieurs à dix, nous utiliserons des lettres : A pour 10, B pour 11, C pour 12, D pour 13, E pour 14, et F pour 15.

Exemples :

  • 42 se notera « 2A » en hexadécimal, effectivement 42 se décompose en 2*16 + 10*1 et 10 se note « A »
  • Inversement « 3DA » en hexadécimal vaut 986 en décimal, effectivement 3DA se décompose en 3 * 162 + 14*16 + 10 avec 14 qui se note « D » et 10 qui se note « A »

Pour différencier les nombres hexadécimaux des nombres décimaux, on utilisera un suffixe ou un préfixe :

  • En langage C, on utilise le préfixe "0x" : exemple « 0x3DA »
  • En langage Pascal, on utilise le préfixe "$" : exemple « $3DA »
  • En langage assembleur, on utilise le suffixe "h" : exemple « 3DAh »

Notation binaire

Le processeur d'un ordinateur travaille majoritairement avec des nombres en notation binaire. Cette notation est dite « en base 2 » (bi dans binaire signifiant deux)

Exemples :

  • Le nombre 9 se note « 1001 » en binaire, effectivement 9 se décompose en 1*23 + 0*22 + 0*21 + 1

Pour différencier les nombres binaires des nombres décimaux, on utilisera un suffixe ou un préfixe :

  • En langage assembleur, on utilise le suffixe "b" : exemple « 1001b »
  • En langage C, on utilise le préfixe "0b" : exemple « 0b1001 »

Bit

Un bit est un nombre ne pouvant prendre que deux valeurs : un ou zéro, souvent exprimés comme « vrai » (un) ou « faux » (zéro). C'est un chiffre dans la notation binaire.

Octet

Un octet est un ensemble de 8 bits.

  • S'il est signé (peut être positif ou négatif), il peut prendre une valeur comprise entre -128 et 127. Le premier bit est utilisé pour le signe (vaut un si le nombre est positif).
  • S'il n'est pas signé, il peut prendre une valeur comprise entre 0 et 255.

Note : 128 = 27, 127 = 27 - 1, et 255 = 28 - 1.

Mot

Un mot est un ensemble de deux octets, il a donc une taille de 16 bits.

  • S'il est signé, il peut avoir une valeur comprise entre -32768 (215) et +32767 (215 -1)
  • S'il n'est pas signé, il peut avoir une valeur comprise entre 0 à 65535 (216 - 1)

Double mot

Un double mot est un ensemble de deux mots (quatres octets) et a double une taille de 32 bits.

  • S'il est signé, il peut prendre une valeur comprise entre -2 147 483 648 (- 231, environ moins deux milliards) et 2 147 483 647 (231 - 1, environ deux milliards)
  • S'il n'est pas signé, non-signé, il peut prendre une valeur comprise entre 0 et 4 294 967 295 (232 - 1, environ quatre milliards)

Registre

Un registrest un espace mémoire stocké physiquement dans le cœur du processeur. Ils sont vitaux pour avoir un temps de réponse optimum, effectivement, on a souvent besoin d'une variable locale lors de calculs.

Dans les tous premiers processeurs Intel (4004 et 4040), les registres avaient une taille de 4 bits. Ils sont rapidement passés à 8 bits avec la génération 8080. Puis 16 bits avec le 8086, et enfin 32 bits avec le 486. Aujourd'hui (en 2005), les processeurs à registre de 64 bits gagnent le grand public avec l'AMD64.

  • Les premiers registres (8 bits) s'appelaient : AL, BL, CL et DL
  • Les registres 16 bits se sont appelés : AX, BX, CX et DX. La particularité est que les 8 bits de poids faibles sont en fait les registres 8 bits (AL pour AX, BL pour BX, etc.)
  • Enfin les registres sont : EAX, EBX, ECX et EDX. La aussi, la partie faible correspond aux registres en 16 bits (AX pour EAX, BX pour EBX, etc.).

Voyez également la liste des registres.

Segment et Offset

En mode réel, l'adresse d'une variable en mémoire se décompose en deux parties : segment et offset. L'adresse résultat vaut en fait « adresse = segment * 16 + offset ». Tous les systèmes d'exploitation modernes (après MS-Dos) travaillent en mode protégé où les adresses n'utilisent qu'un seul registre de 32 bits (et non plus deux registres de 16 bits).

Cet article était écrit pour MS-Dos, nous utiliserons le mode réel. Les adresses mémoires sont donc définies par deux registres : le segment, partie haute de l'adresse, et l'offset (partie basse de l'offset). On note l'adresse : « segment:offset » ou « segment:[offset] » (les crochets sont optionnels). Avec les processeurs Intel 386, les offsets sont passés en 32 bits pour accéder à plus de mémoire (plus de 16 Mo), les offsets avec le préfixe "E" sont apparus (ESI, EDI, ESP, EBP), et comme pours les registres 32 bits, les registres 16 bits, les offsets SI, DI, SP, BP en sont leur partie basse.

Consultez la liste des registres.

Interruption

Une interruption est un action qui va appeler une fonction lorsqu'elle est déclanchée. Une interruption peut être matérielle (arrivée d'une touche du clavier par exemple) ou logicielle (division par zéro). Il y en a 256 au maximum, et les premières sont intégrés dans le BIOS (programme lancé au démarrage de l'ordinateur qui gère le matériel : disque dur, accès mémoire, ...) comme les interruptions de la carte vidéo ou le clavier. Certaines sont appelées à une fréquence constante : l'interruption 1Ch par exemple qui est un compteur qui incrémente une valeur 18.6 fois/seconde; d'autres sont appelées uniquement si on a besoin d'elle : l'interruption 09h du clavier est appelée à chaque pression ou relachement d'une touche.

Consultez la liste complète des interruptions.

Pile

La pile est un espace mémoire utilisé pour stoquer temporairement des valeurs : variables locales d'une fonction ou paramètres d'une fonction. Une pile en informatique peut être comparée à une pile d'assiette : on entasse des assiettes avec l'instruction "PUSH" puis on les enlêve avec l'instruction "POP". La hauteur de la pile est la valeur du registre BP (ou EBP sur les processeurs 32 bits). On peut voir ce qu'il y a à l'étage X avec une instruction dans le style "MOV AX,[BP-4]", mais pas l'enlever, car si on enlève une assiette au milieu de la pile, la pile dégringole (= plantage du PC).

Flags

Les flags, ou drapeaux en français, sont des bits internes au processeur permettant de signaler un état ou de modifier le fonctionnement du processeur. Le flag ZF indique par exemple si le résultat de la dernière instruction à mis un registre à zéro.

Consultez la liste des drapeaux.