从函数角度彻底认识栈

从函数角度彻底认识栈

栈和栈的意义

每个变量都有一个内存空间。如果一个函数被多次反复调用,分配内存的开支会很大。但为每一个变量分配一个固定的内存空间很浪费内存资源。

因此,提前分配好一段内存空间(栈),每次变量被创建时,在栈里写就行。

寄存器与CPU

CPU从内存中将值读入寄存器里,能快速访问。

寄存器
  • 有eax,ecx,edx,ebp,esp,edi,eip

  • esp:指向栈顶

  • ebp:指向栈底

  • 栈:从高地址向低地址(栈底向栈顶)

汇编指令

push

例如:push 32有以下两步

  1. 将栈顶指针上移(esp = esp - 4)

  2. 在栈顶写入32(即esp指向的位置写入)

call

例如:call CD1020

  1. eap = esp - 4

  2. 在esp指向的位置里放入call的下一条指令的地址CD107F(能在函数调用结束后找到并继续执行后续语句)

  3. CPU跳转到CD1020执行

调用函数的整体流程

  • 1.参数从右往左入栈

  • 2.当前语句的下一句指令地址入栈

  • 3.ebp里的数值入栈(给ebp腾出空间来干活)