【发布时间】:2021-03-31 20:41:15
【问题描述】:
假设我们使用堆栈帧将参数传递给子程序,如下所示:
addi $sp, $sp, -8
sw $s0, 0($sp)
jal sub
lw $s1, 4($sp)
addi $sp, $sp, 8
sub: lw $t0, 0($sp)
... do stuff ...
sw $t1, 4($sp)
jr $ra
我了解通过堆栈传递参数并使用 $ra 寄存器返回给调用者的概念。
我不太清楚的是:
addi $sp, $sp, 8
这会恢复堆栈帧中的空间。谁能帮我理解:
- 如果我不这样做会怎样?
- 如果我不恢复空间,汇编器会“关心”吗?
- 这是否类似于 c++ 中的内存管理? (即:删除指针、析构函数等)
【问题讨论】:
-
1) 你的调用者会很不高兴,因为它的
$sp不会指向它所在的位置,也不会找到它自己的局部变量 2) 没有 3) 有点
标签: assembly mips calling-convention stack-frame