Processeurs et jeux d’instructions
CHAPITRE 4 159
Introduction au langage assembleur
Dans le cadre de notre démarche ascendante, nous allons maintenant aborder une intro-
duction à la programmation en assembleur. Il s’agit d’en donner les principes de base et
de montrer comment le modèle de programmation du processeur est l’interface qui rend
possible toutes les abstractions de niveau supérieur. Nous commençons par des exemples
triviaux et la fin de la section est consacrée aux mécanismes plus complexes sous-jacents
à l’appel de procédure.
Les premiers exemples sont de petits programmes très simples écrits en langage C et
nous demandons au compilateur de traduire ce programme en un programme assembleur
pour le processeur 68000. Nous prendrons ensuite la même démarche et les mêmes
exemples avec un processeur de conception assez différente, le MIPS.
Les exemples sont illustrés par un tableau présentant conjointement le programme C, le
programme correspondant en assembleur et le code binaire exécutable généré qui met en
œuvre le jeu d’instruction.
La partie gauche de la figure est le programme C qui ne comporte que des affectations
simples. La colonne de droite est le programme assembleur 68000 généré automatique-
ment par le compilateur C.
La partie centrale est le code objet du programme (binaire), tel qu’il peut être chargé en
mémoire centrale pour son exécution. La visualisation est faite en notation hexadécimale,
2 digits hexadécimaux décrivant un octet. La colonne de gauche marquée ad donne les
adresses d’implémentation en mémoire. Ainsi, dans le premier exemple du tableau 4-1,
le code du programme commence à l’adresse 06 et se termine à l’adresse 25. La zone de
données où sont stockées les variables commence à l’adresse 00 et se termine à
l’adresse 05. Seuls les digits de poids faible de l’adresse sont visualisés.
Le début du programme assembleur concerne la déclaration des variables pour lesquelles il
faut réserver de la place en mémoire. Par convention, les noms des variables en C gardent le
même nom mais précédé du caractère « _ ». Les
int
(entiers) en C deviennent pour ce compi-
lateur des mots de 16 bits (
suffixe .w
) et sont déclarés sous forme de suite de 2 octets.
Dans la partie centrale, on constate que la variable
_a
possède pour adresse 00 et la
dernière adresse occupée par
_a
est l’adresse 01.
Le nom
main
en C est le nom d’une procédure particulière habituellement appelée
programme principal. Ce nom devient un label ou étiquette en assembleur (
_main
). Un
label est suivi du caractère «
:
» et prend pour valeur celle de l’adresse de l’instruction
qui suit. Ainsi
_main
est égal à 06 qui est l’adresse de la première instruction du
programme. Une étiquette est généralement utilisée comme le paramètre de destination
dans une instruction de saut conditionnel ou inconditionnel.
3864_ Page 159 Jeudi, 2. juin 2005 12:15 12 > Apogee FrameMaker Noir