Oppure

Loading
29/10/12 11:17
web_pirate
Scusate tanto in anticipo se ho sbagliato sezione.
La mia domanda era questa:
Avendo un semplicissimo programma del tipo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
int a=6;

return 0;
}

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():
Dump of assembler code for function main:
   0x080483dc <+0>:	push   ebp
   0x080483dd <+1>:	mov    ebp,esp
   0x080483df <+3>:	sub    esp,0x10
   0x080483e2 <+6>:	mov    DWORD PTR [ebp-0x4],0x6
   0x080483e9 <+13>:	mov    eax,0x0
=> 0x080483ee <+18>:	leave  
   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:
(gdb) x/4x $esp
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...
aaa
29/10/12 12:58
nessuno
Documentati sullo

"stack frame"
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
29/10/12 13:31
Il Totem
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.
aaa
29/10/12 13:49
web_pirate
E ma qui non viene passato niente al main().
aaa
29/10/12 14:03
nessuno
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
29/10/12 15:00
web_pirate
Quindi quei valori sono casuali?
aaa
31/10/12 14:31
gigisoft
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.
aaa