assembly - 如何释放MIPS中的堆内存

标签 assembly mips mars-simulator sbrk

出于学习目的,我尝试在堆内存中实现堆栈。

当我推送某些东西时,我只需要执行系统调用sbrk,就可以了。

当我继续弹出时,我可以检索我的值,但无法释放分配的空间。有什么办法可以做到这一点吗?

sbrk 系统调用不接受负数。我已经尝试过了。

最佳答案

与 UNIX 中真正的 sbrk 不同,QtSpim/MARS 系统调用 #9 不支持将内存从堆返回到系统。

但是,您可以自己实现 sbrk 功能,因为它相当简单。 (malloc/free 会更复杂,涉及空闲列表等,但这要简单得多。)

当然,您需要一个像真正的 sbrk 一样采用调整编号的子例程,并维护少量的持久/全局状态 - 也许两个词:UNIX 风格 sbrk 地址和 MARS 风格的系统调用 #9 地址,或者其中之一和一个自由计数。

释放内存(负sbrk参数)仅仅意味着将UNIX风格的sbrk地址移回和/或增加空闲计数,否则什么也不做。

稍后的分配(正 sbrk 参数)在分配新的堆空间时考虑标记之间的间隙或可用计数,并且仅在可用计数变为 0 并且仍有更多字节时才增加底层 MARS 堆在分配请求中。

关于assembly - 如何释放MIPS中的堆内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70559682/

相关文章:

assembly - .byte 汇编指令在 gnu 汇编中有何用途?

c - C 中的数组 asm 函数

c - C 中带有数组的 For 循环到带有偏移量的 MIPS

synchronization - 1-Verilog 实现中分支的指令延迟和同步问题

c - ARM GCC 内联汇编

assembly - 我可以从 EAX/RAX 获取 int 到 FPU 的寄存器(如 st0)吗?

c++ - 使用 vector 引起的段错误

mips - 如何从 MIPS 中的主函数返回一个值?

mips - RISC 的 SPIM 与 MARS

assembly - MIPS 组件,lui 0x1001