callstack - 当你在堆栈上推送和弹出数据时,你到底在移动什么?

标签 callstack

我不断收到警告小消息,“您提出的问题似乎是主观的,很可能已关闭”。但我将继续询问,看看这里是否有人可以解决我的一些困惑。

这涉及基本的计算机体系结构,即具有堆栈的体系结构,特别是没有堆栈的体系结构。

使用 FILO(先进后出)方法,就像使用 Intel x86 一样,您使用 push 和 pop,但是什么表示或决定了什么已被推送?

例如,我想推一个“变量”,比方说……我们知道芯片中的所有东西都只是两伏二进制位、逻辑驱动电路、门、晶体管等。当我推一个字节时包含以二进制表示的地址,如下所示:1000 0101、133 或 85(十六进制),一个值被移动到堆栈中......这里有一些问题:

1. 堆栈在芯片中的具体位置是什么?

2. 芯片上的堆栈配置如何启用/禁用进出它的数据 block ?

3.在多任务环境中通常有多个堆栈。 额外的堆栈是如何或从哪里来的?

我知道这可能是题外话,但我希望从硬件方面更好地了解堆栈本身。不,我不想看盘子的图片,我明白了,但我想设想数据如何进入它,堆栈的确切位置,芯片中的内容以及配置方式。

也许 Electronics.Stackexchange 可以提供帮助?

最佳答案

你的问题很有趣,一点也不主观。我不认为它会被关闭。

首先,我宁愿将堆栈称为使用 LIFO 方法 - 后进先出。 FILO是等价的,不过不是很常用,其实我好像没听说过。

  1. Where exactly does the stack reside in the chip?


没有存储堆栈的“芯片”之类的东西。当您发出 push 时,堆栈存储在内存中指令,您正在将该值推送到内存。 CPU 没有堆栈——它有一些寄存器,但是 pushpop总是使用内存。堆栈在内存中的什么位置?嗯,有一个寄存器,堆栈指针寄存器,它指示堆栈顶部的内存地址。汇编器可以为您初始化这个地址,或者您可以手动进行(这取决于您正在使用的环境)。

如果您真的想深入探讨这个主题,请考虑一下 CPU 的工作原理:它只不过是一堆带有控制单元的逻辑电路,用于解码指令并激活或停用必要的位和端口。当你写 push在汇编源文件中,汇编器将其转换为一组表示操作码和指令参数的位。

稍后,在执行期间,CPU 的控制单元将解码此信息。它查看操作码,然后说“嘿,这是一个推送指令。嘿,你,内存,准备写入。”。它将最终访问互连 CPU 和内存的总线,通过该总线发送二进制数据,激活 WRITE 标志,并将存储在堆栈指针寄存器中的值指示为目标地址。在内心深处,它所做的只是激活一系列总线和位以写入内存位置。写入的二进制数据来自您传递给 push 的任何参数。 .如果是寄存器,则在将值传递到内存总线之前访问 CPU 的寄存器文件以读取值。

写入内存后,堆栈指针简单地递增到下一个内存位置。 pop相反:它递减堆栈指针,然后读取存储在该位置的任何内容(这可以不同,例如在 push 中,您可以写入然后递增,或者您可以递增然后写入,您只需保持一致在 pushpop 中)。

您可以相对较快地在汇编中实现堆栈,我建议您这样做 - 这是一个很好的练习,可以为您提供有用的知识。

2.How does the configuration of the stack on the chip enable/disable blocks of data going in and out of it?



堆栈只不过是一个特殊的内存位置,您可以使用堆栈指针寄存器对其进行跟踪。递增和递减此寄存器将使您可以读取任意堆栈位置。如果您将此寄存器更改为完全不同的内存位置,您现在有另一个堆栈。
pushpop这不是魔术,它只是读取和写入内存,并递增或递减堆栈指针。简单的。

3.In a multitasking environment there's usually multiple stacks. How or where do the extra stacks come from?



再次,一切都在内存中。在多任务环境中,每个进程都有自己的上下文。在给进程分配 CPU 时间之前,操作系统内核代码会恢复进程上下文,因此进程本身甚至不会意识到发生了什么。进程的上下文包括寄存器的状态——还包括堆栈指针。因此,当一个进程被带回 CPU 时,它的堆栈指针寄存器将指向 HIS 堆栈——他在内存中被用作堆栈的位置,因为内核已经存储了这些信息并将其放回那里供进程使用仿佛这期间什么都没有发生。

永远记住,在不同的层,内存位置由 L1、L2 和 L3 缓存插入以加快公共(public)访问。

这就是比特流的方式......

关于callstack - 当你在堆栈上推送和弹出数据时,你到底在移动什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19941225/

相关文章:

C: 函数调用不同模块后传递的参数为 NULL 的原因

c++ - 当我想修改指向常量整数的指针时,为什么我的编译器不显示错误?

c - linux访问栈下内存

javascript - 在javascript中确定调用函数

c++ - 有没有办法在 gdb 中设置一个以调用堆栈为条件的断点?

objective-c - 如何循环遍历 iPad 应用程序中的所有事件线程

recursion - Rust 会公开调用堆栈深度吗?

c - 类似函数的行为,无需使用任何调用堆栈

c++ - 获取“运行时检查失败 #0 ;当调用 obj -> X(); 其他一些甚至不是 solutn 的一部分的函数 Y() 被调用

c++ - 为什么在调用的赋值析构函数中使用 in const 时,赋值是正确的