2012-02-13 14 views
23

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?

risposta

52

registri (AKA registri volatili) Caller-salvati vengono utilizzati per contenere quantità temporanee che hanno bisogno non può essere conservato tra le chiamate.

Per questo motivo, è responsabilità del chiamante spingere questi registri nello stack se desidera ripristinare questo valore dopo una chiamata di procedura.

Callee-salvati registri (registri AKA non volatili) vengono utilizzati per contenere i valori di lunga durata che dovrebbe essere conservate tra le chiamate.

Quando il chiamante effettua una chiamata di procedura, è possibile aspettarsi che tali registri avranno anche lo stesso valore dopo il ritorno callee, il che rende la responsabilità del chiamato per salvarli e ripristinarli prima di ritornare al chiamante.

Spero che aiuti.

+2

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

8

Callee vs chiamante salvato è una convenzione per chi è responsabile del salvataggio e del ripristino del valore in un registro attraverso una chiamata. TUTTI i registri sono "globali" in quanto qualsiasi codice può vedere (o modificare) un registro ovunque e tali modifiche saranno viste da qualsiasi codice successivo ovunque. Il punto di salvataggio delle convenzioni del registro è che il codice non dovrebbe modificare certi registri, poiché l'altro codice presuppone che il valore non venga modificato.

Nel codice di esempio, NESSUNO dei registri è salvato, poiché non tenta di salvare o ripristinare i valori del registro. Tuttavia, sembrerebbe non essere un'intera procedura, poiché contiene un ramo di un'etichetta non definita (l$loop). Quindi potrebbe essere un frammento di codice dal centro di una procedura che considera alcuni registri come salvati; ti mancano solo le istruzioni di salvataggio/ripristino.

Problemi correlati