Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在从高到低地址增长的调用堆栈中,数据元素是从低内存地址保存到高内存地址还是从低内存地址保存到高内存地址?_C_Mips_Callstack - Fatal编程技术网

C 在从高到低地址增长的调用堆栈中,数据元素是从低内存地址保存到高内存地址还是从低内存地址保存到高内存地址?

C 在从高到低地址增长的调用堆栈中,数据元素是从低内存地址保存到高内存地址还是从低内存地址保存到高内存地址?,c,mips,callstack,C,Mips,Callstack,在调用堆栈在内存中从高内存地址增长到低内存地址的体系结构中,假设堆栈指针最初位于较高的内存地址Y,并且在将整型参数保存到堆栈指针上后,堆栈指针指向较低的内存地址X。那么整型参数的第一个字节是否位于Xlower地址,或者在较高的地址?端度和堆栈增长方向不相关。如果在堆栈上存储一个32位整数,它将根据endianess存储4个字节。堆栈/堆栈指针不知道/不关心存储在那里的内容,数字本身也不知道/不关心它恰好在堆栈上分配 因此,对于big-endian,MS字节将始终存储在最低地址。无论您在内存中分配

在调用堆栈在内存中从高内存地址增长到低内存地址的体系结构中,假设堆栈指针最初位于较高的内存地址Y,并且在将整型参数保存到堆栈指针上后,堆栈指针指向较低的内存地址X。那么整型参数的第一个字节是否位于Xlower地址,或者在较高的地址?

端度和堆栈增长方向不相关。如果在堆栈上存储一个32位整数,它将根据endianess存储4个字节。堆栈/堆栈指针不知道/不关心存储在那里的内容,数字本身也不知道/不关心它恰好在堆栈上分配


因此,对于big-endian,MS字节将始终存储在最低地址。无论您在内存中分配到哪里。

Endianess和堆栈增长方向不相关。如果在堆栈上存储一个32位整数,它将根据endianess存储4个字节。堆栈/堆栈指针不知道/不关心存储在那里的内容,数字本身也不知道/不关心它恰好在堆栈上分配


因此,对于big-endian,MS字节将始终存储在最低地址。不管你把它分配到内存中的什么地方。

Endianness完全不相关,为什么还要提到它呢

你为什么不试试看呢?当然,这是特定于编译器/调用约定的,但是使用您关心的编译器很容易理解

void more_fun ( unsigned int, unsigned int );
void fun
(
    unsigned int a,
    unsigned int b,
    unsigned int c,
    unsigned int d,
    unsigned int e,
    unsigned int f
)
{
    more_fun(e,f);
}

00000000 <fun>:
   0:   8fa50014    lw  a1,20(sp)
   4:   8fa40010    lw  a0,16(sp)
   8:   08000000    j   0 <fun>
   c:   00000000    nop

Endianness完全不相关,为什么还要提到它呢

你为什么不试试看呢?当然,这是特定于编译器/调用约定的,但是使用您关心的编译器很容易理解

void more_fun ( unsigned int, unsigned int );
void fun
(
    unsigned int a,
    unsigned int b,
    unsigned int c,
    unsigned int d,
    unsigned int e,
    unsigned int f
)
{
    more_fun(e,f);
}

00000000 <fun>:
   0:   8fa50014    lw  a1,20(sp)
   4:   8fa40010    lw  a0,16(sp)
   8:   08000000    j   0 <fun>
   c:   00000000    nop
如果处理器是双向的,您仍然在询问依赖于处理器和编译器的endian。对于MIPS,请参见和-它是双端的

例如,您似乎想知道2个整数:A和B在其地址位置中是否有定义的顺序。C规范没有规定它。这取决于所使用的编译器和选项,这在文章中没有给出。

您仍然在询问endian,它依赖于处理器和编译器,如果处理器是双向的。对于MIPS,请参见和-它是双端的


例如,您似乎想知道2个整数:A和B在其地址位置中是否有定义的顺序。C规范没有规定它。它将取决于编译器和使用的选项,这在文章中没有给出。

假设在某个平台上,整数和寄存器的大小都是4字节。然后有两种可能的情况:

整数存储在SP中,然后SP递减:

      +---+
      |   |
      +   +
      | i |
      + n +      the integer that was pushed
      | t |
      +   +
.     |   |      X
.     +---+
.     | u |
.     + n +
.     | u |
.     + s +      unused (yet)
.     | e |
v     + d +
SP -> |   |      Y
      +---+  
SP递减,然后整数存储在SP中:

      +---+
      |   |
      +   +
      | ? |
      + ? +      previous push
      | ? |
      +   +
.     |   |      X
.     +---+
.     |   |
.     +  +
.     | i |
.     + n +      the integer that was pushed
.     | t |
v     +   +
SP -> |   |      Y
      +---+
使用哪种可能的方法取决于代码运行的平台


请注意,根据标准,不需要堆栈。这只是大多数C和其他语言编译器的一个实现细节。

假设在某个平台上,整数和寄存器的大小都是4字节。然后有两种可能的情况:

整数存储在SP中,然后SP递减:

      +---+
      |   |
      +   +
      | i |
      + n +      the integer that was pushed
      | t |
      +   +
.     |   |      X
.     +---+
.     | u |
.     + n +
.     | u |
.     + s +      unused (yet)
.     | e |
v     + d +
SP -> |   |      Y
      +---+  
SP递减,然后整数存储在SP中:

      +---+
      |   |
      +   +
      | ? |
      + ? +      previous push
      | ? |
      +   +
.     |   |      X
.     +---+
.     |   |
.     +  +
.     | i |
.     + n +      the integer that was pushed
.     | t |
v     +   +
SP -> |   |      Y
      +---+
使用哪种可能的方法取决于代码运行的平台


请注意,根据标准,不需要堆栈。这只是大多数C和其他语言编译器的实现细节。

数据的结尾通常不取决于堆栈的增长方向。但除非标准化,否则没有人能保证这一点。但事实并非如此。我同意,endianess与我的问题无关。我的意思是,第一个字节是在堆栈指针的新位置,即X,还是在堆栈指针的较早位置,即Y?整数的第一个字节是什么?@chux我的意思是,整数是从Y的较高地址开始,到X结束,还是从X的较低地址开始,到Y结束?或者换句话说,整数的第一个字节在Y,第四个字节在X,还是相反?@chux:如果我理解正确的话,是整数的字节具有最低的地址。换句话说,在big-endian中是顶部字节,在littel-endian中是底部字节。他实际上想知道堆栈指针是在存储整数之前递减,还是之后递减。答案当然是:这取决于平台。数据的端点通常不取决于堆栈的增长方向。但除非标准化,否则没有人能保证这一点。但事实并非如此。我同意,endianess与我的问题无关。我的意思是,第一个字节会在堆栈p的新位置吗
指针,即X,或堆栈指针的较早位置,即Y?整数的第一个字节是什么?@chux我的意思是,整数是从Y的较高地址开始,到X结束,还是从X的较低地址开始,到Y结束?或者换句话说,整数的第一个字节在Y,第四个字节在X,还是相反?@chux:如果我理解正确的话,是整数的字节具有最低的地址。换句话说,在big-endian中是顶部字节,在littel-endian中是底部字节。他实际上想知道堆栈指针是在存储整数之前递减,还是之后递减。答案当然是:这取决于平台。请查看我之前的评论。我去掉了末端部分。“你现在能回答吗?”笨蛋,这个问题已经没有任何意义了。定义第一个字节。我无法用文字表达它…我的意思是,整数是从堆栈指针的初始位置开始,然后在堆栈指针的新位置结束,还是从SP的新位置开始,然后在较早的位置结束?请查看我之前的注释。我去掉了末端部分。“你现在能回答吗?”笨蛋,这个问题已经没有任何意义了。定义第一个字节。我无法用文字表达它…我的意思是,整数是从堆栈指针的初始位置开始,然后在堆栈指针的新位置结束,还是从SP的新位置开始,然后在较早的位置结束?