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 :
| Taille | Suffixe | Bits | Valeurs différentes |
|---|---|---|---|
| octet (byte) | .B | 8 | 256 |
| mot (word) | .W | 16 | 65 536 |
| mot long (long) | .L | 32 | un 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 :
| Base | Préfixe | Exemple | Chiffres |
|---|---|---|---|
| décimale (10) | aucun | 45 | 0 à 9 |
| binaire (2) | % | %00101101 | 0 et 1 |
| hexadécimale (16) | $ | $2D | 0 à 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 :
- inverser tous les bits ;
- 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.
| Octet | Sans signe | En complément à deux |
|---|---|---|
$00 | 0 | 0 |
$7F | 127 | 127 |
$80 | 128 | −128 |
$FF | 255 | −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.