Appels intermodule à l'aide de la fonction toc
La section des données est accessible via la table des matières à l'aide d'une fonction qui permet d'utiliser des appels intermodules.
Etant donné que le seul accès du texte à la section de données est via la table des matières, la table des matières fournit une fonction permettant d'utiliser les appels intermodules. Par conséquent, les routines peuvent être liées ensemble sans résoudre toutes les adresses ou symboles au moment du lien. En d'autres termes, un appel peut être fait à une routine d'utilité commune sans avoir réellement cette routine liée au même module que la routine d'appel. De cette façon, des groupes de routines peuvent être mis en modules, et les routines des différents groupes peuvent s'appeler mutuellement, le temps de liaison étant retardé jusqu'à temps de chargement. Pour utiliser cette fonction, certaines conventions doivent être suivies lors de l'appel d'une routine qui se trouve dans un autre module.
Pour appeler une routine dans un autre module, une routine d'interface (ou routine Liaison globale ) est appelée le contexte de commutation du module en cours vers le nouveau module. Ce commutateur de contexte est facilement exécuté en enregistrant le pointeur de la table des matières sur le module en cours, en chargant le pointeur de la table des matières du nouveau module, puis en branchant à la nouvelle routine dans l'autre module. L'autre routine retourne ensuite à la routine d'origine dans le module d'origine et l'adresse de table des matières d'origine est chargée dans le registre des tables des matières.
Pour rendre le lien global aussi transparent que possible, un appel peut être effectué sur des routines externes sans spécifier le module de destination. Pendant le temps de liaison, le classeur (éditeur de liens) détermine s'il faut appeler le code de liaison global et insère la routine de liaison globale appropriée pour effectuer l'appel intermodule. Le lien global est contrôlé par une liste d'importation. Une liste d'importation contient des symboles externes qui sont résolus lors de l'exécution, soit à partir du système, soit à partir de la charge dynamique d'un autre fichier objet. Pour plus d'informations sur les listes d'importation, voir la commande Ld .
.csect prog1[PR]
...
.extern prog2[PR] #prog2 is an external symbol.
bl .prog2[PR] #call prog2[PR], binder may insert
#global linkage code.
cror 31,31,31 #place holder for instruction to
#restore TOC address.
#AIX® linkage register conventions:
# R2 TOC
# R1 stack pointer
# R0, R12 work registers, not preserved
# LR Link Register, return address.
.csect .prog1[PR]
bl .prog2[GL] #Branch to global
#linkage code.
l 2,stktoc(1) #Restore TOC address
.toc
prog2: .tc prog2[TC],prog2[DS] #TOC entry:
# address of descriptor
# for out-of-module
# routine
.extern prog2[DS]
##
## The following is an example of global linkage code.
.set stktoc,20
.csect .prog2[GL]
.globl .prog2
.prog2: l 12,prog2(2) #Get address of
#out-of-module
#descriptor.
st 2,stktoc(1) #save callers' toc.
l 0,0(12) #Get its entry address
#from descriptor.
l 2,4(12) #Get its toc from
#descriptor.
mtctr 0 #Put into Count Register.
bctr #Return to entry address
#in Count Register.
#Return is directly to
#original caller.