Csapp-chapter3-压栈和弹栈

bp与sp(压栈和弹栈)

在计算机内部的寄存器组中,有一对寄存器非常有意思:%ebp,%esp


文章目录

  • bp与sp(压栈和弹栈)
  • 寄存器组示例图
  • %ebp与%esp
  • 总结


寄存器组示例图

首先我们应该对于计算机中的寄存器组有一个逻辑的认知:
以X86_64为例对其中的通用寄存器组做出了逻辑图示如下链接:
X86_64寄存器组图示


%ebp与%esp

这个寄存器叫做堆栈基址寄存器,被调用者保存,而其保存的内容则是调用者的栈底。

比如下方的一段代码

#include

void A(int n){
	printf("n=%d\n",&n);
}

void B(){
	int a=1;
	A(a);
}

int main()
{
	B();
}

对于上述代码执行时的栈:
首先忽略系统区,main函数在栈底,然后在main函数中把B函数入栈,由于B中调用了A,在B之后又将A入栈。其中%ebx,就始终指向一个函数的栈区的底部。而%esp则始终指向函数栈区的顶部,这里简称为栈顶。

指令 效果 描述
pushq S R[%rsp]<-R[%rsp]-8
M[R[%rsp]]<-S
将四字压入栈
popq D D<-M[R[%rsp]]
R[%rsp]<-R[%rsp]+8
将四字弹出栈

总结

总之这块很简单,只需记住
压栈先挪出空间(sp减去某个值),再填数据
弹栈先保存要弹出的数据,再释放空间(sp加上某个值)
值得注意的是,弹栈后原数据还在,只是不再被栈顶指针所指,而是等待着下一次数据的覆盖

你可能感兴趣的:(csapp,汇编,学习方法,笔记)