2012-06-24 13 views
8

Sto giocando con gcc -S per capire come funzionano la memoria e lo stack. Durante questi spettacoli ho trovato molte cose poco chiare per me. Potresti per favore aiutarmi a capire le ragioni?Perché gcc lo fa quando crea il codice assembler?

  1. Quando si imposta la funzione di chiamata argomenti per un definito uno che utilizza mov a esp invece push. Qual è il vantaggio di non utilizzare push?

  2. La funzione che funziona con gli argomenti di stack situati li indica come ebp + (N + offset) (dove N è una dimensione riservata per l'indirizzo di ritorno). Mi aspetto di vedere esp - offset che è più comprensibile. Qual è la ragione per utilizzare ebp come punto fondamentale ovunque? So che questi sono uguali ma comunque?

  3. Cos'è questa magia all'inizio di main? Perché esp deve essere inizializzato in questo modo solo?

    and esp,0xfffffff0 
    

Grazie,

+3

Questo potrebbe essere 3 domande separate. Ad ogni modo, la risposta al terzo punto è l'allineamento dello stack. – Mysticial

risposta

7

I assumerà si lavora in un ambiente a 32 bit perché in un ambiente a 64 bit argomenti sono passati nei registri.

Domanda 1

Forse si passa un argomento in virgola mobile qui. Non è possibile inviarli direttamente, poiché l'istruzione push in un runtime a 32 bit richiede 4 byte alla volta, quindi è necessario suddividere il valore. A volte è più facile sottrarre 8 da esp e spostare la quadword da 8 byte in [esp].

Domanda 2

ebp viene spesso utilizzato per indicizzare i parametri e gli abitanti in stack frame in codice a 32 bit. Ciò consente di correggere gli offset all'interno dei frame anche quando si sposta il puntatore dello stack. Ad esempio si consideri

void f(int x) { 
    int a; 
    g(x, 5); 
} 

Ora, se si accede solo il contenuto dello stack del telaio con esp, poi a è a [esp], l'indirizzo di ritorno sarebbe a [esp+4] e x sarebbe a [esp+8]. Ora generiamo il codice per chiamare g. Dobbiamo prima premere 5 quindi premere x. Ma dopo aver premuto 5, l'offset di x da esp è stato modificato! Questo è il motivo per cui viene utilizzato ebp. Normalmente in entrata alle funzioni, si preme il vecchio valore di ebp per salvarlo, quindi copia esp a ebp. Ora è possibile utilizzare ebp per accedere ai contenuti del frame. Non si muoverà quando siamo nel mezzo degli argomenti che passano.

Domanda 3

Questa istruzione and zeri gli ultimi 4 bit di esp, allineandola ad un limite di 16 byte. Dal momento che lo stack cresce, questo è bello e sicuro.

+1

Q3: azzera gli ultimi 4 bit – hirschhornsalz

+0

Oh mio, grazie, @drhirsch. Digitando senza pensare. Terribile. Grazie mille! Modificato. –

Problemi correlati