En langage assembleur, on appelle procédure un sous-programme qui permet d'effectuer 
un ensemble d'instructions par simple appel de la procédure. Cette notion de sous-programme 
est généralement appelée fonction dans d'autres langages. Les fonctions et les 
procédures permettent d'exécuter dans plusieurs parties du programme une série d'instructions, 
cela permet une simplicité du code et donc une taille de programme minimale. D'autre part, une procédure 
peut faire appel à elle-même, on parle alors de procédure récursive (il ne faut pas 
oublier de mettre une condition de sortie au risque sinon de ne pas pouvoir arrêter le programme...).
 
 
Etant donné qu'une procédure est une suite d'instructions, il s'agit de regrouper 
les instructions composant la procédure entre des mots clés. L'ensemble de cette 
manipulation est appelée déclaration de procédure.
 Ces mots clés permettant la déclaration de la procédure sont une étiquette 
(qui représente le nom de la fonction) précédant le mot clé PROC marquant le début de la procédure, suivi de near 
(qui signale que la procédure est située dans le même segment que le programme appelant) et RET désignant la dernière instruction, 
et enfin le mot clé ENDP qui annonce la fin de la procédure. 
Ainsi une déclaration de procédure ressemble à ceci : 
 
 
| étiquette | PROC | near | 
 
|   | instruction1 |   | 
 
|   | instruction2 |   | 
 
|   | ... |   | 
 
|   | RET |   | 
 
| étiquette | ENDP |   | 
 
 
 
C'est l'instruction CALL qui permet l'appel d'une procédure. Elle est suivie soit d'une adresse 
16 bits, désignant la position du début de la procédure, ou bien du nom de la procédure 
(celui de l'étiquette qui précède le mot clé PROC).
 
 
Lorsqu'on appelle une procédure, la première adresse de la procédure est stockée 
dans le registre IP (pointeur d'instruction). 
Le processeur traite ensuite toutes les lignes d'instructions précédant le mot 
clé RET. Finalement, l'adresse stockée avant l'appel de PROC est remise 
dans le registre IP. 
 Cela paraît simple mais le problème provient du fait que les procédures peuvent être 
imbriquées, c'est-à-dire que de saut en saut, le processeur doit être capable 
de revenir successivement aux adresses de retour. 
En fait, à chaque appel de fonction de l'instruction CALL, le processeur empile l'adresse 
contenue dans le registre IP (il pointe alors sur l'instruction suivant l'instruction CALL) 
avant de la modifier. A l'appel de l'instruction RET (qui ne prend pas d'arguments) le contenu de la pile 
est dépilé puis stocké dans le registre IP. 
 
 
Une procédure effectue généralement des actions sur des données 
qu'on lui fournit, toutefois dans la déclaration de la procédure il n'y a pas 
de paramètres (dans des langages évolués on place généralement 
les noms des variables paramètres entre des parenthèses, séparés par des virgules). 
Il existe toutefois deux façons de passer des paramètres à une procédure :
 
- Le passage des paramètres par registre : on stocke les valeurs dans les registres utilisés 
dans la procédure
 
- Le passage des paramètres par pile : on stocke les valeurs dans la pile avant d'appeler la procédure, puis on lit le contenu 
de la pile dans la procédure
 
 
 
C'est une méthode simple pour passer des paramètres : 
 Elle consiste à écrire sa procédure en faisant référence à des 
registres dans les instructions, et de mettre les valeurs que l'on désire dans les registres juste 
avant de faire l'appel de la fonction...
 Le passage des paramètres par registre est très simple à mettre en oeuvre mais 
elle est très limitée, car on ne peut pas passer autant de paramètres que l'on désire, 
à cause du nombre limité de registres. On lui préfèrera le passage des paramètres 
par pile.
 
 
Cette méthode de passage de paramètres consiste à stocker les valeurs 
des paramètres dans la pile avant l'appel de procédure (grâce à l'instruction PUSH), puis de lire le contenu 
de la pile grâce à un registre spécial (BP : Base pointer) qui permet de lire 
des valeurs dans la pile sans les dépiler, ni modifier le pointeur de sommet de pile (SP).
 L'appel de la procédure se fera comme suit :
 PUSH parametre1 ;où parametre1 correspond à une valeur ou une adresse
 PUSH parametre2 ;où parametre2 correspond à une valeur ou une adresse
 CALL procedure
 La procédure commencera par l'instruction suivante :
 
 
| MOV BP, SP | ;Permet de faire pointer BP sur le sommet de la pile | 
 
 
 Puis pourra contenir des instructions du type :
| MOV AX, [BP] | ;Stocke la valeur contenue dans le sommet de la pile dans AX, sans dépiler | 
 
| MOV BX, [BP+2] | ;Stocke la valeur contenue dans le mot suivant  de la pile dans BX (un mot fait 2 octets), sans dépiler | 
 
 
  
 
 
 |