720 likes | 845 Views
SOUS-PROGRAMME. voir l'animation: Diaporama / Visualiser ... avancer : Barre d'espace reculer : p. TITRE. Un sous-programme ("subroutine" ou "subprogram") est une séquence d'instructions que l'on veut pouvoir utiliser plusieurs fois. DEFINITION.
E N D
SOUS-PROGRAMME voir l'animation: Diaporama / Visualiser ... avancer: Barre d'espace reculer: p TITRE
Un sous-programme ("subroutine" ou "subprogram") est une séquence d'instructions que l'on veut pouvoir utiliser plusieurs fois. DEFINITION
Signifie ici: "saute vers" "branche sur" Adresse de retour Adresse du sous-programme APPEL & RETOUR
Le saut au sous-programme ("Jump to SubRoutine") est souvent appelé Appel au sous-programme ("Call"). APPEL
Les fonctions-membre ou méthodes des objets des langages orientés objet (e.g. JAVA, C++, C#, Eiffel ...) sont implémentées par des sous-programmes. toto.boost() ; appelle le sous-programme "boost" de l'objet "toto". USAGE EN POO
Adresse de retour 1 Adresse de retour 2 Adresse du sous-programme Comment savoir où revenir ? - ou - APPELS CONSECUTIFS
Pour retourner à l'instruction suivantl'appel dans le programme principal, il faut avoir d'abord sauvegardé son adresse. Elle s'appelle "adresse de retour" ADRESSE DE RETOUR
Adresse de retour 1 Adresse de retour 2 Adresse du sous-programme Mémorisation retour : Adresse de retour 2 Adresse de retour 1 APPELS CONSECUTIFS
Sauvegarde de l'adresse de retour dans un registre ou une case mémoire fixe: Et si l'on appelle un sous-programme depuis le sous-programme ? SAUVEGARDE DE L'ADRESSE DE RETOUR
CE QUI DEVRAIT ARRIVER Adresse de retour 1 Adresse de retour 2 Adresse du sous-programme APPELS IMBRIQUES
CE QUI ARRIVE Adresse de retour 1 Adresse de retour 2 Adresse du sous-programme Mémorisation retour : Adresse de retour 2 Adresse de retour 1 IMBRICATION +MEMORISATION
On sauvegarde l'adresse de retour sur la pile. SAUVEGARDE DE L'ADRESSE DE RETOUR
Adresse de retour 1 Adresse de retour 2 Adresse du sous-programme Adresse de retour 2 L'adresse de retour est pointée Adresse de retour 1 IMBRICATION + PILE
Ceci permet des sous-programmes ré-entrants(qui s'appellent eux-mêmes) et donc récursifs ! Mais la pile est limitée ... Autre solution : liste chaînée (rare car pas adaptée ici: pas d'avantage, compliquée, volumineuse et moins rapide) RE-ENTRANCE et RECURSIVITE
Un appel à sous-programme : empile l'adresse de retour ; saute à la 1ère instruction du sous-programme . ACTIONS D'UN APPEL
Une instruction spéciale n'est pas nécessaire ! MPC R2 ; // charge le contenu du PC dans R2 // MPC = Move PC ADQ 2,R2 ;// ajout 2 à R2 STW R2, -(SP) ; // empile l'adresse de retour // -(SP) = mode d’@ basé prédecrémenté SP = Stack //Pointer JEA (R1) ; // saute au sous-prog. pointé par R1 PROGRAMME D'APPEL
Le saut au sous-programme est effectué par l'instruction: "Jump to SubRoutine" JSR INSTRUCTION JSR
L'opérande de l'instruction JSR est un sous-programme. L'adresse de cet opérande est donc l'adresse du sous-programme, c'est à dire l'adresse de sa 1ère instruction. OPERANDE DE JSR
JSR opérande MODES D'ADRESSAGE DE JSR
JSR: empile l'adresse de retour ; saute à l'instruction de l'opérande . ACTIONS DE JSR
AVANT Signifie ici: "pointe sur" "est l'adresse de" JSR (R1)
AVANT JSR (R1)
EMPILAGE ADRESSE DE RETOUR SP SP - 2 ; M[SP] adresse de retour; JSR (R1)
EMPILAGE ADRESSE DE RETOUR SP SP - 2 ; M[SP] PC; JSR (R1)
SAUT A LA 1ère INSTRUCTION IR M[adresse ss-prog] , PC adresse ss-prog # 2 ; JSR (R1)
SAUT A LA 1ère INSTRUCTION IR M[R1] , PC R1 # 2 ; JSR (R1)
APRES JSR (R1)
EXECUTION SOUS-PROGRAMME 1ère instruction
EXECUTION SOUS-PROGRAMME 2ème instruction
EXECUTION SOUS-PROGRAMME ... instruction
Le retour de sous-programme : dépile l'adresse de retour ; saute à l'instruction à cette adresse . ACTIONS DU RETOUR
Une instruction spéciale n'est pas nécessaire ! LDW R1,(SP)+ ; // dépile l'adresse de retour dans R1 // j’incrémente le SP JEA (R1) ; // saute à l'instruction de retour RETOUR DE SOUS-PROGRAMME
Le retour du sous-programme est effectué par l'instruction: ”ReTurn from Subroutine" RTS IINSTRUCTION RTS
RTS: dépile l'adresse de retour ; saute à l'instruction suivant JSR . ACTIONS DE RTS
AVANT Signifie ici: "pointe sur" "est l'adresse de" RTS
AVANT RTS
DEPILAGE ADRESSE DE RETOUR PC adresse de retour , SP SP # 2 ; RTS
DEPILAGE ADRESSE DE RETOUR PC M[SP] , SP SP # 2 ; RTS
PREPARATION INSTRUCTION SUIVANTE IR M[PC] , PC PC # 2 ; RTS
APRES suivante
APRES suivante
Dans les langages non-objet, le sous-programme est souvent à une adresse fixe connue à l'avance. JSR @SPRG_ADDRESS ;// appelle sprog d'adresse SPRG_ADDRESS APPEL à ADRESSE FIXE(mode direct)
AVANT Signifie ici: "pointe sur" "est l'adresse de" JSR @SPRG_ADDRESS
APRES JSR @SPRG_ADDRESS
Le mode direct n'est pas nécessaire ! LDW R2, #SPRG_ADDRESS ; // charge R2 avec SPRG_ADDRESS JSR (R2) ; // saute au sous-prog. pointé par R2 APPEL à ADRESSE FIXEsans mode direct !
Dans les langages à objet, l'adresse du sous-programme n'est connue qu'à l'exécution. Le codage des objets varie d'un langage et d'une implémentation à l'autre ! APPEL de METHODE
Le champ boost pointe sur le sous-programme R4 pointe sur l'objet +6 R4 + 6 pointe sur le champ boost de l'objet JSR *(R4)6 ; // appelle boost de l'objet pointé par R4 EXEMPLE SIMPLE D'APPEL DE METHODE(mode indirect pré-indexé)
Le mode indirect pré-indexé n'est pas nécessaire ! LDW R2, R4 ; // R2 pointe sur l'objet toto // charger R2 ac le contenu de R4 ADQ 6, R2 ; // R2 pointe sur le champ boost de toto LDW R2, (R2) ; // R2 pointe sur le sous-programme JSR (R2) ; // saute au sous-programme boost de toto EXEMPLE D'APPEL DE METHODEsans mode indirect pré-indexé !