Explicación del puntero de fotograma

28

En el ensamblaje MIPS , hay un registro para el puntero de pila y otro registro para el puntero de marco. ¿Cuál es el puntero de marco y cuál es su propósito? ¿Cómo se diferencia del puntero de la pila?

qwaserdftyghuijkiii
fuente
1
¿Qué investigación has hecho ya y cuál es tu familiaridad con los términos? ¿Para qué sistema es esto (los diferentes sistemas tienen una terminología diferente)?
Solo quiero familiarizarme con el puntero de marco (ensamblaje de mips). No entiendo cómo ayuda, ¿por qué lo necesitamos? Muchas gracias
qwaserdftyghuijkiii

Respuestas:

44

En el ensamblaje MIPS, el puntero de la pila apunta a la parte superior de la pila. A medida que asigna espacio en la pila, el puntero de la pila ($ sp) se mueve para apuntar a la memoria libre.

Cuando se llama a una subrutina en el ensamblaje MIPS (los registros eran muy importantes en esos días, los parámetros basados ​​en el registro no eran convencionales), uno escribe los parámetros en la pila y luego avanza el puntero de la pila.

Cuando se inicia el método, un parámetro puede estar en un desplazamiento de 16($sp). Sin embargo, a medida que las variables se colocan en la pila, el puntero de la pila se mueve y el mismo parámetro ahora puede ubicarse en su 24($sp)lugar. Esto puede hacer que el código sea un poco confuso.

El puntero del marco ($ fp) apunta al inicio del marco de la pila y no se mueve durante la duración de la llamada de subrutina. Esto apunta a la base del marco de la pila, y los parámetros que se pasan a la subrutina permanecen en un punto constante en relación con el puntero del marco.

Tenga en cuenta que el puntero del marco deberá almacenarse y restaurarse con llamadas de subrutina que lo modifiquen.

Otras lecturas:


fuente
No sé qué se entiende por "los registros eran importantes en esos días: parámetros basados ​​en registros donde no eran convencionales", pero los parámetros también se pueden colocar en la pila cuando el número de registros es limitado. Si tiene 35 parámetros, por ejemplo (creo que MIPS tiene 32 registros), entonces necesitaría poner los 3 parámetros finales en la pila. También más específico para la implementación, el FP estaría en la dirección en la memoria donde está la dirección de retorno.
Jonathan
1
@Jonathan MIPS De esos 32 registros, $ 0 era 0. $ at estaba reservado, $ v0 y $ v1 eran para el valor de retorno de las llamadas a funciones, $ a0 - $ a3 eran parámetros de función, $ t0 - $ t9 eran temporales (reservas de llamadas) , $ s0 - $ s7 se guardaron, y $ gp, $ sp, $ fp y $ ra fueron utilizados por el propio sistema. Con todo, solo hubo 24 registros de propósito general y algunos de los gastos generales incurridos si desea utilizar. Por lo general, solo usó los registros $ t (10). Compare esto con el Itanium que tiene 128 registros. Al llamar a una función en MIPS con 35 parámetros, es probable que los ponga a todos en la pila.
@ Jonathan También señalaré este comentario : "AMD Bulldozer: 96 GPR físicos, Intel Sandy Bridge: 160 GPR físicos, Intel Haswell: 168 GPR físicos". Las cosas se ponen divertidas con máquinas de múltiples núcleos. SPARC tenía 160 registros . También le sugiero que registre la ventana que entró en algo de la filosofía de diseño de MIPS con la mitad de registros que sus contemporáneos.
Entonces, ¿esto es lo mismo que el uso convencional del %ebpregistro 'puntero base' en la convención de llamada x86? (Soy nuevo en todo esto, pero suena como lo mismo que usar algo así MOV 8(%ebp), %eaxo algo así )
ELLIOTTCABLE
La línea Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.no está muy clara qué significa eso
zadane