Version sans JavaScript, en lecture seule : les ateliers, les quiz et l’exécution du code n’y sont pas. Version complète · Catalogue · Se connecter

Support de cours · chapitre 1

Représenter l'information

Tout ce que manipule le processeur est une suite de bits. Comment on y écrit des nombres, positifs ou négatifs, des caractères, et comment on les range en mémoire.

Des bits et des bases

Le bit, l'octet

Un ordinateur ne connaît que deux états : 0 et 1. C'est le bit. On les regroupe par 8 en un octet, qui peut prendre 2⁸ = 256 valeurs différentes. Le 68000 manipule trois tailles, qu'on indique par un suffixe dans ses instructions :

TailleSuffixeBitsValeurs différentes
octet (byte).B8256
mot (word).W1665 536
mot long (long).L32un peu plus de 4 milliards

Trois façons d'écrire un nombre

Un même nombre s'écrit dans plusieurs bases. En assembleur 68000, un préfixe dit laquelle :

BasePréfixeExempleChiffres
décimale (10)aucun450 à 9
binaire (2)%%001011010 et 1
hexadécimale (16)$$2D0 à 9, puis A (10) à F (15)

Ces trois écritures désignent le même nombre, quarante-cinq.

Du binaire au décimal : chaque chiffre vaut une puissance de 2, de droite à gauche 1, 2, 4, 8, 16… %00101101 = 32 + 8 + 4 + 1 = 45.

Du décimal au binaire : on divise par 2 tant qu'on peut, et on lit les restes de bas en haut. 45 = 2 × 22 + 1 ; 22 = 2 × 11 + 0 ; 11 = 2 × 5 + 1 ; 5 = 2 × 2 + 1 ; 2 = 2 × 1 + 0 ; 1 = 2 × 0 + 1. On lit %101101.

Entre binaire et hexadécimal, c'est immédiat : un chiffre hexadécimal vaut exactement 4 bits. On coupe le binaire en paquets de 4 depuis la droite : %0010 1101 donne 2 et D, soit $2D. C'est pour cela qu'on écrit presque tout en hexadécimal : c'est du binaire, en quatre fois plus court.

Les nombres négatifs

Le complément à deux

Sur 8 bits, on peut coder les entiers de 0 à 255. Pour coder aussi des négatifs, le 68000, comme presque tous les processeurs, utilise le complément à deux : sur $n$ bits, on code les entiers de −2ⁿ⁻¹ à 2ⁿ⁻¹ − 1, soit de −128 à 127 sur un octet.

Pour obtenir le codage de −x à partir de celui de x :

  1. inverser tous les bits ;
  2. ajouter 1.

Le bit de gauche, dit bit de poids fort, indique le signe : 0 pour un nombre positif ou nul, 1 pour un nombre négatif.

Les mêmes bits, deux lectures

Le processeur ne sait pas si un octet est signé ou non : c'est le programmeur qui décide comment le lire. $FF vaut 255 lu sans signe, et −1 lu en complément à deux. $80 vaut 128, ou −128.

OctetSans signeEn complément à deux
$0000
$7F127127
$80128−128
$FF255−1

L'extension de signe

Pour passer un nombre signé d'un octet à un mot, on recopie son bit de signe à gauche. −10 s'écrit $F6 sur 8 bits et $FFF6 sur 16 bits ; 118 s'écrit $76 et $0076. Compléter par des zéros serait une erreur : $00F6 vaut 246.

Retenue et débordement

Quand on additionne deux nombres, le résultat peut ne pas tenir dans la taille choisie. Il y a deux façons d'échouer, selon la lecture :

  • en non signé, le résultat dépasse la plus grande valeur : il y a une retenue (carry) ;
  • en signé, le résultat sort de l'intervalle, par exemple la somme de deux positifs paraît négative : il y a un débordement (overflow).

La mémoire

Un grand tableau d'octets

La mémoire est un tableau d'octets, chacun repéré par un numéro, son adresse, qu'on écrit en hexadécimal : $1000, $1001… Un mot occupe deux octets consécutifs, un mot long quatre.

Big-endian : l'octet de poids fort d'abord

Pour ranger un mot long, il faut choisir dans quel ordre écrire ses quatre octets. Le 68000 est big-endian : l'octet de poids fort est à la plus petite adresse. Le mot long $12345678 rangé à l'adresse $2000 donne :

Adresse$2000$2001$2002$2003
Octet$12$34$56$78

On lit la mémoire dans l'ordre où l'on écrit le nombre. (Les processeurs Intel font l'inverse : ils sont little-endian.)

L'alignement

Sur le 68000, un mot ou un mot long doit commencer à une adresse paire. Lire un mot à l'adresse $2001 provoque une erreur d'adresse, qui arrête le programme. Un octet, lui, peut être à n'importe quelle adresse.

Les caractères

Un caractère est rangé dans un octet, selon le code ASCII : 'A' vaut $41 (65), 'B' vaut $42, 'a' vaut $61, le chiffre '0' vaut $30, l'espace $20. Une chaîne de caractères est une suite d'octets en mémoire, et l'on marque souvent sa fin par un octet nul, $00.

Deux conséquences utiles :

  • on passe d'une majuscule à la minuscule en ajoutant $20 ;
  • on obtient la valeur d'un chiffre en retirant $30 à son code : '7' − '0' = $37 − $30 = 7.