Memory management 关于基指针和堆栈指针的问题

Memory management 关于基指针和堆栈指针的问题,memory-management,pointers,stack,base,Memory Management,Pointers,Stack,Base,我正在写一份报告来总结一下。如果你点击我的个人资料,你会看到我已经这样做了一段时间。现在,我遇到了一些麻烦,因为在GDB上它向我展示了与VisualStudio不同的东西 因此,我不太确定我对基指针和堆栈指针的理解,如果我错了,我希望有人能把我引向正确的方向 对于x86计算机,堆栈通常向下增长(从较高的内存地址到较低的内存地址) 因此,当程序开始时,我们调用main函数 通常,在每个函数调用的入口,都会在当前esp位置创建一个堆栈,这就是我们所说的“堆栈顶部”。这是正确的吗 当旧ebp被推到堆栈

我正在写一份报告来总结一下。如果你点击我的个人资料,你会看到我已经这样做了一段时间。现在,我遇到了一些麻烦,因为在GDB上它向我展示了与VisualStudio不同的东西

因此,我不太确定我对基指针和堆栈指针的理解,如果我错了,我希望有人能把我引向正确的方向

对于x86计算机,堆栈通常向下增长(从较高的内存地址到较低的内存地址)

因此,当程序开始时,我们调用main函数

  • 通常,在每个函数调用的入口,都会在当前esp位置创建一个堆栈,这就是我们所说的“堆栈顶部”。这是正确的吗

  • 当旧ebp被推到堆栈上时,它是否被推到esp最初指向的位置

  • 之后,esp将向下移动,指向一个空内存位置,对吗

  • 最后,esp总是在变化,向下移动指向下一个可用的内存空间。对吗

  • esp是按字节移动还是按每4字节向下移动

  • 我知道有很多问题。但是谢谢你的时间


    谢谢您的回复,先生

    @伊斯库罗斯

    我对每个人如何定义esp感到困惑,因为esp指向的是推送到堆栈上的最新条目

    对于x86,由于堆栈向下增长,根据您的解释,esp将首先指向堆栈的最低地址。当我看汇编代码时,我们有

       0x080483f4 <+0>: push   %ebp
       0x080483f5 <+1>: mov    %esp,%ebp
       0x080483f7 <+3>: sub    $0x10,%esp
    
    很抱歉问了这么长的问题。但我真的很感谢你的帮助

  • 正确地说,堆栈帧是在当前esp位置创建的,而不是堆栈本身。堆栈在线程启动时创建一次,每个线程都有自己的堆栈,它只是进程内存空间中的一个区域。堆栈框架是在每个函数项上实际创建的,它是线程堆栈中的一个区域

  • 否,它被推送到地址[old\u esp-4](或x64中的[old\u rsp-8]),因为esp是堆栈的顶部,指向使用最低的地址。堆栈中的下一个DWORD(或QWORD)是空闲的,ebp被推送到那里

  • 是的,这通常通过子esp、值来完成

  • 不。首先,esp正在向下移动,指向堆栈中使用的最低地址,而不是下一个可用空间。其次,请记住,esp可能指向任何地方,而不仅仅是堆栈:在使用与堆栈相关的指令(如push/pop)之前,这是正常的

  • Esp按机器字大小移动:在x86中,它每4字节移动一次,而在x64中,它每8字节移动一次


  • esp的总体用途几乎总是一样的:存储堆栈的顶部。所有与堆栈相关的指令(如pop/push)都使用esp作为参数。在x86中,ebp和esp都用于存储有关堆栈帧的信息(对应于底部和顶部)。也许,你对这种冗余感到困惑。然而,在x64中,只有rsp用于基于堆栈的参数,rbp是一个通用寄存器

    堆栈中的缓冲区溢出又如何呢?当代码试图写入高于数组最后一个元素(或struct或其他任何元素)的内容时,通常会发生缓冲区溢出。堆栈向下增长,但数组向上增长。当我们写得更高时,我们可以访问返回地址、SEH处理程序以及调用者的内部变量

    是的,当我们说顶部时,我们指的是最低的地址。因此,大多数调试器以相反的顺序显示堆栈:

    -- ESP
    [Local Variables      ]
    [Previous EBP         ]   0x002CF740  (current ebp)
    [Return Address       ]   0x002CF744
    [Parameter 1          ]
    [Parameter 2          ]
    ...
    [Parameter n          ]
    
    这里,ESP指向“高于”所有数据的值,看起来更像“顶部”。虽然它仍然是使用率最低的地址

  • 正确地说,堆栈帧是在当前esp位置创建的,而不是堆栈本身。堆栈在线程启动时创建一次,每个线程都有自己的堆栈,它只是进程内存空间中的一个区域。堆栈框架是在每个函数项上实际创建的,它是线程堆栈中的一个区域

  • 否,它被推送到地址[old\u esp-4](或x64中的[old\u rsp-8]),因为esp是堆栈的顶部,指向使用最低的地址。堆栈中的下一个DWORD(或QWORD)是空闲的,ebp被推送到那里

  • 是的,这通常通过子esp、值来完成

  • 不。首先,esp正在向下移动,指向堆栈中使用的最低地址,而不是下一个可用空间。其次,请记住,esp可能指向任何地方,而不仅仅是堆栈:在使用与堆栈相关的指令(如push/pop)之前,这是正常的

  • Esp按机器字大小移动:在x86中,它每4字节移动一次,而在x64中,它每8字节移动一次


  • esp的总体用途几乎总是一样的:存储堆栈的顶部。所有与堆栈相关的指令(如pop/push)都使用esp作为参数。在x86中,ebp和esp都用于存储有关堆栈帧的信息(对应于底部和顶部)。也许,你对这种冗余感到困惑。然而,在x64中,只有rsp用于基于堆栈的参数,rbp是一个通用寄存器

    堆栈中的缓冲区溢出又如何呢?当代码试图写入高于数组最后一个元素(或struct或其他任何元素)的内容时,通常会发生缓冲区溢出。堆栈向下增长,但数组向上增长。当我们写得更高时,我们可以访问返回地址、SEH处理程序以及调用者的内部变量

    是的,当我们说顶部时,我们指的是最低的地址。因此,大多数调试器以相反的顺序显示堆栈:

    -- ESP
    [Local Variables      ]
    [Previous EBP         ]   0x002CF740  (current ebp)
    [Return Address       ]   0x002CF744
    [Parameter 1          ]
    [Parameter 2          ]
    ...
    [Parameter n          ]
    

    这里,ESP指向“高于”所有数据的值,看起来更像“顶部”。尽管它仍然是使用率最低的地址。

    谢谢您,先生。我仍然有点怀疑,我编辑了我的帖子。如果你有时间,你介意看一看吗?谢谢,非常感谢。拉斯维加斯