DonJ ha scritto:ricordati che lo stack è una struttura di tipo LIFO
non è vero
è una struttura FIFO
____________________________________________________________________
Ok
siccome avevo bisogno di dare una ripassata ad assembly ho dato un occhio.
dunque,
a quanto ho capito EBP si usa programmando assembly con un compilatore c
nel sistema che uso io EBP viene sostituito da BP, quindi io farò riferimento a BP
ma dovrebbe essere la stessa cosa.
come funziona questo accidente:
molto semplicemente il registro BP contiene
l'ultimo indirizzo di memoria dello stack.
questo significa che utilizzando BP in un indirizzamento otterremo l'ultimo valore inserito nella pila dello stack.
mettiamo caso che nella pila sia presente il valore 00011001
utilizzando l'istruzione:
MOV AL, [BP]
in AL troveremo 00011001, questo perché il contenuto dell'indirizzo BP ( contenuto di BP = [BP] ) fa riferimento al valore in cima alla pila.
chiaramente un'istruzione così fa abbastanza ridere perché basterebbe fare un POP AL.
BP torna utile nel caso un valore finisca sotto a degli altri valori.
ad esempio:
- Codice: Seleziona tutto
======STACK======
valore a [16 bit] <---- BP (indica l'ultimo valore della pila)
valore b [16 bit]
valore c [16 bit]
valore x [16 bit]
..
..
=================
mettiamo il caso che io bravo programmatore abbia voglia (e magari anche la necessità) di recuperare
x.
il manuale del buon programmatore ci ricorda che BP contiene l'indirizzo dell'ultimo valore.
quindi, come faccio a recuperare un valore che sta a 3 passi da BP?
beh, basta fare BP-3
MOV AX, [BP-3]
funziona?
sì ma no
sì perché il compilatore non dice niente
no perché i valori nello stack sono a 16 bit!
spiego meglio:
lo stack è un vettore che può contenere valori ad 8 bit, e quelli a 16, al momento del push, vengono "spezzati" in due parti
cioè:
PUSH AX
nello stack:
- Codice: Seleziona tutto
======STACK======
AL <---- BP
AH
..
..
=================
[ora, non mi ricordo se in cima c'è AL o AH, ma il concetto non cambia]
quindi ricorda che quando devi fare i calcoli devi considerare che un valore a 16 bit occupa due celle di memoria
tornando al nostro esempio:
- Codice: Seleziona tutto
======STACK======
valore a [low] <---- BP
valore a [high]
valore b [low]
valore b [high]
valore c [low]
valore c [high]
valore x [low]
valore x [high]
..
..
=================
abbiamo 3 valori da 16 bit all'interno dello stack
quindi per raggiungere
x dovremo fare BP - 3*2 = BP - 6
MOV AX, [BP-6]
adesso in AX è presente il nostro amico
xtips & tricks:
ricorda che quando viene chiamata una procedura, nello stack vengono sempre aggiunti IP e DS
se prima di una chiamata hai fatto un PUSH AX, per andare a recuperare il valore dovrai fare
MOV AX, [BP-4]
così salterai IP e DS che vengono prima.
ancora una volta, spero di essere stato chiaro.