Originariamente inviato da AR64S-H
Qualkuno mi sa dire come si fa a capire in quale luogo del record di attivazione vanno le variabili. Ecco un esempio di record di attivazione di un esercizio:
# R | ... |
# E +- +---------------+
# C | | EBP vecchio | <-- %EBP (link dinamico)
# O | +---------------+
# R | | ind.ritorno | <-- +4(%EBP) (link statico)
# D | +---------------+
# | | ind.matr | <-- +8(%EBP) (I argomento)
# A | +---------------+
# T | | dim | <-- +12(%EBP) (II argomento)
# T +- +---------------+
# | ... |
#
perkč dim va al 12(%ebp) e magari una variabile lim va a -4(%ebp) e perkč ind. ritorno va a 4(%ebp) e ind.matr a 8(%ebp) piuttosto ke il contrario. Non riesco a capire questo il resto l'ho capito questo no
Supponendo di lavorare a 32 bit, con una procedura che usa la convenzione di passaggio "cdecl", si ha la seguente situazione:
Il chiamante ha un codice del tipo:
codice:
PUSH arg N
PUSH arg N-1
....
PUSH arg 2
PUSH arg 1
CALL Procedure
ADD ESP,args_size
La procedura chiamata ha un codice del tipo:
codice:
PUSH EBP
MOV EBP,ESP
SUB ESP,locals_size
....
....
MOV ESP,EBP
POP EBP
RET
Lo stack frame quindi č composto cosě:
codice:
32 bit
/ \
| |
+---------+
| arg N | EBP+??
+---------+
| arg N-1 |
+---------+
| ... |
+---------+
| ... |
+---------+
| arg 2 |
+---------+
| arg 1 | EBP+8
+---------+
| old EIP | EBP+4
+---------+
| old EBP | EBP
+---------+
| local | EBP-4
+---------+
| ... |
+---------+
| ... |
+---------+
| local | <-- ESP
+---------+
| |