A pilha de chamadas em linguagem C é implementada como uma lista vinculada nas APIs binárias x86 (e na maioria das outras).
Ou seja, a chamada de procedimento em linguagem C segue uma disciplina de primeiro a entrar, último a sair. O resultado da execução de chamadas de função (possivelmente recursivas) é chamado de "pilha de chamadas" ou, às vezes, apenas "a pilha".
A CALL
instrução x86 acaba implementando uma lista vinculada usando a "pilha de chamadas". Uma CALL
instrução envia o conteúdo do registro% EIP, o endereço da instrução após a CALL
memória da pilha. O prólogo de função chamada envia o conteúdo do registro% EBP, o endereço mais baixo das variáveis locais na função de chamada, para a memória da pilha. Em seguida, o prólogo da função chamada define% EBP para a base da pilha da função atual.
Isso significa que% EBP é um ponteiro para um local de memória que contém o endereço do valor% EBP da função de chamada. Isso não passa de uma lista vinculada, implementada parcialmente em hardware via CALL
.
Na medida em que isso é bom, é como as CPUs x86 implementam chamadas de função, particularmente chamadas de função em que a função possui sua própria cópia de argumentos e variáveis locais para a função. Toda chamada de função fornece algumas informações na "pilha de chamadas" que permite que a CPU continue de onde parou na função de chamada, sem interferência da função chamada ou da função de chamada.