当你推动&流行数据&在堆栈外,你到底在想什么?

时间:2013-11-12 22:27:12

标签: callstack

我不断收到警告的消息,“你问的问题似乎是主观的,可能会被关闭”。但是我会继续询问是否有人在这里可以解决我的一些困惑。

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

使用FILO(先进后出)方法,就像使用英特尔x86一样,你使用推送和弹出,但是什么表示或决定推送了什么?

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

1. 堆栈到底在哪里?

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

3.在多任务环境中,通常有多个堆栈。 额外筹码的来源或地点来自哪里?

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

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

1 个答案:

答案 0 :(得分:1)

你的问题非常有趣,而且根本不是主观的。我认为它不会被关闭。

首先,我宁愿将堆栈称为使用LIFO方法 - Last In First Out。 FILO是等价的,但实际上并不常见,我想我从未听说过它。

  
      
  1. 堆栈究竟在哪里?
  2.   

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

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

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

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

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

  

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

堆栈只不过是一个特殊的内存位置,您可以使用堆栈指针寄存器跟踪它。递增和递减该寄存器将允许您读取任意堆栈位置。如果将此寄存器更改为完全不同的内存位置,则现在有另一个堆栈。

pushpop不是魔法,它只是读取和写入内存,并递增或递减堆栈指针。简单。

  

3.在多任务环境中,通常有多个堆栈。额外堆栈的来源或地点来自哪里?

同样,一切都在记忆中。在多任务环境中,每个进程都有自己的上下文。在为进程提供CPU时间之前,操作系统内核代码将恢复进程上下文,以便进程本身甚至不会意识到发生了什么。进程'上下文包括寄存器的状态 - 其中还包括堆栈指针。因此,当一个进程返回CPU时,它的堆栈指针寄存器将指向HIS堆栈 - 它在内存中的位置被用作堆栈,因为内核已经存储了这些信息并将其放回那里供进程使用好像在此期间没有发生任何事情。

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

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