1.栈的栈底地址比栈顶地址大,栈顶指针指着的是最新push的数据。 c++
2.举例说明栈的使用 shell
int func1(int a) { int b = a + 1; return b; } int func0(int a) { int b = func1(a); return b; }
经过如下命令将上述code编程成汇编代码: 编程
g++ -g -S -O0 -m32 main.cpp -o-|c++filt >main.format.s spa
c++filt 是为了Demangle symbols。-m32是为了编译成x86-32的。 指针
获得func0的汇编代码: code
func0(int): pushl %ebp #保存先前的栈底地址,而且使栈 #顶地址加4,指向保存的栈底地址 movl %esp, %ebp #设置新的栈底地址,使其等于当前的栈顶地址 subl $20, %esp #预留20个字节用来定义局部变量 movl 8(%ebp), %eax movl %eax, (%esp) call func1(int) movl %eax, -4(%ebp) #将func1的结果存在当前栈中 movl -4(%ebp), %eax #返回b leave #1.将栈顶指针赋值给栈底指针2.pop出旧的地址, #同时因为pop,栈底指针+4,则栈顶指针和栈底指针彻底变成原来的值 ret #弹出call保存的地址,并跳转到这个位置