Partilhar via


Alocação de pilha

O prólogo de uma função é responsável por alocar espaço de pilha por variáveis locais, salvo registradores, parâmetros de pilha e registrar os parâmetros.

A área de parâmetro é sempre na parte inferior da pilha (mesmo se alloca é usado), de modo que ele sempre estará adjacente ao endereço de retorno durante qualquer chamada de função. Ele contém pelo menos quatro entradas, mas sempre espaço suficiente para conter todos os parâmetros necessários por qualquer função que pode ser chamada. Observe que sempre espaço é alocado para os parâmetros de registro, mesmo se os parâmetros propriamente ditos nunca são bases para a pilha; um receptor é garantido que tenha sido alocado espaço para todos os seus parâmetros. Endereços residenciais são necessários para os argumentos de registro para que uma área contígua está disponível caso a função chamada precisa obter o endereço da lista de argumentos (va_list) ou um argumento individual. Essa área também fornece um local conveniente para salvar os argumentos de registro durante a execução de conversão e como uma opção de depuração (por exemplo, ele facilita os argumentos encontrar durante a depuração, se eles estiverem armazenados em seus endereços residenciais no código de prólogo). Mesmo que a função de chamada tenha menos de quatro parâmetros, esses locais de 4 pilha efetivamente pertencem a função chamada e podem ser usados pela função de chamada para outras finalidades além de economizar parâmetro valores do registro. Assim, o chamador talvez não salve informações nesta região da pilha em uma chamada de função.

Se o espaço é alocado dinamicamente o (alloca) em uma função, um registrador de não-volátil deve ser usado como um ponteiro de quadro para marcar a base da parte fixa da pilha e registrador deve ser salvo e inicializado no prólogo. Observe que, quando alloca é usado, chamadas para o mesmo receptor do mesmo chamador podem ter diferentes endereços base para seus parâmetros de registro.

A pilha será sempre mantida 16 bytes alinhados, exceto dentro de prólogo (por exemplo, após o endereço do remetente é empurrado) e exceto onde indicado em Tipos de função para uma determinada classe de funções do quadro.

A seguir é um exemplo de layout de pilha onde não-folha de chamadas de função a função b. Prólogo da função do já alocado espaço para todos os parâmetros de registro e a pilha exigidos por B, na parte inferior da pilha. A chamada envia o endereço do remetente e o prólogo do b aloca espaço para suas variáveis locais, não-volátil registradores e o espaço necessário para que ele chamar funções. Se b usa alloca, o espaço é alocado entre o registro de variável/não-volátil local área de salvamento e a área de pilha de parâmetro.

Gráfico de exemplo 5 de conversão AMD

Quando a função b chama a função de outra, o endereço do remetente é empurrado logo abaixo do endereço residencial para RCX.

Consulte também

Referência

Uso da pilha