2012-02-13 11 views
23

Tengo problemas para entender la diferencia entre el que llama y los registros guardados en el destinatario y cuándo usar qué.¿Qué son los registros de llamadas y de llamadas guardadas?

estoy usando el MSP430 :

procedimiento:

mov.w #0,R7 
mov.w #0,R6 
add.w R6,R7 
inc.w R6 
cmp.w R12,R6 
jl l$loop 
mov.w R7,R12 
ret 

el código anterior es un destinatario de la llamada y fue utilizado en un ejemplo de libro por lo que sigue la convención. R6 y R7 están guardados en el dispositivo y R12 está guardado. Mi entendimiento es que los regs guardados en línea no son "globales" en el sentido de que cambiar su valor en un procedimiento no afectará su valor fuera del procedimiento. Es por eso que debe guardar un nuevo valor en el registro de llamadas al principio.

R12, la persona que ha guardado la llamada es "global", por falta de palabras. Lo que hace el procedimiento tiene un efecto duradero en R12 después de la llamada.

¿Es correcto mi entendimiento? ¿Me estoy perdiendo otras cosas?

Respuesta

52

registros de llamadas-guardados (AKA registros volátiles) se utilizan para contener cantidades temporales que necesitan no ser preservado a través de las llamadas.

Por esa razón, es responsabilidad del que realiza la llamada insertar estos registros en la pila si desea restaurar este valor después de una llamada de procedimiento.

Callee guardan- registros (registros También conocido como no volátiles) se utilizan para mantener los valores de larga vida que deben ser preservados través de llamadas.

Cuando la persona que llama hace una llamada a procedimiento, se puede esperar que esos registros se mantenga el mismo valor después de que los rendimientos destinatario de la llamada, por lo que es responsabilidad del destinatario de la llamada para salvarlos y restaurarlos antes de regresar a la persona que llama.

Espero que ayude.

+2

Otro término que me gusta usar es "call-clobbered" vs. "call-preserved". caller vs. callee solo difiere en una letra, y los compiladores en realidad no guardan/restauran reglas marcadas por llamada en todas las llamadas (simplemente colocan valores en reglas preservadas para llamadas) volátiles vs. no volátiles pueden causar confusión con C's ' palabra clave volátil' Así que "call-clobbered" describe con precisión lo que una función necesita asumir sobre * otras * funciones, en lugar de cómo podría implementar la convención de llamadas/ABI. –

8

Callee vs llamante guardada es una convención para quién es responsable de guardar y restaurar el valor en un registro a través de una llamada. TODOS los registros son "globales" en el sentido de que cualquier código en cualquier lugar puede ver (o modificar) un registro y esas modificaciones serán vistas por cualquier código posterior en cualquier lugar. El objetivo de las convenciones de guardado de registros es que el código no debe modificar ciertos registros, ya que otro código supone que el valor no se modifica.

En su código de ejemplo, NINGUNO de los registros se guardan en el destinatario, ya que no intenta guardar o restaurar los valores de registro. Sin embargo, parece que no es un procedimiento completo, ya que contiene una rama a una etiqueta indefinida (l$loop). Por lo tanto, podría tratarse de un fragmento de código de la mitad de un procedimiento que trata algunos registros como guardado de llamada; simplemente te faltan las instrucciones de guardar/restaurar.

Cuestiones relacionadas