鱼C论坛

 找回密码
 立即注册
查看: 728|回复: 3

[已解决]汇编代码求解

[复制链接]
发表于 2023-7-18 19:41:22 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x

VS局部变量不是谁先定义谁入栈吗?
那么sum先定义,按理说sum应该在高地址(ebp-4)处,为啥书中说在[ebp-8]处
最佳答案
2023-7-18 19:41:37
在汇编语言中,局部变量的存储位置通常是相对于栈帧指针(ebp)来计算的。根据常见的惯例,局部变量是按照定义的顺序依次入栈的,越先定义的局部变量在栈中的地址越高。

根据你提供的信息,书中说sum在[ebp-8]处,但你认为sum应该在[ebp-4]处。这可能是因为在汇编代码中,还存在其他指令和操作需要占用一些栈空间。

在函数调用过程中,除了局部变量之外,还有其他数据需要在栈上存储,例如函数的返回地址、参数、寄存器保存等。这些都会占用额外的栈空间。所以,即使sum是第一个局部变量,它可能被其他数据或指令占用了[ebp-4]的位置,导致sum实际上位于[ebp-8]的位置。

为了更好地理解这个问题,你可以查看完整的汇编代码,并注意其他与栈相关的指令和操作。这样你就能确定sum在栈中的确切位置。
IMG_20230718_192923.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-18 19:41:37 | 显示全部楼层    本楼为最佳答案   
在汇编语言中,局部变量的存储位置通常是相对于栈帧指针(ebp)来计算的。根据常见的惯例,局部变量是按照定义的顺序依次入栈的,越先定义的局部变量在栈中的地址越高。

根据你提供的信息,书中说sum在[ebp-8]处,但你认为sum应该在[ebp-4]处。这可能是因为在汇编代码中,还存在其他指令和操作需要占用一些栈空间。

在函数调用过程中,除了局部变量之外,还有其他数据需要在栈上存储,例如函数的返回地址、参数、寄存器保存等。这些都会占用额外的栈空间。所以,即使sum是第一个局部变量,它可能被其他数据或指令占用了[ebp-4]的位置,导致sum实际上位于[ebp-8]的位置。

为了更好地理解这个问题,你可以查看完整的汇编代码,并注意其他与栈相关的指令和操作。这样你就能确定sum在栈中的确切位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 19:41:53 | 显示全部楼层
在计算机科学中,栈(stack)是一种重要的数据结构,通常用于存储函数的局部变量和返回地址。在大部分现代计算机体系结构(包括x86和x64)中,栈都是向下增长的,也就是说,新数据被推入(push)栈后,栈顶指针(栈顶)会减小。

关于你的问题,首先需要理解Visual Studio(VS)的编译器可能会进行一些优化,这可能会改变局部变量的放置顺序。具体的放置顺序取决于编译器的实现,而并非仅仅是你在源代码中声明变量的顺序。

另外,还需要考虑到调用约定。在 cdecl、stdcall、和fastcall 等调用约定中,当函数被调用时,返回地址首先被推入栈中(在 ebp-4 处)。随后,ebp(帧指针)将被设置为当前的栈顶指针(也就是返回地址的位置),函数的局部变量将在这个位置之下被存放。所以你的  sum  变量可能在 ebp-8 的位置。

这是一个非常粗略的解释,实际的细节可能会更复杂。我建议你查看生成的汇编代码,这将给你提供更具体的信息。但是,你的理解基本上是正确的,通常情况下,局部变量是以它们在代码中定义的顺序被推入栈中的,但有时编译器优化和调用约定会导致这一顺序发生变化。

在这里,我们的解释是一般性的,而实际情况可能会因为具体的编译器、优化级别、使用的硬件和操作系统等因素而有所不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 10:17:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 22:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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