【发布时间】:2021-04-03 22:58:52
【问题描述】:
我目前正在尝试分析 N64 旧视频游戏的组装。为此,我使用了一些 N64 调试器来阅读和理解底层 MIPS 代码。
在我正在查看的其中一个电话中,序言定义如下:
ADDIR SP, SP, -0x030
SW RA, 0x0024 (SP)
SW S0, 0x0020 (SP)
SW A1, 0x0034 (SP)
在这个函数后面,我们还有两个堆栈推送:
SW V0, 0x002C (SP)
[...]
SW R0, 0x0010 (SP)
我不明白的是:
- 为什么序言子 0x030,但没有使用所有空间:我们只存储 5 个寄存器,所以它应该最多子 0x014
- 为什么,这是我的主要问题,A1 是在 SP 之外存储的?堆栈子 0x030,但 A1 保存到 SP[0x034]
我根本不是 ASM 方面的专家,所以我可能会错过一些关于堆栈如何工作的内容,但对我来说,序言中保存的每个数据都应该保存在 beetwen SP 和 SP - 0x030(在我的情况下)。 如果我理解正确的话,第四行写在另一个函数的堆栈帧上,这似乎很糟糕。
【问题讨论】:
标签: assembly mips calling-convention stack-frame stack-pointer