★ CODING ★ HEBDOGICIEL ★ COURS D'ASSEMBLEUR - HEBDOGICIEL n°83 ★ |
La page pédagogique d'hebdogiciel 083: Generalite sur les Routines | Coding Hebdogiciel |
La page pédagogique d'hebdogiciel : Formation à l'assembleur GENERALITES SUR LES ROUTINES Lorsque vous écrivez un programme en Basic, vous avez sans doute pris l'habitude d'effectuer certains travaux répétitifs à l'aide de sous-programmes, que vous les appeliez par un Gosub ou par un Call. Cette bonne habitude, vous n'avez pas besoin de la perdre lorsque vous travaillez en assembleur, mais vous vous devrez de veiller à certains détails qui étaient automatiquement gérés par le Basic. Reprenons à la base nos connaissances de programmation et tentons d'y voir plus clair quant à la gestion des sous-programmes. Imaginons la structure de programme suivante : Programme Sous-programme a
Sous-programme b
A chaque fois que la linéarité du déroulement du programme se brise, deux possibilités s'offrent au micro-processeur :
Lors de l'étape 2 du programme ci-dessus, nous appelons un sous-programme. Lorsque la routine a est exécutée, nous devons revenir à l'endroit suivant immédiatement celui où a eu lieu l'appel à la routine a. Ce qui signifie en clair que nous devons, à chaque appel à une routine, mémoriser dans un endroit précis de la mémoire les adresses de retour de sous-programme. Dans l'exemple que j'ai donné ci-dessus, vous avez pu voir qu'au sein de la routine a. on trouve un appel à la routine b . Nous allons donc avoir deux adresses de retour à stocker et à ne pas mélanger. Autrefois, on utilisait un registre de seize bits pour stocker une adresse de retour, ce qui signifiait qu'il était impossible de réaliser un appel de routine à partir d'un sous-programme sans partir dans des complications infernales Aujourd'hui, le micro-processeur utilise une pile système de type FILO (First In Last Out. ou premier rentré dernier sorti) dans laquelle il entasse les adresses de retour comme des assiettes dans le buffet de la salle à manger. Lorsque le sous-programme sort de la routine b, il retrouve sans peine l'endroit d'où venait l'appel et redémarre donc à l'étape 4 du sous-programme a. Une fois celui-ci arrivé à son terme, le micro-processeur prend l'adresse de retour dans la pile système et revient à l'étape 3 du programme principal. Vous voyez donc que I assembleur n'est pas aussi limite qu'il en a l'air , mais les routines que vous créez sont maigre tout limitées par un certain nombre de critères et de règles, fort simples à assimiler d'ailleurs Première règle fondamentale et totalement inviolable : une routine ne peut et ne doit pas s appeler elle-même Pourquoi ? Tout s'explique, mais rien ne parle autant à l'imagination qu'un bon exemple. Ecrivez donc, à laide de votre programme dassemblage préféré, un programme du type suivant : Programme 10 Aller a la routine a Routine a 100 Afficher coucou Que va-t-il se passer ? Le micro-processeur va lire la première instruction C'est un appel à une routine II stocke donc dans sa pile syteme l adresse 20 (qui correspond effectivement à l'endroit ou il devra revenir une fois la routine exécutée). Il arrive donc dans la routine, il affiche coucou et tombe ensuite sur un appel de routine II mémorise l'adresse de retour (en l'occurence 120) en la stockant dans sa pile système au-dessus de la précédente (20) et part exécuter la routine. Il arrive donc dans la routine, il affiche coucou et il tombe ensuite sur un appel de routine II mémorise l'adresse de retour
Comme vous vous en êtes inévitablement rendu compte, le micro-processeur ne pourra jamais atteindre l'instruction de retour. Il continuera donc a empiler soigneusement les adresses de retour successives. |us-qu'a un certain point. C'est ce point que nous allons déterminer, qui nous donnera par la même occasion une autre limitation concernant l'usage des routines. En théorie, la seule limitation que peut connaître le microprocesseur dans l'exécution de ce programme se situe au niveau de la dimension de sa pile système. En effet, si la pile système a été conçue pour recevoir N adresses de retour, lorsque le micro-processeur fera appel pour la N + 1 eme fois à la routine a. il n'aura plus la place de stocker l'adresse de retour. C'est à ce stade du raisonnement que la pratique distingue deux possibilités de résoudre le problème. Suivant l'époque de conception du micro-ordinateur (et en fonction du micro-processeur qu'il a dans les entrailles). la solution apportée sera plus ou moins catastrophique pour le programmeur. a. Méthode antique : le microprocesseur ignorait le fait qu'il dépassait la capacité de sa pile, et il continuait a empiler des valeurs |usqu au remplissage total de la mémoire, ou jusqu au moment ou il touchait a une partie de la mémoire utile pour l'exécution du programme Le programmeur devait donc éviter a tout prix des erreurs de ce genre. car il devait a ce moment-la éteindre le micro pour reprendre son travail et il avait par la même occasion perdu tout ce qu'il avait realise jusqu'à ce moment. b. Méthode actuelle : cette solution n'est malheureusement pas encore systématiquement implantée sur les petits systèmes informatiques tels que les micro-ordinateurs familiaux En voici le principe des que Ion parle de pile, on sous-entend l'existence d'un pointeur de pile Ce pointeur contient l'adresse de la première case vide dans la pile . Lorsque l'on range une valeur dans la pile, ce pointeur est incremente. et lorsque I'on retire une valeur de la pile ce pointeur est décrémente Dans le cas qui nous préoccupe lorsque le pointeur atteint une valeur limite correspondant au sommet de la pile, le micro-processeur gère automatiquement ce sur-remplissage de la pile en rendant la main a l'utilisateur et en signalant a celui-ci un dépassement de la capacité de la pile.
|