2014-09-24 8 views
5

Nie rozumiem, co naprawdę robi pop w zestawie. Czy pop przesuwa na koniec wartość o wartości PUSH (co oznacza, że ​​nie ma ona zastosowania, jeśli mamy MOV wartość po ostatnim elemencie ed) lub czy po prostu wyskakuje ona z wartości, która jest ostatnia na stosie (w związku z tym dotyczy zarówno MOV i PUSH), czy też ma to, co kiedykolwiek wartość wskazywana przez wskaźnik stosu? Rozważmy następujący kod:Jak działa funkcja push i pop w zespole?

push $4 
mov $5, -4(%esp) 
add $4, %esp (esp pointing to an unknown value) 
pop %ebp 

Więc w tym kodzie będzie wartość poped do ebp być 4, 5 lub nieznane wartości wskazywanej przez esp?

+0

Możliwy duplikat [rejestrów Assembler: Push/pop?] (Http://stackoverflow.com/questions/4584089/assembler-push-pop-registers) –

Odpowiedz

13

tym ostatnim

POP EBP 

odpowiada

MOV EBP, [ESP] 
ADD ESP, 4   ; but without modifying flags, like LEA ESP, [ESP+4] 

(składni Intel - tarczę na lewo, źródło po prawej)

+0

, więc pop w rzeczywistości nie usuwa wartości ze stosu, po prostu go przenosisz? – user3769877

+2

To prawda, jednak przyrost ESP skutecznie ukrywa go przed dalszym dostępem. Teoretycznie przerwanie może nastąpić zaraz po tym i ponownie wykorzystać ten obszar stosu do przechowywania, ale nie sądzę, aby przerwania używały już stosu pierścienia 3. –

+0

W przestrzeni użytkownika procedury obsługi sygnału mogą asynchronicznie sterować kloberem stosu. W Linuksie bez zainstalowanych sterowników sygnału, myślę, że możesz liczyć na przestrzeń poniżej 'esp', która nie będzie asynchronicznie blokowana, ale nadal nie jest gwarantowana przez ABI. (W systemie x86-64 V znajduje się czerwona strefa 128B poniżej RSP, która gwarantuje, że nie będzie ona blokowana, nawet przez moduły obsługi sygnału, ale Windows tego nie robi). –

9

NAC służy:

ESP := ESP-4 ; for x86; -8 for x64 
MEMORY[ESP]:=<operandvalue> 

POP robi:

<operandtarget>:=MEMORY[ESP]; 
ESP:=ESP+4 ; for x86; +8 for x64 

Znacznie łatwiej zrozumieć, jakie instrukcje obsługi komputera wykonujesz, pisząc ich opisy w sposób podobny do tego. Podręczniki referencyjne Intela są pełne takiego pseudo kodu, i warto poświęcić czas i kłopoty, aby je zdobyć, i przeczytać szczegóły dla siebie.

Odnośnie do konkretnego pytania: Twój sklep z 5 USD na -4 (% esp) jest prawidłową instrukcją urządzenia, a procesor wykona go bez zarzutu, ale jest to naprawdę bardzo niebezpieczne programowanie. Jeśli procesor bierze pułapkę lub przerywa zaraz po tej instrukcji, stan procesora (zwykle jest zapisywany "na szczycie stosu") i nadpisze twoją wartość. Ponieważ przerwania występują asynchronicznie, zaobserwowane zachowanie rzadko powoduje utratę 5 USD. To sprawia, że ​​bardzo trudny program do debugowania.

"Dodaj 4 USD" przenosi ESP z powrotem do miejsca przed instrukcji push. Nie można więc powiedzieć nic o wartości wyświetlanej w ebp, z wyjątkiem tego, że jest "nieznana", jak zasugerowałeś jako jedna z opcji.

Powiązane problemy