1.栈在处理程序调用中起到至关重要的作用,在函数接口调用的过程中会有入栈和出栈的操作;函数调用,为入栈操作,函数返回为出栈操作;
2.栈本质是一种数据结构,遵循“后进先出”的原则;类似一个袋子,我们先取到的东西,是我们在装袋子时,后装入的东西;
3.操作指令:
push:压入栈、pop:弹出栈;
4.栈顶:当我们用数组实现栈,总是从数组的一端插入和删除元素,这一端即为栈顶;
栈顶元素的地址是所有栈元素地址中最低的;
在《深入理解计算机系统》一书中
pushq:将四字压入栈
popq:将四字弹出栈
栈操作流程:
如下图所示:
栈指针:%rsp保存着栈顶元素的地址;
入栈流程:将栈顶指向的地址值减8,然后将值写到新的栈顶;即下图中push %rax操作,%rax值:0x123, %rdx值:0; %rsp值:0x108, 当执行push %rax时,将0x108 - 8 得到0x100,然后将0x123放入栈顶0x100对应的地址中,然后将0x100地址值,写入到栈顶%rsp中;
出栈流程:将栈顶指向的内存地址上的值,放入到寄存器中,然后将栈顶指向的内存地址值加8;即下图中pop %rdx操作,当执行完入栈操作后,寄存器值状态:%rax值:0x123, %rdx值:0; %rsp值:0x100,当执行pop %rdx时,将地址0x100上的值(值为0x123)取出,放入到%rdx中,然后将地址0x100加8 得到地址值0x108,将地址值0x108存入到%rsp中;得到下图中最后一个表格
栈顶的流程(对应栈操作流程)
下图中显示栈顶的变化,在执行push %rax后,栈顶变成0x100,并且地址0x100上存储的值为0x123;
在执行pop %rdx后,栈顶值变成0x108,虚线部分已不是栈顶存储的地址;pop执行完后,需要注意:
1.地址0x100中存储的值仍然是0x123,直到被覆盖,例如被另外一条入栈操作覆盖;
2.无论如何%rsp始终指向的地址为栈顶;