ESP
和EBP
是刚接触栈的时候就碰到的两个指针。对这两个我一直是处于一知半解状态。
错误认知:ESP是指向栈顶指针,EBP是指向栈底指针。
我这么认为已经很长时间了,而且自己觉得没问题。
直到今天看英文版的书,遇到mov eax,[ebp+10h]
我仔细想了一下,栈内肯定是栈底地址最大,要是ebp指向栈底,那么ebp+10h
不是超出栈的地址范围了???
这一度让我的认知出现混乱。
这个就要涉及到栈的结构了,一直以为栈就是一个数据段,esp指头,ebp指尾。这里涉及到栈帧的概念,栈里面被分为一个个栈帧。
借用一个很火的网图
而ebp和esp的定义:
(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
ESP和EBP都是指向最上面一个栈帧的。ESP指向这个栈帧的栈顶,EBP指向这个栈帧的底部。(这么说来ESP指向栈顶地址也是正确的,但EBP指向栈底地址就有问题了。)
所以这里的ebp+10h
,就指向了调用者的帧。
每个栈帧都有首地址,而ebp就是指向栈帧的首地址(注意,首地址和栈顶不同),函数层层调用的时候,刚开始ebp是存了父函数的首地址,当父函数调用子函数后,ebp则要存子函数的栈帧首地址,而子函数的栈帧首地址内可以存一个值,这个值还是父函数的栈帧首地址,这样,每当子函数调用完,就能回到父函数内,层层递推,最终回到main()函数,函数调用的过程由此实现。
关于ebp的详解:
%ebp叫帧指针,