No montagem MIPS , há um registro para o ponteiro da pilha, e outro registro para o ponteiro do quadro. O que é o ponteiro do frame e qual é sua finalidade? Como ele difere do ponteiro da pilha?
Comentários
- Que pesquisa você já fez – e qual é a sua familiaridade com os termos? Para que sistema se destina (diferentes sistemas têm diferentes terminologias)?
- Eu só quero me familiarizar com o ponteiro de quadro (montagem mips). Não ' não entendo como isso ajuda, por que precisamos disso? Muito obrigado
Resposta
Na montagem MIPS, o ponteiro da pilha aponta para o topo da pilha. Conforme 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 no assembly MIPS (os registros eram muito valiosos naquela época – parâmetros baseados em registros onde não convencional), grava-se os parâmetros na pilha e avança o ponteiro da pilha.
Quando o método começa, 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 pode agora estar localizado em 24($sp)
. Isso pode tornar o código um pouco confuso.
O ponteiro do frame ($ fp) aponta para o início do frame da pilha e não se move durante a chamada da sub-rotina. Isso aponta para a base do frame da pilha e os parâmetros que são passados para a sub-rotina permanecem em um ponto constante em relação ao ponteiro do frame.
Perceba que o ponteiro do frame precisará ser armazenado e restaurado com chamadas de sub-rotina que o modificam.
Leitura adicional:
- UWisc Madison CS 354 Convenções MIPS
- Capítulo 3 Linguagem de montagem MIPS
- UMD CS 311 Entendimento the Stack
- UWash Seattle CSE 410 Resumo das convenções de chamada MIPS
- Wikipedia Ponteiro de quadro
Comentários
- Eu não ' não sei o que significa " os registros eram caros naquela época – parâmetros baseados em registro, onde " não convencionais, mas parâmetros também pode ser colocado na pilha quando o # de regi sters é limitado. Se você tiver 35 parâmetros, por exemplo (eu acredito que MIPS tem 32 regs.), Então você precisaria colocar os 3 parâmetros finais na pilha. Também mais específico para implementação, o FP estaria no endereço na memória onde está o endereço de retorno.
- @Jonathan MIPS Desses 32 registradores, $ 0 foi 0. $ em foi reservado, $ v0 e $ v1 foram para o valor de retorno de chamadas de função, $ a0 – $ a3 foram parâmetros de função, $ t0 – $ t9 eram temporários (preservação do chamador), $ s0 – $ s7 foram salvos e $ gp, $ sp, $ fp e $ ra foram usados pelo próprio sistema. Ao todo, havia apenas 24 registradores de propósito geral e alguns daqueles incorridos em sobrecarga se você quisesse usar. Você geralmente usa apenas os registradores $ t (10). Compare isso com o Itanium, que tem 128 registradores. Chamando uma função no MIPS com 35 parâmetros, você provavelmente colocaria todos eles na pilha.
- @Jonathan I ' também aponta 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 de núcleo. SPARC teve 160 registros . Também aponto a janela de registro que abordou parte da filosofia de design do MIPS com metade dos registros de seus contemporâneos.
- , é a mesma coisa que o uso convencional do
%ebp
registro ponteiro de base na convenção de chamada x86? (Eu ' sou novo em tudo isso, mas parece a mesma coisa básica que usar sth comoMOV 8(%ebp), %eax
ou algo semelhante?) - A linha
Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.
não é muito clara o que isso significa