2014-09-24 25 views
5

Mi sto confondendo su cosa fa effettivamente pop in assembly. Il valore PUSH sposta il valore PUSH nello stack per ultimo (ovvero non si applica se abbiamo MOV un valore dopo l'ultimo elemento PUSH ed) o si inserisce solo il valore che è ultimo in pila (quindi, applicabile a entrambi MOV e PUSH) o si apre quale valore mai indicato dal puntatore dello stack? Si consideri il seguente codice:come funziona il push and pop nell'assemblaggio

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

Quindi, in questo codice sarà il valore poped in ebp essere 4, 5, o il valore sconosciuto puntato da esp?

+0

Possibile duplicato di [Assembler: registri Push/Pop?] (Http://stackoverflow.com/questions/4584089/assembler-push-pop-registers) –

risposta

13

Quest'ultimo

POP EBP 

è equivalente a

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

(nella sintassi Intel - bersaglio sulla sinistra, fonte a destra)

+0

così pop non rimuove il valore dallo stack, lo muovi? – user3769877

+2

Ciò è corretto, tuttavia l'incremento di ESP lo nasconde in modo efficace da un ulteriore accesso. Teoricamente, un interrupt potrebbe accadere subito dopo e riutilizzare quell'area dello stack per l'archiviazione, ma in realtà non credo che gli interrupt usino più lo stack dell'anello 3. –

+0

Nello spazio utente, i gestori di segnale possono raggruppare in modo asincrono lo stack. In Linux senza gestori di segnale installati, penso che puoi contare sullo spazio sotto 'esp' per non essere biasimato in modo asincrono, ma non è ancora garantito dall'ABI. (Nel sistema V x86-64, c'è una zona rossa da 128B sotto RSP che è garantita non essere danneggiata, anche dai gestori di segnale, ma Windows non ha questo.) –

9

PUSH fa:

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

POP fa:

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

È molto più facile da capire che cosa istruzioni macchina fanno se si scrivono le loro descrizioni giù in pseudo-codice come questo. I manuali di riferimento Intel sono pieni di tale pseudo codice, e vale la pena dedicare tempo e problemi per ottenerli e leggere i dettagli per conto tuo.

Per quanto riguarda la tua domanda specifica: il tuo negozio di $ 5 in -4 (% esp) è un'istruzione macchina valida, e il processore la eseguirà senza lamentarsi, ma è una programmazione davvero estremamente pericolosa. Se il processore prende una trappola o interrompe subito dopo tale istruzione, lo stato del processore (di solito) viene salvato "in cima allo stack" e sovrascrive il valore. Poiché gli interrupt si verificano in modo asincrono, il comportamento che vedrai è che, raramente, i $ 5 vengono persi. Questo rende estremamente difficile il debug di un programma.

"aggiungi $ 4" riporta l'ESP sul luogo prima dell'istruzione. Quindi, non puoi dire nulla riguardo al valore inserito in ebp eccetto che è "sconosciuto" come hai suggerito come una delle tue opzioni.