从函数角度彻底认识栈
从函数角度彻底认识栈
栈和栈的意义
每个变量都有一个内存空间。如果一个函数被多次反复调用,分配内存的开支会很大。但为每一个变量分配一个固定的内存空间很浪费内存资源。
因此,提前分配好一段内存空间(栈),每次变量被创建时,在栈里写就行。
寄存器与CPU
CPU从内存中将值读入寄存器里,能快速访问。
寄存器
-
有eax,ecx,edx,ebp,esp,edi,eip
-
esp:指向栈顶
-
ebp:指向栈底
-
栈:从高地址向低地址(栈底向栈顶)
汇编指令
push
例如:push 32有以下两步
-
将栈顶指针上移(esp = esp - 4)
-
在栈顶写入32(即esp指向的位置写入)
call
例如:call CD1020
-
eap = esp - 4
-
在esp指向的位置里放入call的下一条指令的地址CD107F(能在函数调用结束后找到并继续执行后续语句)
-
CPU跳转到CD1020执行
调用函数的整体流程
-
1.参数从右往左入栈
-
2.当前语句的下一句指令地址入栈
-
3.ebp里的数值入栈(给ebp腾出空间来干活)
发布于