2011-12-02 10 views
16

Attualmente sto imparando l'assemblaggio per processori Intel. Dal momento che la pila 'cresce verso il basso', perché dobbiamo aggiungere al fine di accedere ad un elemento specificoregistri di montaggio esp e ebp

[ebp + 8] ;; This will access the first param 

I konw dobbiamo saltare il vecchio valore EBP e l'indirizzo di ritorno ed è per questo che usiamo 8 (perché ognuno è lungo 4 byte). Questo è un po 'strano.

Inoltre, se EBP è una copia di backup per esp, qual è il valore di EBP nella funzione principale Es:

_start: 

;; what's ebp value here ? 

push eax 
push ebx 
call someFunction ;; this will create a stack frame 

+-----------+ 
| param1 | 
+-----------+ 
| param0 | <--- this is [ebp + 8] (assuming mov ebp, esp) 
+-----------+ 
|ret_address| 
+-----------+ 
| ebp | 
+-----------+ <--- esp 

E anche quando abbiamo allocare memoria per i locali, dobbiamo sottrarre da ebp ... Si prega di dare una risposta non ambigua. Grazie!

+1

Una funzione main() non è diversa da una funzione normale, ha anche un prologo. Non ne hai mostrato uno nello snippet di assembly, non so perché. Lo spazio per i locali viene creato regolando esp, non ebp. –

+0

Ci sono le stesse domande: http://stackoverflow.com/questions/1395591/che-si-esattamente-il-base-pointer-and-stack-pointer-to-what-do-they-point, e altri collegati a it – Abyx

risposta

2

Proprio come hai detto, lo stack si riduce. Quindi, sottrai per far crescere lo stack verso il basso per i locali. Si aggiunge per guardare indietro nello stack per gli elementi memorizzati lì.

13

Il valore iniziale per %ebp è in genere 0. Questo è il modo in cui i debugger sanno quando terminare seguendo la catena di collegamento in un backtrace.

Si dovrebbe pensare a %ebp come punto di riferimento. Per comodità, è collocato tra gli argomenti della funzione e le variabili locali. In questo modo, si accede agli argomenti con un offset positivo e alle variabili con un offset negativo, quindi è facile stabilire se si sta accedendo a una variabile oa un argomento.

+0

Perché 0? Iniziale quando la CPU è accesa? – Abyx

+0

'% ebp' è in genere inizializzato a 0 dal loader o dalla libreria di runtime. L'inizializzazione a 0 viene talvolta specificata in un documento formale (ad es. IIRC lo specifica lo x86 ELAB psABI). – ninjalj

+0

quale caricatore o quale runtime? Se stai parlando di un sistema operativo specifico, ti preghiamo di indicarlo esplicitamente. 'Il mio sistema operativo' ebp' non è inizializzato a 0, almeno in modalità utente. Inoltre, per essere precisi, il nome del registro è 'ebp', non'% ebp'. '%' è un prefisso per il nome del registro. – Abyx