相关疑难解决方法(0)

为什么堆栈通常会向下增长?

我知道在我个人熟悉的架构(x86,6502等)中,堆栈通常会向下增长(即,每个推入堆栈的项目都会导致SP递减,而不是递增的SP).

我想知道这个的历史原因.我知道在一个统一的地址空间中,在数据段的另一端(例如)开始堆栈很方便,所以如果双方在中间发生碰撞,那么只会出现问题.但是为什么堆栈传统上是最重要的?特别是考虑到这与"概念"模型的对立面如何?

(请注意,在6502架构中,堆栈也向下增长,即使它被限制在一个256字节的页面上,这个方向选择似乎是任意的.)

architecture stack history

87
推荐指数
5
解决办法
2万
查看次数

堆栈是向上还是向下增长?

我在c中有这段代码:

int q = 10;
int s = 5;
int a[3];

printf("Address of a: %d\n",    (int)a);
printf("Address of a[1]: %d\n", (int)&a[1]);
printf("Address of a[2]: %d\n", (int)&a[2]);
printf("Address of q: %d\n",    (int)&q);
printf("Address of s: %d\n",    (int)&s);
Run Code Online (Sandbox Code Playgroud)

输出是:

Address of a: 2293584
Address of a[1]: 2293588
Address of a[2]: 2293592
Address of q: 2293612
Address of s: 2293608
Run Code Online (Sandbox Code Playgroud)

所以,我看到,从那里a开始a[2],内存地址每个增加4个字节.但是,从qs,内存地址减少了4个字节.

我想知道两件事:

  1. 堆栈是成长还是下降?(在这种情况下看起来对我来说都是)
  2. a[2]q内存地址之间发生了什么?为什么那里存在很大的记忆差异?(20个字节).

注意:这不是作业问题.我很好奇堆栈是如何工作的.谢谢你的帮助.

c memory stack

82
推荐指数
4
解决办法
6万
查看次数

什么是用于微处理器的堆栈指针?

我正准备进行微处理器考试.如果使用程序计数器来保存下一条指令的地址,那么堆栈指针的用途是什么?

stack microprocessors

49
推荐指数
3
解决办法
11万
查看次数

C是否需要堆栈和堆才能运行?

人们谈论堆栈和堆是什么以及它们之间的差异.但我很想知道如果一个CPU不支持堆栈和堆结构,那么C可以在没有堆栈和堆的情况下正常运行吗?

c heap stack

9
推荐指数
2
解决办法
310
查看次数

为什么函数调用而不是变量地址用于检测堆栈增长方向?

我读到了检测堆栈增长检测问题的不同响应,我理解,在现代架构中,堆栈可能会随机增长,可能会在堆外创建,依此类推.

但是,在这个经典的访谈问题中,我想了解为什么人们使用函数调用而不是在同一函数中比较2个局部变量.我认为必须有一些特殊的理由这样做,但不是一个C /低级开发人员[Java :)],我只是在猜测.

这是我试过的代码:

void sub (int *a)  {
    int b;
    int c;
    printf ("a:%d\n", a);
    printf ("b:%d\n", &b);
    printf ("c:%d\n", &c);
    if (&b > a) {
        printf ("Stack grows up.\n");
    } else {
        printf ("Stack grows down.\n");
    }
}

int main (void) {
    int a;
    int b;
    sub (&a);
    printf ("\nHere we go again!!\n");
    if (&b > &a)  {
        printf ("Stack grows up.\n");
    } else  {
        printf ("Stack grows down.\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我还发现这篇文章试图优化我不理解的解决方案:http …

c c++ stack low-level

8
推荐指数
3
解决办法
617
查看次数

关于C/C++堆栈分配

在学习C++(和C)时,我对堆栈分配的工作有一些特别的疑问,我无法找到解决方案:

  1. 堆栈分配是否隐式调用malloc/free函数?如果不; 它如何确保堆栈分配和堆分配之间没有冲突?

  2. 如是; C++中的堆栈分配是否也隐式调用new/delete?如是; 重载一个类的new运算符会影响它的堆栈分配吗?

它在VC++中产生了令人困惑的结果; 但由于VC++并不完全符合标准(或者我听说过),我决定在这里问一下......

c c++ heap stack memory-management

6
推荐指数
5
解决办法
2万
查看次数

字节序和堆栈增长方向之间的关系

处理器的字节序与堆栈增长方向之间是否存在关系?

例如,x86 架构小端的,堆栈向下增长(即它从最高地址开始,并随着每个push操作向低地址增长)。类似地,在大端的SPARC 体系结构中,堆栈从最低地址开始并向上增长到更高的地址。

这种关系模式几乎可以在所有架构中看到。我相信这个未说明的约定一定是有原因的。这可以从计算机架构或操作系统的角度解释吗?这是为了对处理器内部的微码进行一些优化吗?这是否以某种方式帮助内核?或者可能是其他原因?

提前致谢!

embedded callstack cpu-architecture endianness

6
推荐指数
2
解决办法
2250
查看次数

我可以为升序堆栈增长方向配置ARM处理器吗?

这里有一个问题涉及堆栈增长方向.Michael Burr在ARM处理器中回复说过,可以配置堆栈增长方向 - 即下降(正常行为)堆栈在内存中向零地址(低地址)增长或向上增长,即堆栈向内存中的更高地址增长.

在大多数现代系统中,堆栈增长的方向是什么?

我的问题是:在ARM处理器中,如何让堆栈在向上的方向上增长?

如何将堆栈配置为升序,默认情况下是降序?任何寄存器位设置/复位等

stack arm

5
推荐指数
1
解决办法
2850
查看次数

我的堆栈是向上而不是向下增长吗?

据我所知,堆栈假设向下增长.

我试着运行这段代码:

#include<stdio.h>

void func(char* a1, int a2, int a3) {

    char b1[10];
    int b2;
    int b3;

    printf("a3 address is: %p\n", &a3);
    printf("a2 address is: %p\n", &a2);
    printf("a1 address is: %p\n", &a1);
    printf("-----------------------\n");
    printf("b1 address is: %p\n", &b1);
    printf("b2 address is: %p\n", &b2);
    printf("b3 address is: %p\n", &b3);
}


int main() {
    func("string",2,3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果不像我预期的那样:

a3 address is: 0x7fff68473190
a2 address is: 0x7fff68473194
a1 address is: 0x7fff68473198
-----------------------
b1 address is: 0x7fff684731b0
b2 address is: 0x7fff684731a8
b3 address …
Run Code Online (Sandbox Code Playgroud)

c gcc

5
推荐指数
1
解决办法
142
查看次数

C程序找到堆栈增长的方向

如何在C中找到堆栈正向或反向进展?这项工作?

int j = 0;
int k = 0;

if (&k > &j) 
 printf ("Stack is growing in forward direction");

else if (&k < &j) 
  printf ("Stack is growing in reverse direction");
Run Code Online (Sandbox Code Playgroud)

c stack

3
推荐指数
2
解决办法
1万
查看次数

DRAM中的堆栈是什么(在递归过程中会发生什么)?

我只想更好地了解堆栈在地址空间中的含义(即您有代码/文本,堆,数据和堆栈)

基本上我的理解是堆栈包含局部变量,但是数据包含什么和堆栈包含什么之间的区别是什么?是不是数据变量?

如果程序对函数的递归调用a()是否意味着对于每个递归级别都有一个新的堆栈?

recursion ram callstack operating-system

2
推荐指数
1
解决办法
533
查看次数

所需的最小装配说明是什么?

如果您要构建一个用于运行任意程序的处理器,那么您可以使用的最小指令集(ISA)是什么?

我刚在想:

  • ALU-ops(add,sub,mul,div)

  • 加载reg,[地址]

  • 商店注册,[地址]

  • 分支 - 如果操作.可能有分支,如果不相等,如果>,如果<(branchif reg1,reg2,LABEL)

你怎么看?

hardware instruction-set computer-architecture

1
推荐指数
1
解决办法
417
查看次数

嵌入式设备的可能堆栈大小

我正在编程一些具有 64 MB SDRAM 的嵌入式设备。(C 用作编程语言)。是否可以猜测(甚至是粗略的猜测)该设备堆栈的可能大小?指的是在我们进行分配时使用的内存,例如,

char s[100];
int t[50];
Run Code Online (Sandbox Code Playgroud)

等等。

例如,它会超过50KB吗?等等,这就是我对粗糙的意思

加上当我在某个函数 f 中有变量时

f()
{
  int p;
}
Run Code Online (Sandbox Code Playgroud)

当 f() 存在时,这个变量会消失吗?

所以当我调用 f2() 时:

void f2()
{
  char t[100];
}
Run Code Online (Sandbox Code Playgroud)

只有 100 个元素的字符数组的大小才会添加到堆栈大小中,对吗?int p不再考虑先前函数的大小。

c embedded

1
推荐指数
1
解决办法
1495
查看次数