对SRAM中Stack的理解
本文标题:对SRAM中Stack的理解
文章作者:gyro永不抽风
发布时间:2020年08月20日 - 15:08
最后更新:2020年09月15日 - 07:09
原始链接:http://hexo.gyrojeff.moe/2020/08/20/%E5%AF%B9SRAM%E4%B8%ADStack%E7%9A%84%E7%90%86%E8%A7%A3/
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请保留原文链接及作者!
在七月份学习SoC的时候,教授谈到了SRAM中的stack部分。当时上课的时候,教授让我猜这到底是干什么的,我当时说可能是存放临时变量的地方,真没想到是真的。
下图是M2e芯片对地址的索引:
stack其实就是栈,是一种LIFO的数据结构。一开始写汇编的时候可能没什么感觉,但是当汇编写多了,使用到了子程序(submodule)以后就会发现,stack其实是有作用的。先扯一点关系不大的事情。在最开始学习寄存器的时候,我们会发现那张表上面有一个saved registers和temporary register。如果只用汇编的话,我们会发现混起来用一点关系都没有,因为我们其实只是在操作寄存器。然而,当我们在使用C和汇编混编的时候就会发现端倪。temporary寄存器是在函数跳转之后不被保存的寄存器,然而save寄存器则是在函数跳转之后还被保存的寄存器。这里我们谈到的“保存”其实就是和stack有关的操作。如果我们要保存一个32位的数,那我们其实只需要将stack pointer(sp)减去4,然后把值放在sp的位置,要取回的时候再加上四。注意:stack pointer的操作在自己的子程序当中一定要对称,即进来的时候sp是多少,出去的时候sp还是多少。其实这里的stack就是我们手动实现的,stack pointer就是栈顶指针罢了。接下来,我举一个例子:
C语言中正在执行一个void,叫做a(),a()调用了汇编中的子程序b(),那么在调用b之前,如果运行的时候save寄存器中有东西,那就C编译器编译时就会有若干条指令来吧这些寄存器当中的值压回stack当中,并不会管temporary寄存器当中的值(因为一般来说C的编译器只有在使用临时变量是会使用$t*。接下来,进入b子程序之后,如果b子程序要调用C的一个子程序c(),那么在汇编当中,上述的保存过程就要手动实现了。
总之,对于MIPS而言,他就是一个load-and-store structure,一切都可以通过操作寄存器、储存,使用ALU运算完成。