Ho qualche problema a capire la differenza tra i registri salvati nel caller e nel chiamato e quando usare cosa.Cosa sono i registri salvati di Call e Caller?
sto usando la MSP430 :
procedura:
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
il codice di cui sopra è un callee ed è stato utilizzato in un esempio da manuale in modo che segue la convenzione. R6 e R7 vengono salvati e R12 viene salvato dal chiamante. La mia comprensione è che il registro salvato non è "globale" nel senso che modificarne il valore in una procedura non influirà sul valore al di fuori della procedura. Questo è il motivo per cui devi salvare un nuovo valore nel callee reg all'inizio.
R12, il chiamante salvato è "globale", per mancanza di parole migliori. Che cosa fa la procedura ha un effetto duraturo su R12 dopo la chiamata.
La mia comprensione è corretta? Mi mancano altre cose?
Un altro termine che mi piace usare è "call-clobbered" vs. "call-preserved". caller vs. callee differisce solo di una lettera, e i compilatori non salvano/ripristinano effettivamente i reg clobbered delle chiamate attraverso le chiamate (inseriscono semplicemente i valori in regs di call-preserve). volatile vs. non-volatile può causare confusione con C ' parola chiave volatile'. Quindi "call-clobbered" descrive con precisione cosa deve assumere una funzione riguardo * altre * funzioni, piuttosto che come potrebbe implementare la convenzione di chiamata/ABI. –