当我们已经有程序计数器寄存器时,为什么还需要一个堆栈指针寄存器?

sha*_*ant 13 cpu-registers

我很困惑,因为如果我们已经有一个指针,那么我们可以很容易地指向下一条指令,我们可以轻松指向返回上一个函数,那么为什么我们需要另一个堆栈指针寄存器来回到以前的函数或模块?

Jas*_*onD 17

程序计数器告诉CPU它.堆栈用于(除其他事项外)保持的地方有一个记录.

如果调用了一个函数,该函数需要知道完成后返回的位置.这实际上可能只是一个传入的地址,但如果该函数本身调用其他函数,或者甚至递归调用自身,那么它需要确保该地址不会丢失或被覆盖 - 因此必须存储它.这样做的自然方法是将地址压入堆栈,然后在需要时再将其弹回.

当然它还存储函数的本地状态,因为当程序进入函数或从函数返回时,也需要推送和弹出.

并非所有处理器都必须具有堆栈,但如果您在一个处理器上执行任何远程复杂操作,则不可避免地会实现一个.