Estou tentando aprender x86. (Arquitetura IA-32) Hoje aprendi sobre o Stack. Isto é o que acho que entendi:
O StackPointer (SP) aponta para o "topo" da pilha (menor endereço) e é armazenado em um registro ESP. O Frame Pointer (FP) permite acessar argumentos e variáveis locais, pois é o "endereço pop" e, portanto, estático, mesmo se o SP se mover mais para dentro da pilha.
int addSome(int arg1, int arg2);
int main(void){
int answer = addSome(1,2);
}
int addSome(int arg1, int arg2){
return arg1 + arg2;
}
A pilha deve ficar assim:
Pilha onde o Frame Pointer mostra "endereço pop"
O que acontece com o FP se houver funções aninhadas? Ele não pode ser movido para cima, pois sua localização será necessária se a subfunção for desempilhada.
Para visualização; adicione esta função, que será chamada dentro de addSome():
int subSome(int arg3, int arg4);
int subSome(int arg3, int arg4){
return arg3 - arg4;
}
Como o FP é manipulado aqui? Como o novo "endereço pop" é conhecido e a localização dos novos argumentos? Pilha onde o Frame Pointer mostra o "endereço pop" da primeira função, a segunda é desconhecida
Meu palpite é que o tamanho da pilha de addSome será salvo em algum lugar para obter a localização do novo "endereço pop" em relação ao FP:
Pilha onde o Frame Pointer tem diferença relativa ao novo "endereço pop"
Mas esse tamanho de pilha teria que ser salvo em algum lugar e, se houver mais funções aninhadas, teria que haver mais lugares para armazenar esses tamanhos, o que acredito que não pode ser verdade.