Ciao ,
Sto leggendo questo
https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames [Standard Entry Sequence]
Se ho capito bene spiega la differenza che intercorre tra valori passati in una funzione e valori locali presenti all'interno della funzione.
Vorrei fare qualche domanda .
Non so se avrete voglia di leggere , ma preferisco fare così che chiedere come funziona lo stack
Nel codice x86 che segue , se ho capito bene , EBP legge dallo stack l'indirizzo di base della memoria dedicata allo stack ( base address)
1) - Da cosa dipende il valore di base address ?Dipende forse dall'OS ?
Dopo EPB ( il pointer) punta anch'esso al valore di base address. Questo vuole dire che il pointer punta all'inizio dello stack.
Le prime due righe di codice servono quindi ad inizializzare lo stack.
caso Variabili Locali
section .text
global _start
_start:
push ebp
mov ebp,esp
sub esp, 12 ; space allocated on the stack for the local variables
call _MyFunction
2) Perchè sottraendo un offset di 12 byte ( 3 DW) sono sicuro di allocare spazio . Cosa vuole dire allocare ?
Quando chiamo la funzione con variabili locali , la situazione dello stack è la seguente:
Ho un offset di 3 DW che equivale allo spazio massimo previsto per la variabili locali di quella funzione. Questo vuole dire allocare ?
caso passaggio di parametri copiandone il valore
section .text
global _start
_start:
push ebp
mov ebp,esp
push 2
push 5
push 10
call _MyFunction2
Inizializzazione stack come sopra , ma non alloco nulla.
Nel caso di chiamata di funzione il prossimo opcode e push. Se passo tre parametri avrò in sequenza tre push.
push decrementa l'indirizzo del pointer (ESP) dopo aver salvato il valore nello stack.
Perchè decremento?:
Dal punto di vista aritmetico si tende a raggiungere valori di indirizzo più basso quando occupo memoria nello stack. Lo stack cresce verso il basso,