我理解堆栈了吗?请纠正我

时间:2014-02-18 14:09:14

标签: variables memory assembly x86 stack

我的代码用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  |                  |  ?
                                                  ------------------

我的问题: 当我们推入堆栈时,我们这样做吗? enter image description here

1)我的意思是我们在堆栈末尾用更高的地址值推送数据?

2)或者我们用较低的地址值推送堆栈顶部的数据?

3)每个堆栈占用多少内存地址?这取决于什么?

由于

1 个答案:

答案 0 :(得分:3)

在x86计算机上 ,如果编译器没有做任何特别的事情,堆栈将向下增长。在push上,堆栈指针将按推送的大小递减,push ed数据将转到堆栈的较低地址。

pop上,堆栈指针将以pop的大小递增。

我不是在评论MIPS,即使你在问题中提到它,因为:

  1. 我对MIPS架构一无所知
  2. 您的问题已标记为x86
  3. 关于堆栈上每个变量的大小,这是100%编译器相关的,所以我不能对此发表评论。