Na przykład, jeśli pchnął ax jest [SP] wskazuje na moją wartość ax lub słowo po ax? Czy różni się on od trybu rzeczywistego do chronionego? Pytam o to, ponieważ Art of Assembly Book ilustruje i wyjaśnia jako punkty sp ostatnio przesłane dane, i na tej stronie ilustruje to, jak wskazuje puste słowo po ostatnich pchniętych danych.x86 gdzie wskazuje wskaźnik stosu?
Odpowiedz
Wikipedia mówi here:
Stos jest realizowany z niejawnie zmniejszanie (Push) i zwiększany (pop) wskaźnik stosu. W trybie 16-bitowym ten niejawny wskaźnik stosu jest adresowany jako SS: [SP], w trybie 32-bitowym jest to SS: [ESP], aw trybie jest to [RSP]. Wskaźnik stosu wskazuje na ostatnią wartość , która została zapisana, przy założeniu, że jej rozmiar będzie zgodny z trybem pracy procesora (tj. 16, 32 lub 64 bity) z dopasowaną domyślną szerokością instrukcje push/pop/call/ret.
W ten sposób moja pamięć zwrotna mówi, że działa.
OK, dziękuję, ale czy masz jakiś pomysł, dlaczego osdev wiki ilustruje esp po końcu stosu. Czy to błąd? – user1180619
Możesz spróbować. Naciśnij coś dziwnego na stosie, a następnie sprawdź, czy [esp] ma tę samą wartość. Wypróbuj kilka wartości, aby upewnić się, że nie jest to przypadek. –
@ user1180619: Stosy działają do góry nogami.Zaczynają od wysokiego adresu i pracują stamtąd. Nie wiem dlaczego, ale tak właśnie jest. – Linuxios
push eax
jest równoznaczne z:
sub esp, 4
mov [esp], eax
Więc po naciśnięciu, esp
odbędzie adres popychane wartości.
Myślę, że rozumiem, dlaczego OP zadaje to pytanie. Dlaczego pierwsza zmienna to 8 bajtów z SP, a nie 4?
Po niektórych badań znalazłem this co wskazuje, że:
SP + 0 jest stary EBP SP + 4 jest stary EIP (wskaźnik instrukcji)
Stąd naturalnie, pierwszy parametr jest SP + 8.
w x86_64 punkt stos jest w rejestrze% RSP który w dolnej części 32bit jest dobrze knowned jako% esp
Zgodnie Lee Meador i odpowiedzi Cory Nelsona, punkty wskaźnik stosu na ostatniej wartości, które został pchnięty.
od Intel® 64 oraz IA-32 architektury oprogramowania programisty Manual Volume 2 (2A, 2B & 2C): Zestaw instrukcji, AZ, pierwsza linia z opisu instrukcji PUSH brzmi następująco:
Zmniejsza wskaźnik stosu, a następnie zapisuje operand źródłowy na szczycie stosu.
- 1. SP (wskaźnik stosu) Anti-debug Sztuczka - x86
- 2. bazowy wskaźnik i wskaźnik stosu
- 3. Czy wskaźnik wskazuje na LSB lub MSB?
- 4. Wskaźnik do obiektu stosu bez własności
- 5. Nullptr i sprawdzanie, czy wskaźnik wskazuje na poprawny obiekt
- 6. Sprawdź, czy wskaźnik wskazuje na stos, stertę lub tekst programu?
- 7. Jak określa się wskaźnik stosu jądra Linux dla każdego wątku?
- 8. Gdzie CUDA przydziela ramkę stosu dla jądra?
- 9. Jawnie ustawiono wskaźnik stosu początkowego ze skryptem konsolidatora
- 10. Gdzie jest udokumentowany system V ABI x86-64?
- 11. Gdzie sprawdzasz prototypy syscalls na maszynach x86-64?
- 12. Minimalizacja dystans parowania wskazuje
- 13. Punkt przerwania wskazuje "objc_autoreleaseNoPool"
- 14. Podwójny wskaźnik dereferencji po dereferencji
- 15. Czy można określić w czasie wykonywania wskaźnik wskazuje na klasę C++ lub na klasę Objective-C?
- 16. Zakłopotanie początkującego o stosie x86
- 17. W jaki sposób GDB określa dno stosu?
- 18. Przydział pamięci stosu i stosu sterty
- 19. "Twoja APP_BUILD_SCRIPT wskazuje na nieznany plik: ./jni/Android.mk"
- 20. wskazuje obcięcie w ToolTipStatusLabel automatycznie
- 21. x64 względy wydajności x86 .Net
- 22. Dziwne przepełnienie stosu?
- 23. MIPS: odpowiednie zastosowanie dla wskaźnika stosu ($ sp) i stosu
- 24. Dlaczego rejestry x86 są takie, jakimi są?
- 25. Czy rejestr EBP (wskaźnik ramki podstawowej) służy tylko do debugowania w x86?
- 26. zamieszanie o wywołaniu funkcji stosu
- 27. Adresowanie zmiennych stosu
- 28. Gwarancja inicjalizacji rekordu stosu
- 29. Czy ten "wskaźnik" może być inny niż wskaźnik obiektu?
- 30. x86/x64 Dodaj Przesunięcie adresowania
Podręczniki referencyjne Intela zawierają pseudokod dla każdej instrukcji. Aby odpowiedzieć na pytanie, wskazuje ono najwyższą wartość na stosie. – DCoder