|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
都说1 esp 永远指向 栈顶(高位),ebp 指向 栈低(低位), 也没有说清楚栈低是啥
都说2ebp是用于保存上一个函数的堆栈基址,也没有说清楚,上个函数栈基地址是啥。难道是main函数的句柄吗
都说3ebp是ss的左膀右臂,神雕侠侣杨过不就是独臂吗?
都说4ebp你算老几呀,一开局就push 凭什么你先push。
1. 在大多数现代计算机架构中,栈(stack)是一种用于存储临时数据的数据结构。它遵循后进先出(LIFO)的原则。栈顶指的是最后一个添加的元素所在的位置,而栈底则是第一个添加的元素所在的位置。在具体的计算机内存中,这个"底"和"顶"的概念可能会颠倒,因为栈可能是向低地址或者高地址方向增长的。所以在这种情况下,我们常常说ESP寄存器指向栈顶,EBP寄存器指向栈底,其实是指的当前函数栈帧的底部。
2. 当一个函数被调用时,会创建一个栈帧来存储函数的局部变量和返回地址。当函数返回时,这个栈帧会被销毁。因此,EBP(基指针寄存器)常常被用来保存上一个函数的栈帧基址,也就是说保存上一个函数创建的栈帧的栈底的地址。这样在函数返回时,就可以找到返回地址,从而正确地返回到调用函数的地方。
3. "ebp是ss的左膀右臂" 这个说法可能是一种形象的表达方式,用来说明ebp和ss的关系。在x86架构中,SS是堆栈段寄存器,用来存储当前使用的栈的基址。EBP是基指针寄存器,一般用来指向栈底。在许多情况下,ebp和ss一起用来定位和管理栈,这就好像左臂和右臂一起协作来完成任务一样。
4. 为什么首先要push ebp? 这是因为在进入一个新的函数时,我们需要创建一个新的栈帧来存储函数的局部变量和返回地址。因此,首先要保存老的ebp值(也就是上一个函数的栈帧的底部地址),以便在函数返回时可以恢复到正确的位置。这就是为什么首先执行"push ebp"的操作。然后,新的ebp值(当前函数的栈帧的底部地址)会被设定为当前的.esp值(也就是栈的顶部地址)。这样,ebp就总是指向栈帧的底部,而esp则指向栈帧的顶部。
|
|