1 CHAPITRE 7 Les instructions de contrôle 2 La programmation structurée • Les programmes sont composés de trois structures de contrôles • L’itération • La sélection • La séquence • Dans les langages évolués • For, while, loop, etc. • If, swicth, etc. • Suite normale d’instructions • En assembleur, il faut les simuler • À l’aide des branchements 3 La programmation modulaire • On divise le problème en différents modules • Chaque module • Implémente une seule fonction • A un seul point d’entrée et un seul point de sortie • A une petite taille • Est conçu pour être codé et tester séparément • En assembleur, l’implémentation d’un module est réalisée à l’aide de sous-programmes. 4 Les structures de contrôles • La séquence 𝑖𝑛𝑠𝑡1 𝑖𝑛𝑠𝑡2 ⋮ 𝑖𝑛𝑠𝑡𝑚 mov %l0, %l1 add %l1, %l1, %l1 mulx %l1, %l0, %l0 setx num, %l7, %l1 Suite d’instructions 5 Les structures de contrôles • La condition si condition 𝑖𝑛𝑠𝑡1 ⋮ 𝑖𝑛𝑠𝑡𝑚 sinon 𝑖𝑛𝑠𝑡𝑚+1 ⋮ 𝑖𝑛𝑠𝑡𝑛 cmp %l0, %l1 bne Sinon nop Branchement sous condition add %l0, %l0, %l2 ba Apres nop Sinon: sub %l0, %l1, %l2 Apres: … Branchement inconditionnel 6 Les structures de contrôles • L’itération Debut: mov %l0, %l1 répéter add %l0, %l0, %l2 𝑖𝑛𝑠𝑡1 ⋮ 𝑖𝑛𝑠𝑡𝑚 jusqu’à condition inc 4, %l3 mulx %l2, %l3, %l4 cmp %l4, %l5 bne Debut nop … Branchement sous condition 7 Les structures de contrôles • Les conditions sur l’itération et la sélection sont des expressions booléennes • On les calcule à l’aide • D’opérations arithmétiques • D’opérations logiques • Ces opérations positionnent les codes de condition du registre CCR • Les codes de condition sont consultés par les branchements 8 Les branchements • Un branchement s’applique à la dernière instruction qui modifie les codes de condition • Si la condition est vraie • Le branchement s’exécute • L’instruction à exécuter après celle dans la fente de temporisation est • Celle de l’adresse de l’étiquette du branchement • Sinon • L’exécution se poursuit en séquence 9 Les branchements • Un branchement s’applique à la dernière instruction qui modifie les codes de condition • addcc • subcc • … • cmp • tst 10 Les branchements • Les conditions « simples » Instructions Signification Condition ba Branch Always vrai inconditionnel bn Branch Never faux jamais bnz Branch Not Zero ¬𝑍 ≠0 bne Branch Not Equal ¬𝑍 𝐴≠𝐵 be Branch Equal 𝑍 𝐴=𝐵 bz Branch Zero 𝑍 =0 bcc Branch Carry Clear bcs Branch Carry Set bvc Branch oVerflow Clear bvs Branch oVerflow Set bpos Branch POSitive ¬𝑁 ≥0 bneg Branch NEGative 𝑁 <0 ¬𝐶 𝐶 ¬𝑉 𝑉 Si pas de report Si report Si pas de débordement Si débordement 11 Les branchements • Suite à des instructions arithmétiques signées Instructions Signification bg Branch Greater bge Branch Greater or Equal bl Branch Less ble Branch Less or Equal Condition ¬(𝑍 ∨ 𝑁 ⊕ 𝑉 ) 𝐴>𝐵 ¬(𝑁 ⊕ 𝑉) 𝐴≥𝐵 𝑁⊕𝑉 𝐴<𝐵 𝑍 ∨ (𝑁 ⊕ 𝑉) 𝐴≤𝐵 • Suite à des instructions arithmétiques non signées • Unsigned Instructions Signification bgu Branch Greater bgeu Branch Greater or Equal blu Branch Less bleu Branch Less or Equal Condition ¬(𝐶 ∨ 𝑍) 𝐴>𝐵 ¬𝐶 𝐴≥𝐵 𝐶 𝐴<𝐵 𝐶∨𝑍 𝐴≤𝐵 12 Les branchements • Explication des conditions ble Branch Less or Equal 𝑍 ∨ (𝑁 ⊕ 𝑉) 𝐴≤𝐵 • 𝐴≤𝐵 ⇒𝐴−𝐵 ≤0 • Si 𝐴 − 𝐵 = 0 → 𝑍 = 1 ⇒ 𝑍 ∨ 𝑁 ⊕ 𝑉 = 1 • Sinon, un débordement est possible • Si V = 0 • Si 𝑁 = 1 alors 𝐴 − 𝐵 < 0, 𝐴 < 𝐵 → 𝑍 ∨ 𝑁 ⊕ 𝑉 = 1 • Si 𝑁 = 0 alors 𝐴 − 𝐵 > 0, 𝐴 > 𝐵 → 𝑍 ∨ 𝑁 ⊕ 𝑉 = 0 • Si 𝑉 = 1 • Si 𝑁 = 1 alors 𝐴 − 𝐵 < 0, 𝐴 > 0 et 𝐵 < 0 → 𝐴 > 𝐵 → 𝑍 ∨ 𝑁 ⊕ 𝑉 = 0 • Si 𝑁 = 0 alors 𝐴 − 𝐵 > 0, 𝐴 < 0 et 𝐵 > 0 → 𝐴 < 𝐵 → 𝑍 ∨ 𝑁 ⊕ 𝑉 = 1 13 Les branchements • Explication des conditions bgu Branch Greater Unsigned ¬(𝐶 ∨ 𝑍) 𝐴>𝐵 • ¬ 𝐶 ∨ 𝑍 = ¬𝐶 ∧ ¬𝑍 → 𝐶 = 0 et 𝑍 = 0 • 𝐴 > 𝐵 → 𝐴 − 𝐵 s’effectue sans emprunt (𝐶 = 0) • 𝐴>𝐵 →𝐴≠𝐵 → 𝐴−𝐵 ≠0→𝑍 =0 14 Les branchements • La forme générale d’un branchement est bXXXX,a, pt cc, etiquette • Si le « a » (annulation) est présent • Sur un branchement inconditionnel • L’instruction dans la fente de temporisation est toujours annulée • Sur un branchement conditionnel • Si le branchement s’effectue • L’instruction dans la fente de temporisation est exécutée • Si le branchement ne s’effectue pas • L’instruction dans la fente de temporisation ne s’exécute pas • Le « a » est optionnel • Doit être utilisé avec précaution! 15 Les branchements • La forme générale d’un branchement est bXXXX,a, p cc, etiquette • Le paramètre « p » peut prendre deux valeurs • pt : Prédit que le branchement a lieu • pn : Prédit que le branchement n’aura pas lieu • On laisse le compilateur s’occuper de ce paramètre • Par défaut, vaut pt • Le paramètre « cc » indique quels codes de condition utiliser • icc : Entiers sur 32 bits • xcc : Entiers sur 64 bits 16 Les branchements • 𝑐 = max 𝑎, 𝑏 | 𝑎 → %𝑙1, 𝑏 → %𝑙2, 𝑐 → %𝑙3 cmp %l1, %l2 ! Comparaison de %l1 et %l2 bg,a etiq ! Si %l1 > %l2 ? mov %l1, %l3 ! Exécutée si A > B C = A mov %l2, %l3 ! Exécutée si A <= B C = B cmp %l1, %l2 ! Comparaison de %l1 et %l2 bg etiq ! Si %l1 > %l2 ? mov %l1, %l3 ! C = A mov %l2, %l3 ! C = B etiq: etiq: 17 Adresse éloignée • Sur le SPARC, un branchement ne peut contenir qu’un déplacement de 22 bits • Si l’adresse cible est trop loin, on doit utiliser une alternative • Saut inconditionnel, avec registre • jmp %l0 • Instruction synthétique qui dérive de • jmpl %l0, %g0 • JuMP and Link est aussi utilisé pour les appels de sous programme 18 Adresse éloignée • L’adresse contenue dans le registre doit • Être un multiple de 4 Une instruction fait 4 octets de long! • La valeur du PC est conservée dans le registre de destination • Supporte le mode indexé • jmp %l0 + %l1 19 Sous-programmes • Suites d’instructions exécutables à partir de n’importe quel point d’un programme • Si le sous-programme s’appelle lui-même, on dit qu’il est récursif • Comporte trois parties • Sauvegarde des données critiques du programme appelant • Traitement • Rétablissement de l’état du programme appelant et retour 20 Sous-programmes • Aspects à considérer pour écrire un sous-programme • Appel et retour • Passage des paramètres d’entrée/sortie et valeur de retour • Sauvegarde et rétablissement des registres de l’appelant 21 Appel et retour • L’appel est réalisé à l’aide d’un branchement à l’adresse du sous-programme • On doit cependant conserver l’adresse de retour • C’est le lien entre un appelant et un appelé setx spgm, %l7, %l0 jmpl %l0, %o7 %o7 = PC setx spgm, %l7, %l0 jmpl %l0, %o7 nop nop … … spgm: … jmp nop %o7+8 spgm: … jmp nop %o7+8 22 Appel et retour • On utilise jmpl seulement si on ne connait pas l’adresse à la compilation, ce qui est rare • On utilise call pour l’appel • On utilise retl pour le retour call %o7 = PC spgm … nop call spgm … nop spgm: … … retl nop spgm: … retl nop 23 Passage des paramètres • Il y a trois façons de passer des paramètres • Par adresse • Le paramètre reçu est l’adresse d’une valeur. Le sous-programme peut donc la modifier comme il veut. • Par référence • Même principe que pour l’adresse. En assembleur, il n’y a pas de différence • Par valeur • Le sous-programme reçoit directement une copie de la valeur. Si le sous- programme la modifie, la modification n’est pas répercutée sur la valeur dans le programme appelant. 24 Passage des paramètres • En SPARC, on utilise les registres O • %o0, %o1, %o2, %o3, %o4, %o5 • %o6 et %o7 sont réservés • Si on a plus que cinq paramètres, on utilise une pile • Vu dans le chapitre 10. • La valeur de retour d’un sous-programme est habituellement récupérée dans le registre %o0 • Le sous-programme la retourne donc dans son registre %i0 • Fenêtre de registre! 25 Fenêtre de registres • En SPARC, les registres sont des ressources partageables • Le sous-programme doit les sauvegarder avant de les utiliser • Le sous-programme doit rétablir les registres avant de terminer 26 Fenêtre de registres • L’instruction save alloue une nouvelle fenêtre de registre • La sauvegarde s’effectue dans la pile • On doit réserver assez d’espace pour sauvegarder tous les registres • Il est commun de réserver 208 octets sur la pile save %sp, -208, %sp • Le sommet de la pile évolue vers les adresses inférieures (-208) 27 Fenêtre de registres • Le changement de fenêtres fait en sorte que • Les registres de sortie de l’appelant deviennent les registres d’entrée du sous-programme • %o0 à %o7 %i0 à %i7 • %sp (%o7) %fp (%i7) • Le retour des résultats se fait donc dans les registres %i0 à %i5 28 Fenêtre de registres • L’instruction restore rétablit l’ancienne fenêtre de registres restore • L’utilisation d’une fenêtre de registre empêche un sous- programme d’utiliser l’instruction retl • Le registre %o7 est devenu %i7! • On utilise l’instruction synthétique ret • Équivalent à jmp %i7+8 • ret avec fenêtre de registres; retl sans fenêtre de registres 29 Fenêtre de registres … call … spgm call nop nop … … spgm: spgm: save %sp, -208, %sp … … retl ret nop restore spgm 30 Récursivité • Un sous-programme est récursif s’il s’appelle lui-même en cours d’exécution • Le concept de fenêtre facilite l’écriture de programme récursif • Les données du sous-programme sont dans les registres locaux • Comment afficher les données d’un tableau en ordre inverse, sans boucle? 31 Récursivité • Afficher du dernier au premier les éléments d’un tableau, sans boucle • %i0 contient l’adresse du tableau • %i1 contient le nombre d’éléments du tableau • %i2 contient l’indice courant dans le tableau 32 Récursivité Affiche: Affiche10: save %sp, -208, %sp ! Fenêtre de registres add %i2, 4, %o2 ! On est un élément plus loin cmp %o2, %i1 ! Est-ce qu’on est au dernier? bge Affiche10 ! Si oui, on va afficher la valeur sllx %o2, 2, %l0 ! On prépare l’index (id X 4) mov %i0, %o0 ! Sinon, on se réappelle call Affiche mov %i1, %o1 ! Avec les bon paramètre setx ptfmt1, %l7, %o0 ! L’adresse du format lduw [%i0+%l0], %o1 ! La valeur de la case courante call printf ! On l’affiche nop ! … ret ! Retourne à l’appelant restore ! Restauration des registres