SOUS-PROGRAMMES Fonction Introduction
Fonction Créer des sous-programmes
Fonction Sous-programmes vs macros
Fonction Exemple concret
Fonction Index des sous-programmes

Page précédente



 

Monter Descendre Retour Introduction
puce Cette partie explique non seulement comment créer des sous-programmes, tout en mettant l'accent sur leur points faibles et points forts par rapport aux macros. Ils sont facile à réaliser et je vous conseille fortement de les utiliser.

puce Pour finir il y a l'index des sous-programmes disponibles dans le dossier 92files, je les ai écrit pour vous faciliter la tâche lors de vos premiers programmes. Si vous les utilisez, merci de ne pas enlever l'en tête dans vos programmes sources.





 

Monter Descendre Retour Créer des sous-programmes
puce Dans un programme, vous avez sûrement constaté qu'il faut parfois écrire quelques lignes de code identiques.
En plus d'augmenter considérablement le programme source (.asm) il est fastidieux de faire un travail aussi répétitif.

puce Nous allons donc écrire une fois les lignes qui nous intéresse et par la suite nous appellerons notre sous-programme avec le mnémonique BSR autant de fois que nécessaire.
Vous pouvez faire un sous-programme avec des paramètre en utilisant la pile, mais sachez que le plus facile est de faire une macro.

puce A chaque appel du sous-programme dans notre programme, nous sauterons vers celui-ci. Par conséquent, quel que soit le nombre d'appels la taille du programme final ne changera pratiquement pas.

puce Pour définir un sous-programme c'est simple, vous devez le faire commencer par un label.
Ensuite vous tapez les instructions.
Enfin vous devez terminer votre sous-programme avec le mnémonique RTS.

puce En conclusion, un sous-programme en plus de nous éviter de taper du code vraiment inutilement, nous permet de gagner un gain de place pouvant devenir très important.





 

Monter Descendre Retour Sous-programmes vs macros
AVANTAGE : la taille
puce La rapidité d'un sous programme est inférieure à celle d'une macro car nous effectuons un saut vers celui-ci puis nous en effectuons un autre pour revenir ou n'en étions.
puce Une macro est 'simplement' du code recopié avec des paramètres, donc c'est directement l'instruction suivante qui est executée.

DESAVANTAGE : la vitesse
puce Comme je vous l'ai déjà fait remarqué, l'appel à une macro est remplacé par le contenu de celle-ci, par conséquent vous ne réduisez pas la taille de votre programme final (.92p).
puce L'énorme point fort des sous-programmes, c'est de nous faire gagner la place.
puce Si votre but principal était d'utiliser d'une manière simple des paramètres, tournez vous vers l'élaboration de macros.

CAS PARTICULIER : aucun paramètre
puce Paramètre ne veut pas forcément dire macro, en effet nous pouvons nous servir de la pile pour transmettre des paramètres.
Attention toutefois, vous devrez être très scrupuleux lors de l'utilisation de celle-ci car elle est aussi utilisée lors du saut vers le sous-programme pour contenir l'adresse du retour. En cas d'erreur vous avez toutes les chances pour assister à un plantage (ILLEGAL INSTRUCTION, ADDRESS ERROR).

puce Avant de sauter à votre sous-programme, vous pouvez enregistrer sur la pile des paramètres avec le mode d'adressage -(An), ici avec le registre A7.

puce Ensuite vous sautez à votre sous programme, là l'instruction BSR dépose sur la pile l'adresse du retour, il faut absolument la désempiler pour la sauvegarder quelques part (pourquoi pas dans une variable).
Maintenant que le pointeur de pile pointe sur le dernier paramètres que nous avons rentré, vous devez sortir tous les paramètres dans l'ordre inverse comme il est de coutume, encore une fois soyez attentionné sur la taille et le nombre de valeurs que vous déposez et sortez de la pile, tout ce qui a été déposé devra être sorti !

puce Enfin, il vous faut absolument déposer sur la pile l'adresse de retour sauvegardée précédemment pour retournez à votre programme avec le mnémonique RTS.





 

Monter Descendre Retour Exemple concret
puce Prenons l'exemple de la fonction DrawStrXY de la bibliothèque TIOS, voici un exemple de ce qu'il faudrait écrire à chaque fois:

MOVE.w #4,-(a7) ; dépose la couleur
PEA hello(pc) ; dépose l'adresse de la chaîne à afficher
MOVE.w #2,-(a7) ; dépose l'ordonné
MOVE.w #2,-(a7) ; dépose l'abscisse
JSR tios::DrawStrXY ; lance la fonction
LEA 10(a7),a7 ; restaure la pile de 2+4+2+2=10 octets

; ***** dans les données *****
hello "Bonjour !",0 ; une chaîne quelconque terminée par un caractère nul

puce Et si nous devions afficher 20 fois cette chaînes ou plusieurs autres dans un programme ?

SOLUTION SANS PARAMÈTRES
puce Ecrire les lignes précedentes dans un sous-programme pour y accéder autant de fois que nécéssaire.

puce Attention, vous devez respecter scrupuleusement la casse (majuscules et minuscules) du nom des sous-programmes comme vous le faites avec les bibliothèques.

PROGRAMMATION SANS PARAMÈTRES
; ***** le sous-programme *****
WriteStr : ; nom du sous-programme
move.w #4,-(a7) ; dépose le premier paramètre (couleur)
pea hello(pc) ; dépose le deuxième paramètre (adresse de la chaîne à afficher)
move.w #20,-(a7) ; dépose le troisième paramètre (ordonné)
move.w #10,-(a7) ; dépose le quatrième paramètre (abscisse)
jsr tios::DrawStrXY ; lance la fonction
lea 10(a7),a7 ; restaure la pile de 2+4+2+2=10 octets
RTS ; mnémonique marquant le retour au programme

; ***** puis dans le programme *****
BSR WriteStr ;saute vers notre sous-programme

; ***** dans les données *****
hello "Bonjour !",0 ; une chaîne quelconque terminée par un caractère nul

SOLUTION AVEC PARAMÈTRES
puce Ecrire seulement les instructions qui utilisent les paramètres dans le sous-programme, et déposer les paramètres dans le programme avant l'appel au sous-programme.

puce Attention, vous devez respecter scrupuleusement la casse (majuscules et minuscules) du nom des sous-programmes comme vous le faites avec les bibliothèques.

PROGRAMMATION AVEC PARAMÈTRES
; ***** le sous-programme *****
WriteStr : ; nom du sous-programme
jsr tios::DrawStrXY ; lance la fonction
lea 10(a7),a7 ; restaure la pile de 2+4+2+2=10 octets
RTS ; mnémonique marquant le retour au programme

; ***** puis dans le programme *****
move.w #4,-(a7) ; dépose le premier paramètre (couleur)
pea coucou(pc) ; dépose le deuxième paramètre (adresse de la chaîne à afficher)
move.w #15,-(a7) ; dépose le troisième paramètre (ordonné)
move.w #5,-(a7) ; dépose le quatrième paramètre (abscisse)
BSR WriteStr ; saute vers notre sous-programme

move.w #4,-(a7) ; dépose le premier paramètre (ordonnée)
pea hello(pc) ; dépose le deuxième paramètre ()
move.w #0,-(a7) ; dépose le troisième paramètre (adresse de la chaîne à afficher)
move.w #0,-(a7) ; dépose le quatrième paramètre (couleur)
BSR WriteStr ; saute vers notre sous-programme

; ***** dans les données *****
hello "Bonjour !",0 ; une chaîne quelconque terminée par un caractère nul
coucou "Vive l''assembleur",0 ; attention il faut mettre deux apostrophe consécutives





 

Monter Retour Index des sous-programmes




 

 

Lisez la section sur les droits d'auteur et la license d'utilisation avant de distribuer Zguide.

Zguide © 1998, Florian DREVET. Tous droits réservés à l'échelle mondiale