Chamadas intermódulo usando o toc

A seção de dados é acessada por meio do TOC usando um recurso que permite chamadas intermódulo para serem usadas.

Como o único acesso do texto à seção de dados é através do TOC, o TOC fornece um recurso que permite que chamadas intermódulo sejam usadas. Como resultado, as rotinas podem ser vinculadas em conjunto sem resolver todos os endereços ou símbolos no momento do link. Em outras palavras, uma chamada pode ser feita a uma rotina de utilidade comum sem realmente ter aquela rotina ligada ao mesmo módulo da rotina de chamada. Dessa forma, grupos de rotinas podem ser feitos em módulos, e as rotinas nos diferentes grupos podem se chamar, com o tempo de ligação sendo retardado até o tempo de carregamento. Para utilizar esse recurso, certas convenções devem ser seguidas ao ligar para uma rotina que esteja em outro módulo.

Para chamar uma rotina em outro módulo, uma rotina de interface (ou vinculação global rotina) é chamada que alterna contexto do módulo atual para o novo módulo. Este switch de contexto é facilmente realizado salvando o ponteiro TOC para o módulo atual, carregando o ponteiro TOC do novo módulo e, em seguida, ramifica-se para a nova rotina no outro módulo. A outra rotina, então, retorna à rotina original no módulo original, e o endereço TOC original é carregado no registro do TOC.

Para tornar a ligação global o mais transparente possível, uma chamada pode ser feita em rotinas externas sem especificar o módulo de destino. Durante o tempo de ligação, o fichador (linkage editor) determina se deve chamar código de ligação global, e insere a rotina de ligação global adequada para realizar a chamada intermódulo. A vinculação global é controlada por uma lista de importação. Uma lista de importação contém símbolos externos que são resolvidos durante o tempo de execução, seja a partir do sistema ou da carga dinâmica de outro arquivo objeto. Veja o comando ld para obter informações sobre listas de importação.

O exemplo a seguir chama uma rotina que pode passar por ligação global:

.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.
O exemplo a seguir mostra uma chamada através de uma rotina de ligação global:

#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.