HWitty 发表于 2023-7-18 19:41:22

汇编代码求解


VS局部变量不是谁先定义谁入栈吗?
那么sum先定义,按理说sum应该在高地址(ebp-4)处,为啥书中说在处

陶远航 发表于 2023-7-18 19:41:37

在汇编语言中,局部变量的存储位置通常是相对于栈帧指针(ebp)来计算的。根据常见的惯例,局部变量是按照定义的顺序依次入栈的,越先定义的局部变量在栈中的地址越高。

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

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

为了更好地理解这个问题,你可以查看完整的汇编代码,并注意其他与栈相关的指令和操作。这样你就能确定sum在栈中的确切位置。

isdkz 发表于 2023-7-18 19:41:53

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

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

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

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

在这里,我们的解释是一般性的,而实际情况可能会因为具体的编译器、优化级别、使用的硬件和操作系统等因素而有所不同。

涛4091 发表于 2023-7-19 10:17:29

{:10_269:}
页: [1]
查看完整版本: 汇编代码求解