2012-06-28 7 views
15

L'apprendimento dell'assemblaggio x86 e il puntatore del frame mi fanno impazzire un po '. Ho imparato da questo SO question che EBP rende la vita fantastica per il debug. È fantastico, ma ero curioso: "A cosa serve l'EBP?" Guardando l'articolo di Wikipedia call stack, EBP è necessario per l'allocazione dello stack dinamico.Il registro EBP (puntatore frame di base) è solo per Debug in x86?

Come ho sempre pensato che l'allocazione dinamica vada in porto. Quindi, perché dovrei voler utilizzare l'allocazione dinamica dello stack - perché l'heap non è abbastanza buono? E come è utile l'EBP?

+2

Hah, contrassegnato come duplicato quasi tre anni dopo. – CatShoes

risposta

9

L'allocazione di una piccola quantità di memoria dallo stack è estremamente rapida rispetto all'allocazione dell'heap. Quando assegniamo la memoria dall'heap, dobbiamo chiamare l'API o il gestore della memoria.

SI È possibile utilizzare il registro EBP anche per altri scopi come altri registri a 32 bit, ma è necessario innanzitutto memorizzarne il contenuto e quindi ripristinare prima di uscire dalla procedura.

È possibile utilizzare PUSH EBP per archiviare il contenuto EBP nello stack e POP EBP per il ripristino.

+0

L'EBP PUSH EBP/POP menziona lo stesso generato dal compilatore per le chiamate di funzione? – CatShoes

+0

@CatShoes: Normalmente il compilatore utilizza il registro EBP per accedere alle variabili allocate dello stack dinamico come puntatore della memoria dello stack, quindi se la procedura asm si trova nel mezzo del codice del programma è necessario preservare il contenuto di EBP. –

+0

Ok, quindi questo è in aggiunta all'utilizzo generato dal compilatore di EBP. Grazie! – CatShoes

19

Si presuppone erroneamente che ebp sia necessario per l'assegnazione del frame dello stack. Questo non è vero, esp può essere utilizzato direttamente. Oggigiorno l'uso di ebp come puntatore del frame dello stack non è assolutamente necessario. Ci sono alcuni punti, dove si era utile:

  • Nel codice a 16 bit, l'uso di sp (stack pointer) nell'affrontare era fortemente limitata, indirizzamento relativo non sia direttamente possibile a tutti a 86, dove bp può essere utilizzato in ogni modalità di indirizzamento disponibile.

  • Il ragionamento per questo supporto limitato sono stati probabilmente i compilatori disponibili in quel momento, è molto più semplice generare codice con i puntatori dei fotogrammi per poi tenere traccia del sempre mutevole sp. Ci sono molti più processori che hanno avuto il supporto speciale per le istruzioni di stack del telaio, come leave o enter, ma per quanto ne so nessuno ma Intel si è spinto fino a paralizzare il vero sp in quel processo :-)

  • debug. È molto più semplice srotolare uno stack quando i puntatori dei frame sono disponibili, ma i debugger moderni possono fare anche senza.

Se si desidera allocare spazio 100 byte sullo stack, basta fare sub esp, #100, accedere allo spazio con move [esp + x] dove x è compreso tra 0 e 99 e pulire con add esp, #100 e si è fatto. Direi anche che l'uso di stack frame pointers in assembly scritti a mano è come copiare il comportamento di un compilatore di trent'anni, quando i compilatori erano davvero stupidi e non potevano fare a meno. È in no modo necessario né utile se si sta scrivendo assemblaggio.

+0

Per favore perdonami, sono un po 'denso. Stai dicendo che è più o meno inutile usare EBP per i puntatori ai frame stack, e invece usare ESP per questo ed EBP come registro generale? – CatShoes

+0

Sì, sto dicendo che l'uso di un puntatore del frame è generalmente obsoleto. È una cosa del passato che tende ancora ad aggirarsi :-) – hirschhornsalz

+0

Grande. Apprezzo le informazioni utili. Ho già scelto l'altra risposta, ma sento che la tua è ugualmente utile. Upvoted! – CatShoes

Problemi correlati