Tour rapide d’un premier programme SPARC v9 Chapitre 4 Tour rapide d’un premier programme SPARC v9
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.
Analyse-Conception Données Entrées Sorties Intermédiaire 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
Les entrées/sorties On utilise les fonctions de C « printf » et « scanf » 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); Chaîne de caractères représentant le format d’écriture Nom de la fonction Données variables à afficher
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 %l2, %o2 ! On met la 2e valeur à afficher dans %o2 call printf ! On appelle la fonction printf de C nop ! On ne fait rien dans la fente de temporisation format: .asciz "Entrez un nombre : "
Les entrées/sorties On utilise les fonctions de C « printf » et « scanf » scanf(format, &data…) scanf("%u", &age); 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
Les entrées/sorties Utilisation en assembleur setx format, %l7, %o0 ! On met l’adresse du format dans %o0 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 "%u" x1: .skip 4
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
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
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 « ! »
Solution au problème .global Rectangle .section ".text" ! Section des instructions Rectangle: mov 2, %l0 ! Nombre de points à lire setx points, %l7, %l1 rec00: ptfmt1, %l7, %o0 ! Adresse de la chaîne à imprimer 3, %o1 ! Numéro du point = 3 - %l0 sub %o1, %l0, %o1 call printf ! Imprimer le message nop scfmt1, %l7, %o0 ! Adresse du format d’entrée %l1, %o1 ! Adresse de la coordonnée en X scanf ! Lire la coordonnée en X
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 nop scfmt1, %l7, %o0 ! Adresse du format d’entrée inc 4, %l1 ! On avance l’adresse au prochain mot %l1, %o1 ! Adresse de la coordonnée en Y scanf ! Lire la coordonnée en Y ! 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?
Pseudo-instructions Les pseudo-instructions servent à guider le compilateur Commencent toujours par le caractère « . » .section .global .skip
Pseudo-instructions .align 2, 4 ou 8 Alignement sur une frontière .skip 4*8 Réserve de l’espace Ici, 32 octets, soit de l’espace pour 4 mots étendus, 8 mots, 16 demi-mots 8*4 16*2 32 .ascii "suite de caractère" ! Doit se terminer par 0 si c’est une chaîne complète .asciz "chaîne de caractère" ! Est automatiquement terminée par un 0 .byte n Réserve un octet initialisé à la valeur « n » .half Réserve un demi-mot initialisé à la valeur « n » .word Réserve un mot initialisé à la valeur « n » .single Réserve un virgule flottante (mot) initialisé à la valeur « n » .double Réserve un virgule flottante (mot étendu) initialisé à la valeur « n »
Solution au problème .section ".bss" ! Section des données non initialisées .align 4 ! Aligné pour des mots points: .skip 4*4 ! X1, Y1, X2, Y2 ".rodata" ! Section des données en lecture seulement scfmt1: .asciz "%d" ptfmt1: "Entrez la coordonnée en X du point %u : " ptfmt2: "Entrez la coordonnée en Y du point %u : " ptfmt3: .ascii "Le périmètre du rectangle est : %u \n" "La surface du rectangle est : %u \n" ".data" ! Section des données en écriture
Solution au problème setx points, %l7, %l1 ldsw [%l1], %l2 ! Point 1 (X1, …) [%l1+4], %l3 ! Point 1 (…, Y1) [%l1+8], %l4 ! Point 2 (X2, …) [%l1+12], %l5 ! Point 2 (…, Y2) sub %l2, %l4, %l6 ! X1 – X2 %l3, %l5, %l7 ! Y1 – Y2 brgez %l6, rec05 nop neg %l6 ! |X1 – X2| rec05: %l7, rec10 %l7 ! |Y1 – Y2|
Solution au problème rec10: mulx %l6, %l7, %o2 ! Calcul de la surface add %l6, %l6, %l6 ! Deux fois la longueur %l7, %l7, %l7 ! Deux fois la hauteur %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 nop clr %o0 ! Le programme retourne 0 exit ! Arrêter le programme
Normes de programmation Utilisation des registres 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 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
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!