对SRAM中Stack的理解

新博客地址:https://gyrojeff.top,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客👇

本文标题:对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运算完成。

posted @ 2020-09-15 09:13  gyro永不抽风  阅读(225)  评论(0编辑  收藏  举报