CODINGHEBDOGICIEL ★ COURS D'ASSEMBLEUR - HEBDOGICIEL n°83 ★

La page pédagogique d'hebdogiciel 083: Generalite sur les RoutinesCoding 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
1.  PAS 1
2.     ALLER AU SOUS-PROGRAMME a
3.  AFFICHER LES RESULTATS
4.  FIN

Sous-programme a

  1. PAS 1
  2. PAS 2
  3.     ALLER AU SOUS-PROGRAMME b
  4. PAS 3
  5. RETOUR

Sous-programme b

  1. PAS 1
  2. PAS 2
  3. RETOUR

A chaque fois que la linéarité du déroulement du programme se brise, deux possibilités s'offrent au micro-processeur :

  • a.  il s'agit d'un saut inconditionnel et le PC (ou compteur ordinal) s'occupe de la nouvelle adresse, sans autre.
  • b.  il s'agit d'un appel à un sous-programme et l'adresse à partir de laquelle l'appel a eu lieu doit être mémorisée.

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
20 Afficher les résultats
30 Fin

Routine a

100 Afficher coucou
110 Aller à la routine a
120 Retour

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
Illustrons par un schéma relativement simple le travail exécute par le micro-processeur lors de l'exécution de ce programme


Boucle infernale

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.

HEBDOGICIEL n°83

★ LICENCE: COMMERCIALE
★ ANNÉES: 1985
★ AUTEUR(S): ???

Page précédente : La page pédagogique d'hebdogiciel 082: Generalite sur les Routines

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 134 millisecondes et consultée 629 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.