gyro永不抽风

ああああああああああああああああおおおおおおおおおおおおおおおお

对SRAM中Stack的理解

在七月份学习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运算完成。

__EOF__
-------------本文结束感谢您的阅读-------------

本文标题:对SRAM中Stack的理解

文章作者:gyro永不抽风

发布时间:2020年08月20日 - 15:08

最后更新:2020年09月15日 - 07:09

原始链接:http://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) 转载请保留原文链接及作者!

真的不买杯奶茶吗?T^T

欢迎关注我的其它发布渠道