2012-12-27 23 views
9

Ad esempio se ho spinto l'ascia è [SP] punta al mio valore di ascia o alla parola dopo l'ascia? Inoltre è diverso dalla modalità reale alla modalità protetta? Lo chiedo perché l'arte del libro di assemblaggio illustra e spiega come lo sp punta agli ultimi dati spinti, e in questa pagina OSDev Wiki - Stack viene illustrato come punta alla parola vuota dopo l'ultimo dato inserito.x86 dove punta il puntatore dello stack?

+1

I manuali di riferimento Intel includono pseudocodice per ciascuna istruzione. Per rispondere alla tua domanda, punta al valore più in alto nello stack. – DCoder

risposta

17

Wikipedia dice here:

Lo stack è implementato con un implicito decremento (push) e incremento (pop) stack pointer. Nella modalità a 16 bit, questo puntatore impilato dello stack viene indirizzato come SS: [SP], in modalità a 32 bit è SS: [ESP] e nella modalità a 64 bit è [RSP]. Il puntatore dello stack punta effettivamente sull'ultimo valore che è stato memorizzato, nel presupposto che le sue dimensioni corrispondano a la modalità operativa del processore (cioè 16, 32 o 64 bit) a corrisponda alla larghezza predefinita del istruzioni push/pop/call/ret.

Questo è il modo in cui la mia memoria di ritorno dice che funziona anche.

+0

Ok grazie, ma non hai idea del perché osdev wiki illustra esp dopo la fine dello stack. È un errore? – user1180619

+0

Puoi provarlo. Spingi qualcosa di strano in pila e poi vedi se [esp] ha lo stesso valore. Provalo con diversi valori per assicurarti che non sia un incidente. –

+0

@ user1180619: le pile funzionano capovolte.Iniziano dall'indirizzo alto e lavorano da lì. Non so perché, ma è così. – Linuxios

10
push eax 

è equivalente a:

sub esp, 4 
mov [esp], eax 

Così, dopo una spinta, esp terrà l'indirizzo del valore spinto.

0

Penso di capire perché OP sta facendo questa domanda. Perché la prima variabile 8 byte da SP e non da 4?

Dopo alcune ricerche ho trovato this che indica che:

SP + 0 è il vecchio EBP SP + 4 è il vecchio PII (puntatore all'istruzione)

Quindi, naturalmente, il primo parametro è SP + 8.

-1

in x86_64 il punto stack è nel registro% RSP , che nella parte a 32 bit inferiore è ben knowned-as% esp

0

Come per le risposte di Cory Nelson Lee Meador e, i punti di puntatore di stack su l'ultimo valore è stato spinto.

Dal Intel® 64 e IA-32 Architetture dello sviluppatore di software Manual Volume 2 (2A, 2B & 2C): set di istruzioni, AZ, la prima riga dalla descrizione delle istruzioni PUSH legge come segue:

Decrementa il puntatore dello stack e quindi memorizza l'operando di origine sulla parte superiore dello stack .

Problemi correlati