Chapitre 5
Adressage des opérandes, boucles, tableaux et pointeurs
Jean Privat
Université du Québec à Montréal
INF2170 — Organisation des ordinateurs et assembleur Automne 2013
Plan
1 Boucles et structures de contrôles
2 Adressage des opérandes
3 Adressages calculés et tableaux
4 Adressages indirects et pointeurs
5 Autres adressages
Plan
1 Boucles et structures de contrôles
2 Adressage des opérandes
3 Adressages calculés et tableaux
4 Adressages indirects et pointeurs
5 Autres adressages
Structures de contrôles
Les langages procéduraux (et supérieurs) if(cond) instrs
if(cond) instrs else instrs while(cond) instrs
do instr while(cond)
for(instr ; cond ; instr) instrs
opérateurs booléens (and or not && || !)
En assembleur BR
BRcond
Goto vs. programmation structurée
Structures de contrôles Pour les humains
Pour écrire des algorithmes (et des recettes de cuisine)
Gotos
Pour les machines
Pour écrire des livres dont vous êtres le héros
Programmer en assembleur
Principe
Simuler les structures de contrôles
Comment faire
Transformer les structures de contrôles en BR et BRcond
Éviter d’utiliser des BR et BRcond autrement
Objectif
Le code écrit doit être le plus linéaire possible Éviter le pire (code spaghetti)
Exercices
Conditions
Écrire un programme qui demande (poliment) un nombre ; indique s’il est négatif, compris entre 0 et 100 ou plus grand que 100 ; puis dit au revoir.
Boucles
Écrire un programme qui compte de 1 jusqu’à 100
E-S
Écrire un programme qui lit un ligne et transforme les
’a’ en 4, les ’e’ en ’3’ et les ’i’ en ’1’.
Plan
1 Boucles et structures de contrôles
2 Adressage des opérandes
3 Adressages calculés et tableaux
4 Adressages indirects et pointeurs
5 Autres adressages
Rappel
L’assembleur
Attribue des adresses relatives : Aux instructions
Aux données
À l’exécution
Les adresses réelles (absolues) utilisées peut être différentes des adresses relatives
Le chargeur
Doit charger le programme quelque part en mémoire Doit se débrouiller pour que le programme fonctionne
Modes d’adressages
Spécificateur d’opérande 6= opérande
L’opérande est la valeur utilisée par l’instruction Le spécificateur d’opérande est un paramètre de l’instruction
Mode d’adressage
Le mode d’adressage est un paramètre de l’instruction
Il explique comment obtenir l’opérande à partir du spécificateur
Adressage immédiat
L’opérande telle quelle
L’opérande est dans l’instruction elle même Pas d’accès mémoire supplémentaire
opérande = spécificateur d’opérande
Exemples
LDA 456,i ; A ← 456 CHARO ’*’,i ; print(’*’) Utilisation
Constantes
Adressage direct
L’adresse effective de l’opérande
L’opérande est en mémoire à l’adresse effective désignée par le spécificateur
Plusieurs octets peuvent être lus ou modifiés opérande = mem[spécificateur]
Exemples
LDA val,d ; A ← mem[val]
CHARI char,d ; mem[char] <- getChar() ; Utilisations
Variables globales
Plan
1 Boucles et structures de contrôles
2 Adressage des opérandes
3 Adressages calculés et tableaux
4 Adressages indirects et pointeurs
5 Autres adressages
Adressage indexé
Une adresse relative de l’opérande
L’adresse effective est calculée à l’exécution Le spécificateur désigne une adresse de base Un registre d’index indique le décalage opérande = mem[spécificateur + index]
Exemples
LDX j,d ; X ← mem[j]
LDBYTEA vec,x ; mem[vec + X] (ou "vec[j]" en C) Attention
Adressage basé
Une adresse relative de l’opérande (bis) Un registre de base indique une adresse Le spécificateur désigne le décalage opérande = mem[base + spécificateur]
Exemples
Pas d’adressage basé en Pep/8
Utilisation
Relocation dynamique (chargeur)
Astuce : adressage indexé ≈ adressage basé
Tableaux
Tableaux en assembleur
Une suite de valeurs en mémoire
L’adresse du tableau est l’adresse de la première case
Attention
C’est au programmeur de gérer la longueur du tableau
la taille des éléments du tableau (octets ou mots) Exercice
Écrire un programme qui calcule la somme des
Plan
1 Boucles et structures de contrôles
2 Adressage des opérandes
3 Adressages calculés et tableaux
4 Adressages indirects et pointeurs
5 Autres adressages
Adressage indirect
L’adresse de l’adresse
L’adresse effective de l’opérande est à l’adresse effective désignée par le spécificateur
Il y a donc deux accès mémoire.
opérande = mem[mem[spécificateur d’opérande]]
Exemple
LDA dataPtr,n ; A ← mem[mem[dataPtr]]
Exercices
Simuler l’adressage indirect avec l’adressage indexé Simuler l’adressage indexé avec l’adressage indirect
Pointeurs
On manipule une adresse
En assembleur, les pointeurs ne sont pas typés
En Pep/8
Les adresses sont sur un mot
Attention : pointeur en mémoire ou adressage indexé
Exercice
Écrire un programme qui épelle un mot en utilisant l’alphabet phonétique de l’OTAN
Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliet Kilo Lima Mike November Oscar Papa Romeo Quebec Sierra Tango Uniform Victor Whiskey X-ray Yankee Zulu
Adressages indirects multiples
L’adresse de l’adresse de l’adresse de...
On précise le nombre d’indirection
Un accès en mémoire par niveau d’indirection
Exemple
Pas d’indirection multiple en Pep/8
Exercice
Simuler une indirection triple en Pep/8 en utilisant que l’adressage immédiat et l’adressage indexé opérande = mem[mem[mem[mem[spécificateur]]]]
Même question en utilisant que des adressages
Plan
1 Boucles et structures de contrôles
2 Adressage des opérandes
3 Adressages calculés et tableaux
4 Adressages indirects et pointeurs
5 Autres adressages
Adressages sur la pile
Les choses sont sur la pile
Les adresses sont relatives au pointeur de pile (SP)
4 adressages de plus Direct sur la pile Indirect sur la pile Indexé sur la pile
Indirect indexé sur la pile Plus tard
Chapitre sur les sous programmes
Segmentation et Pagination
Mécanismes évolués Architectures modernes
Utilisés par les systèmes d’exploitation
Plus tard
Cours INF3172 Principes de systèmes d’exploitation Cours INF4170 Architecture des ordinateurs