MIPS中如何判断栈是否为空?
How to check if the stack is empty in MIPS?
所以我需要在返回正在计算的值之前检查堆栈是否为空。
如果它不为空,那么我会报错。
如何判断栈是否为空?
将 $sp 与 null 进行比较,如何?
或者如果 $sp 的起始地址总是相同的,我应该硬编码吗? (如果$sp的地址等于270346..3,则为空)(感觉很不对)
如有任何帮助,我们将不胜感激
谢谢
您永远不应该检查调用堆栈是否为“空”——这个概念没有任何意义——调用堆栈应该一直存在。
但是,如果您将动态数量的内容压入堆栈,然后将它们全部弹出,您可以:
在任何动态推送之前捕获堆栈指针的值,然后作为动态弹出的一部分将当前堆栈指针与先前捕获的堆栈指针进行比较——当它们相等时,没有什么可啪。
或者,在任何动态推送之前从零开始计数,并在项目被推送时添加到该计数,在它们被弹出时减少计数——只要计数为零,就没有什么可啪。
另一方面,如果您正在编写一个直接从模拟器或操作系统获取控制权的程序,那么它们的特殊之处在于没有人需要 return。正因为如此,通常我们会使用自定义的启动代码,这样的启动代码并不是经典的功能。
任何编写为函数的代码都可以假定它已被调用,因此可以 return 它的调用者。
所以我需要在返回正在计算的值之前检查堆栈是否为空。 如果它不为空,那么我会报错。
如何判断栈是否为空? 将 $sp 与 null 进行比较,如何? 或者如果 $sp 的起始地址总是相同的,我应该硬编码吗? (如果$sp的地址等于270346..3,则为空)(感觉很不对)
如有任何帮助,我们将不胜感激 谢谢
您永远不应该检查调用堆栈是否为“空”——这个概念没有任何意义——调用堆栈应该一直存在。
但是,如果您将动态数量的内容压入堆栈,然后将它们全部弹出,您可以:
在任何动态推送之前捕获堆栈指针的值,然后作为动态弹出的一部分将当前堆栈指针与先前捕获的堆栈指针进行比较——当它们相等时,没有什么可啪。
或者,在任何动态推送之前从零开始计数,并在项目被推送时添加到该计数,在它们被弹出时减少计数——只要计数为零,就没有什么可啪。
另一方面,如果您正在编写一个直接从模拟器或操作系统获取控制权的程序,那么它们的特殊之处在于没有人需要 return。正因为如此,通常我们会使用自定义的启动代码,这样的启动代码并不是经典的功能。
任何编写为函数的代码都可以假定它已被调用,因此可以 return 它的调用者。