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?
risposta
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.
Ok grazie, ma non hai idea del perché osdev wiki illustra esp dopo la fine dello stack. È un errore? – user1180619
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. –
@ user1180619: le pile funzionano capovolte.Iniziano dall'indirizzo alto e lavorano da lì. Non so perché, ma è così. – Linuxios
push eax
è equivalente a:
sub esp, 4
mov [esp], eax
Così, dopo una spinta, esp
terrà l'indirizzo del valore spinto.
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.
in x86_64 il punto stack è nel registro% RSP , che nella parte a 32 bit inferiore è ben knowned-as% esp
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 .
- 1. Base puntatore e dello stack pointer
- 2. Come srotolare lo stack per ottenere il backtrace per il puntatore dello stack specificato (SP)?
- 3. Recupero del puntatore dello stack corrente da/proc/pid/stat
- 4. GetCPUDescriptorHandleForHeapStart corruzione dello stack
- 5. Scopri se un puntatore punta verso lo stack, l'heap o il testo del programma?
- 6. Confusione per principianti sullo stack x86
- 7. Un puntatore punta a LSB o MSB?
- 8. x86/C++ - Puntatore al puntatore: Const viene violato dal compilatore?
- 9. Puntatore che punta a un array vuoto
- 10. Come viene determinato il puntatore dello stack di un'attività del kernel Linux per ogni thread?
- 11. Il costruttore ha chiamato con "questo" puntatore errato. È questa la corruzione dello stack?
- 12. Lettura dello stack stack per iOS Webkit
- 13. Il registro EBP (puntatore frame di base) è solo per Debug in x86?
- 14. Rilevamento dello stack pieno
- 15. C++ overflow dello stack
- 16. Assegnazione, riempimento e allineamento dello stack
- 17. Come si elimina un puntatore senza eliminare i dati a cui punta il puntatore?
- 18. Perché File.renameTo non cambia dove il file punta?
- 19. Perché l'architettura x86 utilizza due registri stack (esp; ebp)?
- 20. Variabile dello stack di restituzione?
- 21. free() sulla memoria dello stack
- 22. direzione di crescita dello stack
- 23. verificare se un puntatore punta a una particolare classe C++
- 24. Come passare un puntatore a funzione che punta al costruttore?
- 25. Puntatore di struttura che punta a un'istanza di struttura diversa
- 26. Android il rendering dello studio: un'eccezione di puntatore nullo
- 27. Go - Restituisce un puntatore nello stack
- 28. Come posso stampare il contenuto dello stack nel programma C?
- 29. Chiamata non gestita causando overflow dello stack
- 30. Puntatore allo stack pseudo-casuale sotto Linux?
I manuali di riferimento Intel includono pseudocodice per ciascuna istruzione. Per rispondere alla tua domanda, punta al valore più in alto nello stack. – DCoder