鱼C论坛

 找回密码
 立即注册
查看: 640|回复: 8

[已解决]甲鱼大哥你来帮我解答吧ebp

[复制链接]
发表于 2023-7-26 02:31:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

都说1 esp 永远指向 栈顶(高位),ebp 指向 栈低(低位), 也没有说清楚栈低是啥
都说2ebp是用于保存上一个函数的堆栈基址,也没有说清楚,上个函数栈基地址是啥。难道是main函数的句柄吗
都说3ebp是ss的左膀右臂,神雕侠侣杨过不就是独臂吗?
都说4ebp你算老几呀,一开局就push 凭什么你先push。
最佳答案
2023-7-26 02:31:39
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则指向栈帧的顶部。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-26 02:31:24 | 显示全部楼层
关于 ebp 寄存器在汇编语言中的作用:

1. ebp 的指向:
   - 在 x86 架构中,栈是向下增长的数据结构,而 ebp 寄存器通常用于指向当前函数的栈帧的底部(高地址),也就是上一个函数的栈顶位置。
   - ebp 指向栈帧的底部,通过 ebp 可以快速访问函数参数、局部变量和返回地址等信息。

2. 保存上一个函数的堆栈基址:
   - 当一个函数被调用时,它会在栈上创建一个新的栈帧。为了确保在返回时恢复到调用函数的正确状态,需要将一些重要的信息保存在栈帧中。其中,ebp 被用来保存上一个函数的栈基址(也称为帧指针),以便在函数返回时能够回到正确的栈位置。
   - 每当新的函数被调用时,当前函数的 ebp 值会被保存到栈上,然后 ebp 被更新为新的栈帧的基址。

3. ebp 和 ss:
   - 在汇编语言中,ebp 并不是与 ss 寄存器直接相关的,它主要是用来定位和访问栈帧的数据。
   - 将 ebp 视为“ss 的左膀右臂”可能是一个形象的表达,但在计算机体系结构中并没有直接的联系。

4. ebp 的初始化:
   - 在函数开头,ebp 的值通常会被 push 到栈上,以便在函数返回时能够正确地恢复栈帧。
   - 使用 push ebp 指令保存上一个函数的栈基址是由编译器自动生成的代码,它遵循特定的调用约定。
   - ebp 的初始化和使用是为了实现正确的函数调用和返回机制。

请注意,上述解释是针对 x86 架构的汇编语言。不同的体系结构可能会有一些细微差别,具体实现也取决于编译器和操作系统。

希望以上解答能够帮助您理解 ebp 在汇编语言中的作用。如果还有其他问题,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-26 02:31:39 | 显示全部楼层    本楼为最佳答案   
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则指向栈帧的顶部。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-26 02:34:32 | 显示全部楼层
机器人就别回答了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-26 03:13:23 | 显示全部楼层
栈低 -> 栈底
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-26 09:19:55 | 显示全部楼层
isdkz 发表于 2023-7-26 02:31
1. 在大多数现代计算机架构中,栈(stack)是一种用于存储临时数据的数据结构。它遵循后进先出(LIFO)的原则。 ...

哈哈哈哈,被当成机器人了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 00:30:10 | 显示全部楼层
isdkz 发表于 2023-7-26 02:31
1. 在大多数现代计算机架构中,栈(stack)是一种用于存储临时数据的数据结构。它遵循后进先出(LIFO)的原则。 ...

我明白了,感谢感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 00:31:28 | 显示全部楼层

啊呀,啊,啊,啊,,啊,我的甲鱼大神呀,你最近好吗,好久不见啊,我15年就是你的老铁粉了。哈哈,哈,你好,你好呀,太想你了,哈哈哈哈哈,干杯 不醉不归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-27 03:28:16 | 显示全部楼层
maikehong 发表于 2023-7-27 00:31
啊呀,啊,啊,啊,,啊,我的甲鱼大神呀,你最近好吗,好久不见啊,我15年就是你的老铁粉了。哈哈,哈, ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-26 13:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表