2013-04-06 14 views
5

Ciao sto leggendo una guida su x86 dall'Università della Virginia e si afferma che premendo e facendo scoppiare lo stack rimuove o aggiunge un elemento di dati a 4 byte nello stack.x86 Il push/pop può essere inferiore a 4 byte?

Perché questo è impostato su 4 byte? Può essere modificato, potresti risparmiare memoria nello stack spingendo su elementi di dati più piccoli?

La guida può essere trovato qui, se qualcuno vuole vederlo: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

+1

Questa istruzione si applica solo in modalità 32 bit, e puoi anche premere/mettere in 2 byte elementi. – harold

risposta

7

Risposta breve: sì, 16 o 32 bit. E, per x86-64, 64 bit.

I motivi principali per uno stack devono essere restituiti dalle chiamate di funzioni nidificate e per salvare/ripristinare i valori di registro. Viene inoltre utilizzato in genere per passare i parametri e restituire i risultati delle funzioni. Tranne per i parametri più piccoli, questi elementi di solito hanno le stesse dimensioni dal design del processore, cioè la dimensione del registro del puntatore di istruzioni. Per 8088/8086, è 16 bit. Per 80386 e successori, è a 32 bit. Pertanto, c'è poco valore nell'avere istruzioni di stack che operano su altre dimensioni.

C'è anche la considerazione della dimensione dei dati sul bus di memoria. Ci vuole lo stesso tempo per recuperare o memorizzare una parola come fa un byte. (Tranne 8088 che ha registri a 16 bit ma un bus dati a 8 bit.) Anche l'allineamento entra in gioco. Lo stack deve essere allineato sui limiti delle parole in modo che ogni valore possa essere recuperato come un'operazione di memoria. Il trade-off viene solitamente utilizzato per risparmiare tempo rispetto al salvataggio della memoria. Per passare un byte come parametro, viene solitamente utilizzata una parola. (Oppure, a seconda dell'ottimizzazione disponibile per il compilatore, verrebbe utilizzato un registro a dimensione di parola, evitando del tutto lo stack.)

+9

In x86-64 non è possibile premere i registri oi valori a 32 bit memorizzati nella memoria, solo i registri ei valori a 16 o 64 bit archiviati in memoria. 'push ax',' push rax', 'push word [rax]' e 'push qword [rax]' sono tutte istruzioni x86-64 valide, ma 'push eax' e' push dword [rax] 'non sono validi in x86-64. – nrz

+0

Nota storica, 80188 (molto raramente usato) 80188 (word a 16 bit, bus dati a 8 bit) e (un po 'popolare per un tempo) 386SX (word a 32 bit, bus dati a 16 bit) erano nella stessa barca di 8088 per quanto riguarda la mancata corrispondenza delle dimensioni del bus dati. –

+0

Per "Lo stack deve essere allineato sui limiti delle parole in modo che ogni valore possa essere recuperato come un'operazione di memoria.", Questo si applica alle variabili locali all'interno di una funzione? – Thomson

Problemi correlati