栈的使用(push、pop详解)学习笔记

概念:

        栈是一种数据结构,可以添加或者删除值,不过要遵循“后进先出”的原则。通过 push 操作把数据压入栈中,通过pop操作删除数据;它具有一个属性:弹出的值永远是最近被压入而且仍然在栈中的值。

栈的使用(push、pop详解)学习笔记_第1张图片

 

        栈可以实现为一个数组,总是从数组的一端插入和删除元素。这一端被称为栈顶。在x86-64中,程序栈存放在内存中某个区域。栈顶元素的地址是所有栈中元素地址中最低的。(根据惯例,我们的栈是倒过来画的,栈“顶”在图的底部。)栈指针%rsp保存着栈顶元素的地址。

PUSHQ与POPQ        

        pushq指令的功能是把数据压人到栈上,而 popq指令是弹出数据。这些指令都只有一个操作数-—压入的数据源和弹出的数据目的。

        将一个四字值压人栈中,首先要将栈指针减8,然后将值写到新的栈顶地址。因此,指令pushq %rbp的行为等价于(先改变栈顶指针再进栈)

                       1. subq $8,%rsp          2. movq %rbp,(%rsp)

        弹出一个四字的操作包括从栈顶位置读出数据,然后将栈指针加8。因此,指令popq%rax等价于(先出栈再改变栈顶指针)

                        1.movq (%rsp) ,%.rax        2.addq $8,%rsp

        当%rsp为 0x108,%rax为 0x123时,执行指令pushq %rax的效果。首先%rsp 会减8,得到0x100,然后会将0x123存放到内存地址0x100处。

        执行指令popq %rdx的效果。先从内存中读出值0x123,再写到寄存器%rdx中,然后,寄存器%rsp的值将增加回到0x108。

        如图:(说明:根据惯例,我们的栈是倒过来画的,因而栈“顶”在底部。x86-64中,栈向低地址方向增长,所以压栈是减小栈指针(寄存器%rsp)的值,并将数据存放到内存中,而出栈是从内存中读数据,并增加栈指针的值)

栈的使用(push、pop详解)学习笔记_第2张图片

 

你可能感兴趣的:(笔记,c语言)