Chapitre V
Programmation du processeur 32 bits
CRAPS/SPARC
Le langage machine (et sa forme équivalente symbolique dite assembleur) est exécuté
directement par le processeur, et il est à ce titre l’intermédiaire obligé de tous les composants
logiciels d’un ordinateur. Même s’il est vrai que peu de gens programment directement en
assembleur, son étude est éclairante pour la compréhension de la relation entre logiciel et
matériel. Le but de ce présent chapitre est d’initier à la programmation en assembleur du
processeur CRAPS au travers de programmes de différentes natures, de façon à ensuite
mieux comprendre son architecture et son fonctionnement.
1. Le langage machine, à la frontière entre logiciel et matériel
Langage machine et ISA
Les instructions qu’exécute un processeur sont écrites dans un langage appelé langage
machine, et sont formées de codes écrits dans des mots mémoires consécutifs ; on appelle
ISA (Instruction Set Architecture) ce langage et son organisation. L’informatique utilise un
grand nombre de langages différents : des langages de programmation tels que C ou Java
pour les programmeurs, des langages interprétés tels que les langages de macro des suites
bureautiques, des langages de gestion de bases de données, etc. Mais la particularité du
langage machine, c’est d’être le langage intermédiaire en lequel tous les autres langages vont
être traduits, en une ou plusieurs étapes. Il est situé à la frontière entre le processeur et les
logiciels, entre hardware et software, et le processeur est l’interpréteur de ce langage (figure
V.1), celui qui met en action ses instructions.
ISA générale ou spécialisée ?
Bien sûr, il serait plus efficace d’avoir un processeur qui exécute directement
un langage évolué, tout au moins pour les programmes écrits dans ce langage. De tels
processeurs existent ou ont existé, notamment pour le langage Lisp, et plus récemment pour
le langage intermédiaire (bytecode) utilisé en Java. Ces deux langages sont généralistes et
peuvent être utilisés dans toutes les situations concrètes de l’informatique, et l’espoir des
concepteurs de ces processeurs était d’élever au niveau de ces langages la frontière entre
matériel et logiciel. Mais le bytecode Java exploite une machine à base de pile, peu adaptée
à la compilation d’autres langages de programmation tels que C. Finalement, le compromis
généralement adopté lors de la conception d’un nouveau processeur est le développement
d’une ISA adaptée à la compilation de la plupart des langages de programmation courants
.
129
130 CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC
programme
gestionnaire en Javascript
de bases de données
(langage SQL) programme
en langage C
interprétation
interprétation
compilation
logiciel
langage machine
matériel
interprétation
processeur
Figure V.1. Tous les programmes produisent du langage machine, qui est exécuté directe-
ment par le processeur.
Évolution des ISA
Comme toute structure située à une frontière, l’ISA est un équilibre entre des forces
opposées. Les concepteurs de compilateurs souhaitent une ISA régulière et possédant le plus
de possibilités en termes d’adressage mémoire, d’opérations arithmétiques, etc., alors que
les architectes des processeurs veulent une ISA simple à implémenter efficacement.
Une force importante qui limite l’apparition de nouvelles ISAs (de nouveaux langages
machine) est la demande des clients d’une compatibilité ascendante d’un processeur
d’une génération à l’autre, de façon à pouvoir faire fonctionner sans changement leurs
anciens programmes. Cette force se manifeste de façon très puissante avec les processeurs
de PC (dont l’ISA est souvent désignée par x86, parce que les noms des processeurs se
terminent par 86 : 8086, 80286, etc.), pour laquelle tout changement conduisant à une non
compatibilité est exclu. Ainsi, les processeurs x86 les plus récents continuent à manifester la
bizarrerie d’écriture en mémoire inversée de type little-endian, parce qu’elle était présente
à l’origine sur le processeur 8 bits Intel 8080 pour des motifs de simplicité de conception,
et qu’elle s’est transmise pour raison de compatibilité tout le long de la chaîne 8080, 8085,
8086, 80286, 80386, Pentium, Pentium 2, etc. jusqu’aux processeurs des PCs actuels.
D’autres processeurs moins connus ont également une lignée très longue et respectable. On
peut citer le processeur ARM, un des premiers processeurs 32 bits commercialisés, qui fait
évoluer son ISA de façon ascendante depuis les années 80 jusqu’à maintenant, et qui équipe
un grand nombre de téléphones portables, les consoles de jeux portables Nintendo et un
grand nombre d’appareils mobiles.
Processeurs CISC et RISC
Une nouvelle génération de processeurs est apparue dans les années 80, caractérisée par
un jeu d’instruction limité à l’essentiel, d’où leur nom de processeurs RISC (Reduced
Instruction Set Computer). Par ailleurs, leur ISA est généralement très régulière, contient
beaucoup de registres utilisateurs, et les instructions sont codées sous forme d’un mot
mémoire unique. Tout cela rend heureux les architectes du processeur, qui peuvent
concevoir des architectures très efficaces pour cette ISA, et ne rend pas trop malheureux les