Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Salvataggio variabile nello stack
Forum - C/C++ - Salvataggio variabile nello stack

Avatar
web_pirate (Normal User)
Rookie


Messaggi: 51
Iscritto: 27/12/2011

Segnala al moderatore
Postato alle 12:17
Lunedì, 29/10/2012
Scusate tanto in anticipo se ho sbagliato sezione.
La mia domanda era questa:
Avendo un semplicissimo programma del tipo:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(){
  6. int a=6;
  7.  
  8. return 0;
  9. }


so già in partenza che a, essendo una variabile locale, verrà salvata nello Stack. Ora, dando in pasto il programma al caro GDB, mettendo un break prima del termine del programma e facendo "disas", mi vengono fuori tutte le istruzioni in linguaggio assembly del main():
Codice sorgente - presumibilmente Delphi

  1. Dump of assembler code for function main:
  2.    0x080483dc <+0>:     push   ebp
  3.    0x080483dd <+1>:     mov    ebp,esp
  4.    0x080483df <+3>:     sub    esp,0x10
  5.    0x080483e2 <+6>:     mov    DWORD PTR [ebp-0x4],0x6
  6.    0x080483e9 <+13>:    mov    eax,0x0
  7. => 0x080483ee <+18>:    leave  
  8.    0x080483ef <+19>:    ret


La variabile a è lì a <main+6>. Ora, lo stack so che inizia la dove punta il registro ESP, quindi in una di quelle locazioni di memoria che vanno dal valore puntato da ESP, fino alla fine dello stack, dovrei trovare la mia variabile, e infatti, se do a GDB x/4x $esp, ecco che mi scrive:
Codice sorgente - presumibilmente Plain Text

  1. (gdb) x/4x $esp
  2. 0xbffff2a8:     0x080483f9      0xb7fc5000      0x080483f0      0x00000006


La mia domanda è: perché il valore 6 non si trova alla prima locazione puntata da ESP ma alla quarta? Cosa sono quei 3 valori che ci sono prima e che sono sempre gli stessi ad ogni esecuzione? Grazie mille in anticipo...

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:58
Lunedì, 29/10/2012
Documentati sullo

"stack frame"


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 14:31
Lunedì, 29/10/2012
Ora non ricordo precisamente l'ordine di allocazione, ma prima dello spazio per le variabili locali ci dovrebbe essere quello per i parametri della funzione chiamata e per il frame pointer. Se a main vengono passati argv e argc (entrambi interi), dovrebbe essere corretto.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
web_pirate (Normal User)
Rookie


Messaggi: 51
Iscritto: 27/12/2011

Segnala al moderatore
Postato alle 14:49
Lunedì, 29/10/2012
E ma qui non viene passato niente al main().

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:03
Lunedì, 29/10/2012
A te sembra che non sia passato nulla ma il compilatore passa comunque argc, argv


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
web_pirate (Normal User)
Rookie


Messaggi: 51
Iscritto: 27/12/2011

Segnala al moderatore
Postato alle 16:00
Lunedì, 29/10/2012
Quindi quei valori sono casuali?

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 15:31
Mercoledì, 31/10/2012
Testo quotato

Postato originariamente da web_pirate:

Quindi quei valori sono casuali?



quasi, nel senso che, non essendo materialmente passati dei valori per argc e argv, in quelle locazioni viene lasciato ciò che già c'era prima dell'allocazione.

Ciao.


Le cose si fanno per bene o non si fanno affatto
PM Quote