我有一个编程情况,堆栈可以很好地用于我的目的。我想知道在寻址这个分配的空间时是否可以以类似的方式使用内存偏移值来说$ sp。
IE:
.data
char_stack: .space 24
.text
main:
addi $t0, $zero, 18
sw $t0, 2(char_stack)
要将值保存到字符堆栈的第二个字节?如果我的价值观错了,但想法是正确的,请让我知道这个想法 - 价值观纯粹是我想做的示范。
这是一种可怕的做法吗?我真的应该避免做什么? 如果不是,但没有办法做到这一点,是使用'la'和增量寄存器的最接近的近似值吗?
(我正在使用SPIM来模拟MIPS)
另外,我正在处理在异常处理程序中编写大部分内容(奇怪的赋值),所以我无法真正有效地使用$ SP。
答案 0 :(得分:2)
为什么这是一个可怕的做法?我不明白你害怕什么。如果您正在描述您愿意使用自定义堆栈解决的确切问题,那么我们可能会更好地了解这是否是可怕的做法。在这种情况下,你的堆栈有24个字节的空间,而不是一个非常大的堆栈,但根据你想要做的事情可能就足够了。
但是,您似乎使用offset(offset)
的寻址模式是错误的并且不存在,仅在MIPS上offset(register)
可用。 (您可以使用offset(zero)
来模拟它,但无论如何我认为这不是您想要做的事情。)
相反,您需要在程序中将一个寄存器(堆栈指针)初始化为char_stack
,然后在推送堆栈数据时增加它,在弹出时减少它。
我坚持认为sp
只是r29
的别名,它通常是堆栈指针,但任何其他寄存器都适合作为另一个堆栈的本地指针。
如果您只在程序的一部分中使用此自定义堆栈并希望该程序的其余部分中的其他地方的一般用途可以使用该寄存器,请在离开时将其存储在内存中的专用位置,然后将其加载回来当你回到使用自定义堆栈的例程中时。