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!