Explicação do ponteiro do quadro

28

Na montagem do MIPS , há um registro para o ponteiro da pilha e outro registro para o ponteiro do quadro. Qual é o ponteiro do quadro e qual é o seu objetivo? Como ele difere do ponteiro da pilha?

qwaserdftyghuijkiii
fonte
11
Que pesquisa você já fez - e qual sua familiaridade com os termos? Para que sistema é (sistemas diferentes têm terminologia diferente)?
Eu só quero me familiarizar com o ponteiro de quadro (montagem mips). Não entendo como isso ajuda, por que precisamos disso? Muito obrigado
qwaserdftyghuijkiii

Respostas:

44

Na montagem do MIPS, o ponteiro da pilha aponta para o topo da pilha. À medida que você aloca espaço na pilha, o ponteiro da pilha ($ sp) se move para apontar para a memória livre.

Ao chamar uma sub-rotina na montagem do MIPS (os registradores eram muito bons naqueles dias - registre os parâmetros com base onde não eram convencionais), escreve-se os parâmetros na pilha e depois avança o ponteiro da pilha.

Quando o método inicia, um parâmetro pode estar em um deslocamento de 16($sp). No entanto, conforme as variáveis ​​são colocadas na pilha, o ponteiro da pilha se move e o mesmo parâmetro agora pode estar localizado em 24($sp)vez disso. Isso pode tornar o código um pouco confuso.

O ponteiro de quadro ($ fp) aponta para o início do quadro de pilha e não se move durante a chamada de sub-rotina. Isso aponta para a base do quadro da pilha e os parâmetros passados ​​para a sub-rotina permanecem em um ponto constante em relação ao ponteiro do quadro.

Perceba que o ponteiro do quadro precisará ser armazenado e restaurado com chamadas de sub-rotina que o modificam.

Leitura adicional:


fonte
Eu não sei o que se entende por "registradores estavam em alta naquela época - parâmetros baseados em registradores onde não eram convencionais", mas parâmetros também podem ser colocados na pilha quando o número de registradores é limitado. Se você possui 35 parâmetros, por exemplo (acredito que o MIPS possui 32 regs.), Seria necessário colocar os 3 parâmetros finais na pilha. Também mais específico à implementação, o FP estaria no endereço na memória onde está o endereço de retorno.
9136 Jonathan
11
@ MIPS Jonathan Desses 32 registros, $ 0 era 0. $ Era reservado, $ v0 e $ v1 eram para o valor de retorno de chamadas de função, $ a0 - $ a3 eram parâmetros de função, $ t0 - $ t9 eram temporários (preserva o chamador) , $ s0 - $ s7 foram salvos e $ gp, $ sp, $ fp e $ ra foram usados ​​pelo próprio sistema. No geral, havia apenas 24 registros de uso geral e alguns incorridos se você quisesse usá-lo. Você geralmente usava apenas os registros $ t (10). Compare isso com o Itanium, que possui 128 registros. Chamando uma função no MIPS com 35 parâmetros, você provavelmente colocaria todos eles na pilha.
@ Jonathan Também apontarei para este comentário : "AMD Bulldozer: 96 GPRs físicos, Intel Sandy Bridge: 160 GPRs físicos, Intel Haswell: 168 GPRs físicos". As coisas ficam engraçadas com várias máquinas principais. O SPARC tinha 160 registros . Também aponto para registrar a janela que entrou em parte da filosofia de design do MIPS com metade do número de registros que seus contemporâneos.
Então, isso é o mesmo que o uso convencional do %ebpregistrador 'base pointer' na convenção de chamada x86? (Eu sou novo em tudo isso, mas parece que a mesma coisa básica como a utilização de sth como MOV 8(%ebp), %eaxou como?)
ELLIOTTCABLE
A linha Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.não é muito claro o que isso significa
zadane