Я так понимаю стек? пожалуйста, поправьте меня

У меня есть этот код, написанный на c:

int main(){
  double x, y;
  int a, b, c;
  int *p;

и я имею:

sizeof(int)=4
sizeof(double)=8

Является ли структура памяти такой? Подробнее в графическом режиме:

IN MEMORY:(whole memory)
  LE = Little Endian  (INTEL)
  BE = Big Endian     (MIPS)

                                                  ------------------
                                    0x00000000   |                  | ?
                                                  ------------------
                                         .                 .
                                         .                 .
                                         .                 .
                                                  ------------------
                                    0x0012ff60   |  64(LE)  00(BE)  | 
                                                  ------------------
                                                  ------------------
                                    0x0012ff61   |  ff(LE)  12(BE)  | 
                                                  ------------------
                                                  ------------------
                                    0x0012ff62   |  12(LE)  ff(BE)  | 
                                                  ------------------
                                                  ------------------
                                    0x0012ff63   |  00(LE)  64(BE)  | 
                                                  ------------------

                                                  ------------------
                                    0x0012ff64   | 00(LE)   00(BE)  |  c         if c = 256        (base10)
                                                  ------------------                c = 0x00000100 (base16)
                                                  ------------------
                                    0x0012ff65   | 01(LE)   00(BE)  |  c   0x0012ff64 points to c variable
                                                  ------------------       0x0012ff64 is a pointer
                                                  ------------------
                                    0x0012ff66   | 00(LE)   01(BE)  |  c
                                                  ------------------
                                                  ------------------
                                    0x0012ff67   | 00(LE)   00(BE)  |  c 
                                                  ------------------
                                                  ------------------
                                    0x0012ff68   |                  |  b
                                                  ------------------
                                                           .
                                                           .
                                                           .
                                                  ------------------
                                    0x0012ff6c   |                  |  a
                                                  ------------------
                                                           .
                                                           .
                                                           .
                                                  ------------------
                                    0x0012ff70   |                  |  y
                                                  ------------------
                                                  ------------------
                                    0x0012ff71   |                  |  y
                                                  ------------------  
                                                  ------------------
                                    0x0012ff72   |                  |  y
                                                  ------------------
                                                  ------------------
                                    0x0012ff73   |                  |  y
                                                  ------------------
                                                  ------------------
                                    0x0012ff74   |                  |  y
                                                  ------------------
                                                  ------------------
                                    0x0012ff75   |                  |  y
                                                  ------------------
                                                  ------------------
                                    0x0012ff76   |                  |  y
                                                  ------------------
                                                  ------------------
                                    0x0012ff77   |                  |  y
                                                  ------------------
                                                          .
                                                          .
                                                          .
                                                  ------------------
                                    0x0012ff78   |                  |  x
                                                  ------------------
                                                          .
                                                          .
                                                          .
                                                  ------------------
                                    0xfffffffff  |                  |  ?
                                                  ------------------

Мой вопрос: когда мы помещаем что-то в стек, мы делаем это? введите здесь описание изображения

1) Я имею в виду, что мы помещаем данные в конец стека с более высоким значением адреса?

2) или мы помещаем данные на вершину стека с более низким значением адреса?

3) сколько адресов памяти занимает каждый стек? Это зависит от чего?

Спасибо


person MLSC    schedule 18.02.2014    source источник
comment
Регистр ebb указывает не на указатель инструкции возврата, а на ebp предыдущей функции.   -  person BlackBear    schedule 18.02.2014
comment
Не забывайте, что компилятор может (и, вероятно, будет) хранить локальные переменные в регистрах - некоторые или все из них могут вообще не находиться в стеке.   -  person Brendan    schedule 18.02.2014
comment
Обратите внимание, что даже значение регистра EBP может зависеть от компилятора: при использовании оптимизаций EBP может даже не использоваться вообще. Однако в большинстве случаев стек на машинах x86 работает так, как вы его поняли. Однако на x86 все данные имеют обратный порядок байтов!   -  person Martin Rosenau    schedule 18.02.2014


Ответы (1)


На машине x86, если компилятор не делает ничего экстраординарного, стек будет расти вниз. На push указатель стека будет уменьшаться на размер проталкивания, а данные pushed перейдут на нижние адреса стека.

На pop указатель стека будет увеличиваться на размер всплывающего окна.

Я не комментирую MIPS, хотя вы упомянули об этом в своем вопросе, потому что:

  1. Я ничего не знаю об архитектуре MIPS
  2. ваш вопрос помечен x86.

Что касается размера каждой переменной в стеке, это на 100% зависит от компилятора, поэтому я не могу это комментировать.

person Nathan Fellman    schedule 18.02.2014
comment
Хорошо, мне все равно на MIPS, правильно ли я написал структуру памяти для INTEL? У меня есть 3 вопроса в моем посте, и я был бы благодарен, если бы вы ответили более подробно :) - person MLSC; 18.02.2014
comment
Он также спросил о (общем) размере (я думаю). Это выбирается компилятором (и часто ограничивается операционной системой). В gcc вы можете изменить его с помощью опции --stack. Типичное значение на современных машинах — 1 МБ; современный Linux часто имеет ограничение в 10 МБ (ulimit -s). - person TypeIA; 18.02.2014
comment
@MortezaLSC: выглядит вполне нормально. Также обратите внимание, что вы задали два вопроса, так как (1) и (2) противоположны друг другу. - person Nathan Fellman; 18.02.2014
comment
@ Натан Феллман Так что это не важно в верхней или в конце стека... точка the pushed data will go onto the lower addresses of the stack. Правильно? - person MLSC; 18.02.2014
comment
В моем понимании памяти я показываю адреса от 0x00000000 вверху до 0xfffffffff внизу..но изображение это что-то другое...да? :( - person MLSC; 18.02.2014
comment
@MortezaLSC: фактические адреса зависят от значений регистра сегмента стека (SS) и начального значения указателя стека (ESP). В общем, было бы неразумно делать предположения об этих значениях. - person Nathan Fellman; 18.02.2014