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?
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. –