Chapitre 4

publicité
1
CHAPITRE 4
Tour rapide d’un premier programme SPARC v9
2
Problème
Dans le plan cartésien, trouver le périmètre et la surface d’un
rectangle connu par l’intermédiaire des coordonnées de
deux de ses sommets diamétralement opposés. Les côtés
du rectangle sont parallèles aux axes.
3
Analyse-Conception
• Données
• Entrées
• X1 : abscisse du 1er sommet
• Y1 : ordonnée du 1er sommet
• X2 : abscisse du 2e sommet
• Y2 : ordonnée du 2e sommet
• Sorties
• Périmètre = 2 × (𝐵𝑎𝑠𝑒 + 𝐻𝑎𝑢𝑡𝑒𝑢𝑟)
• Surface = 𝐵𝑎𝑠𝑒 × 𝐻𝑎𝑢𝑡𝑒𝑢𝑟
• Intermédiaire
• 𝐵𝑎𝑠𝑒 = 𝑋2 − 𝑋1
• 𝐻𝑎𝑢𝑡𝑒𝑢𝑟 = 𝑌2 − 𝑌1
4
Les entrées/sorties
• On utilise les fonctions de C « printf » et « scanf »
Chaîne de caractères représentant le format d’écriture
Nom de la fonction
Données variables à afficher
printf(format, data…)
printf("Allo le monde");
printf("Allo, mon nom est %s", nom);
printf("Allo, mon nom est %s et mon âge est %u", nom, age);
5
Les entrées/sorties
• Utilisation en assembleur
setx
format, %l7, %o0
! On met l’adresse du format dans %o0
mov
%l1, %o1
! On met la première valeur à afficher dans %o1
mov
%l2, %o2
! On met la 2e valeur à afficher dans %o2
call
printf
! On appelle la fonction printf de C
nop
format:
! On ne fait rien dans la fente de temporisation
.asciz
"Entrez un nombre : "
6
Les entrées/sorties
• On utilise les fonctions de C « printf » et « scanf »
Chaîne de caractères représentant le format de la donnée à lire
Nom de la fonction
Adresse où aller écrire les données lues
scanf(format, &data…)
scanf("%u", &age);
7
Les entrées/sorties
• Utilisation en assembleur
setx
format, %l7, %o0
! On met l’adresse du format dans %o0
setx
x1, %l7, %o1
! On met l’adresse de la « variable » dans %o1
call
scanf
! On appelle la fonction scanf de C
nop
! On ne fait rien dans la fente de
temporisation
format:
.asciz
x1:
.skip 4
"%u"
8
Les entrées/sorties
• Les formats sont les mêmes pour la lecture et l’écriture
Lecture
Format
Écriture
Caractère  Code Ascii
%c
Code Ascii  Caractère
Chaîne  Suite de codes Ascii
%s
Suite de codes Ascii  Chaîne
Entier décimal  Binaire
%d
Binaire  Entier décimal
Entier non signé décimal  Binaire
%u
Binaire  Entier non signé décimal
Entier octal  Binaire
%o
Binaire  Entier octal
Entier hexadécimal  Binaire
%x
Binaire  Entier hexadécimal
Virgule flottante  Binaire
%f
Binaire  Virgule flottante
9
Section du code
• Il y a plusieurs sections dans un programme SPARC
• « .text »
• Pour les instructions, en lecture seulement
• « .rodata »
• Pour les données en lecture, donc toutes les constantes
• « .data »
• Pour les données initialisées
• « .bss »
• Pour les données non initialisées, donc les variables
10
Les commentaires
• Pour les commentaires sur plusieurs lignes
• Comme en C/C++/Java/C#
/* Ici débute un commentaire
sur plusieurs lignes */
• Le délimiteur de commentaire pour une ligne
• Le caractère « ! »
11
Solution au problème
.global
Rectangle
.section
".text"
! Section des instructions
mov
2, %l0
! Nombre de points à lire
setx
points, %l7, %l1
setx
ptfmt1, %l7, %o0
! Adresse de la chaîne à imprimer
mov
3, %o1
! Numéro du point = 3 - %l0
sub
%o1, %l0, %o1
call
printf
! Imprimer le message
setx
scfmt1, %l7, %o0
! Adresse du format d’entrée
mov
%l1, %o1
! Adresse de la coordonnée en X
call
scanf
! Lire la coordonnée en X
Rectangle:
rec00:
nop
nop
12
Solution au problème
setx
ptfmt2, %l7, %o0
! Adresse de la chaîne à imprimer
mov
3, %o1
! Numéro du point = 3 - %l0
sub
%o1, %l0, %o1
call
printf
! Imprimer le message
setx
scfmt1, %l7, %o0
! Adresse du format d’entrée
inc
4, %l1
! On avance l’adresse au prochain mot
mov
%l1, %o1
! Adresse de la coordonnée en Y
call
scanf
! Lire la coordonnée en Y
inc
4, %l1
! Avance l’adresse au prochain mot
dec
%l0
! On a lu un point
brnz
%l0, rec00
! Est-ce qu’il y a un autre point?
nop
nop
nop
13
Pseudo-instructions
• Les pseudo-instructions servent à guider le compilateur
• Commencent toujours par le caractère « . »
• .section
• .global
• .skip
14
Pseudo-instructions
.align
2, 4 ou 8
Alignement sur une frontière
.skip
4*8
.skip
8*4
.skip
16*2
.skip
32
.ascii
"suite de caractère"
.asciz
"chaîne de caractère" ! Est automatiquement terminée par un 0
.byte
n
Réserve un octet initialisé à la valeur « n »
.half
n
Réserve un demi-mot initialisé à la valeur « n »
.word
n
Réserve un mot initialisé à la valeur « n »
.single
n
Réserve un virgule flottante (mot) initialisé à la valeur « n »
.double
n
Réserve un virgule flottante (mot étendu) initialisé à la
valeur « n »
Réserve de l’espace
Ici, 32 octets, soit de l’espace pour 4 mots étendus, 8 mots,
16 demi-mots
! Doit se terminer par 0 si c’est une chaîne complète
15
Solution au problème
.section
".bss"
! Section des données non initialisées
.align
4
! Aligné pour des mots
.skip
4*4
! X1, Y1, X2, Y2
.section
".rodata"
! Section des données en lecture seulement
scfmt1:
.asciz
"%d"
ptfmt1:
.asciz
"Entrez la coordonnée en X du point %u : "
ptfmt2:
.asciz
"Entrez la coordonnée en Y du point %u : "
ptfmt3:
.ascii
"Le périmètre du rectangle est : %u \n"
points:
"La surface du rectangle est : %u \n"
.section
".data"
! Section des données en écriture
16
Solution au problème
setx
points, %l7, %l1
ldsw
[%l1], %l2
! Point 1 (X1, …)
ldsw
[%l1+4], %l3
! Point 1 (…, Y1)
ldsw
[%l1+8], %l4
! Point 2 (X2, …)
ldsw
[%l1+12], %l5
! Point 2 (…, Y2)
sub
%l2, %l4, %l6
! X1 – X2
sub
%l3, %l5, %l7
! Y1 – Y2
brgez
%l6, rec05
nop
neg
%l6
brgez
%l7, rec10
! |X1 – X2|
rec05:
nop
neg
%l7
! |Y1 – Y2|
17
Solution au problème
rec10:
mulx
%l6, %l7, %o2
! Calcul de la surface
add
%l6, %l6, %l6
! Deux fois la longueur
add
%l7, %l7, %l7
! Deux fois la hauteur
add
%l6, %l7, %o1
! Calcul du périmètre
setx
ptfmt3, %l7, %o0
! Adresse de la chaîne de réponse
call
printf
! Imprimer les résultats
clr
%o0
! Le programme retourne 0
call
exit
! Arrêter le programme
nop
nop
18
Normes de programmation
• Utilisation des registres
Globaux
À éviter le plus possible
Locaux
Aucune limitation, utilisation intensive
Output
Limité, ne pas utiliser o6 et o7
Input
Dans un sous-programme, détruit les registres O du programme appelant. À
n’utiliser que pour les paramètres et les valeurs de retour
• Une ligne est divisée en 4 colonnes
• Étiquette | Mnémonique | Opérandes | Commentaires
• Les colonnes sont alignées
• Une seule instruction par ligne
• Une ligne blanche entre les groupes d’instructions
19
Normes de programmation
• Une étiquette
• Est seule sur sa ligne pour les instructions
• Sur la même ligne que la pseudo-instruction pour les données.
• C’est une suite de caractères qui se termine par « : »
• À un nom significatif pour les données
• Commence par les 3 ou 4 premières lettres du point d’entrée, suivi
de chiffres
• Les chiffres vont toujours en ordre croissant d’une étiquette à l’autre
• Aide à voir l’ordre d’exécution du programme
• Le plus de commentaires possible après les instructions!
Téléchargement