【问题标题】:Why is MIPS stack base 0x7ffffffc rather than 0x80000000为什么 MIPS 堆栈基数是 0x7ffffffc 而不是 0x80000000
【发布时间】:2021-02-15 12:59:03
【问题描述】:

为什么 MIPS 堆栈基数是 0x7ffffffc 而不是 0x80000000?

如果我理解正确,堆栈指针是指放置在堆栈上的 last 项。那么,如果是这种情况,这是否意味着地址 0x7ffffffc 永远不会被使用,因为将整数压入堆栈的传统方法是将 $sp 递减到 0x7ffffff8 并将压入的值放在那里?

【问题讨论】:

  • 不是推送和弹出伪代码,它的工作原理取决于您的汇编程序(特定工具)的伪代码,是吗?
  • 如果你不知道你的工具在做什么,那么尺寸减 4 会是一个更安全的选择......
  • 你是对的:这取决于工具的作用;但是,似乎大多数(如果不是全部)教科书一致认为堆栈指针指向放置在堆栈上的最后一项。如果这是某种约定,我希望工具能够遵循它。
  • 是的,所以你可以从 0x800 开始......但这并不意味着大多数人都会这样做,有些人不会花时间,而只是使用通常有效且安全的负 4 或 8,但他们不这样做必须再考虑一下,如果 4 或 8 超出您的内存预算,您还有其他问题。

标签: assembly stack mips callstack stack-pointer


【解决方案1】:

模拟器(即 QtSPIM)使用堆栈指针做一些奇怪的事情;当堆栈指针被修改时,而不是在堆栈内存被存储到时,它们会采取行动——例如为堆栈分配额外的内存。 (因此,您可以通过在堆栈指针寄存器中放置一个随机值来给这些模拟器带来严重的痛苦。)

我的猜测是,由于 0x80000000 位于受保护的内核内存中,他们根本不希望该值在寄存器中,是的,这意味着从不使用内存字。

我敢说实际的硬件不会有这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2013-06-16
    • 2014-05-13
    相关资源
    最近更新 更多