2016-03-16 19 views
6

Perché abbiamo push ebp come prima azione in Callee di una funzione Assembly?Perché "PUSH EBP" e "MOV EBP, ESP" nel CALLEE in Assembly?

Capisco che quindi usiamo mov edi, [ebp+8] per ottenere le variabili passate, ma il nostro esp sta già puntando all'indirizzo di ritorno della funzione chiamante. Possiamo facilmente accedere alle variabili passate con mov edi, [esp+4] o se abbiamo premuto i registri Callee, quindi mov edi, [esp+16].

Quindi, perché questo registro aggiuntivo nella CPU (il ebp) che sarà necessario gestire in futuro? cioè

push ebp 
mov ebp, esp 

... 

mov esp, ebp 
pop ebp 
+3

Non è necessario. I compilatori spesso omettono il puntatore del frame al giorno d'oggi, se la funzione non usa matrici di lunghezza variabile o 'alloca()'. – EOF

+0

Possibile duplicato di [Qual è esattamente il puntatore di base e il puntatore dello stack? Per cosa indicano?] (Http://stackoverflow.com/questions/1395591/che-è-esattamente-il-base-pointer-and-stack-pointer-to-what-do-they-point) –

+0

Perché hai inserito "CALLEE" in maiuscolo nel titolo? Ti stai chiedendo perché il chiamante non crea frame di stack come parte della convenzione di chiamata? Non suona in questo modo, in base al testo diverso dal titolo. –

risposta

4

Si sta creando un nuovo stack frame entro il chiamato, mantenendo lo stack frame del chiamante. Un frame di stack consente un accesso coerente ai parametri passati e alle variabili locali utilizzando offset fissi relativi a EBP in qualsiasi punto della funzione, mentre ESP è libero di continuare a essere modificato in base alle esigenze mentre la funzione è in esecuzione. ESP è un target mobile, quindi l'accesso a parametri e variabili mediante offset dinamici relativi a ESP può essere complicato, se non impossibile, a seconda di come la funzione utilizza lo stack. La creazione di uno stack frame è generalmente più sicura, al costo di utilizzare pochi byte di spazio stack per preservare il puntatore al frame dello stack del chiamante.

+0

Il costo di mantenere un puntatore di fotogramma non è nel singolo 'push [r/e] bp', sta rinunciando a utilizzare gratuitamente un registro salvato dal chiamante su un registro affamato (o * molto * registro affamato, per 32- bit) architettura. – EOF

+0

Avere un offset dinamico delle variabili potrebbe confondere gli umani, ma è davvero necessario per un compilatore? Ne vale davvero la pena? – Grigio

+0

@EOF '[R/E] BP' è riservato specificamente per l'uso come puntatore di stack frame. Ad esempio, non è un registro per scopi generici, come "[R/E] AX". –