堆栈中的帧指针是什么?这个框架到底是什么?(汇编中的堆栈)



所以,这里是我如何解释堆栈,让我知道什么是错的/对的。这适用于任何类型的汇编。

所以它是:

指令带指令的字节码

添加到指令末尾的添加字节的'堆栈'(如果我没记错,这些设置为0,无关紧要)

在这个堆栈中,我们有一个堆栈指针,它将查看最近推入的字节的确切位置。然后我们将有一个堆栈基,它是堆栈的最底部(这个值永远不会改变)。因此,如果指令和指令的长度为5000字节,则堆栈基数将是第50001个字节。如果堆栈是额外的2500字节,那么堆栈限制将是7500字节。

让我知道那是否正确。现在看问题:

到底什么是帧或帧指针?我知道帧是堆栈的一个帧(即堆栈的特定部分),但这对我来说真的很困惑。框架是如何设置的?我们为什么需要一个?帧指针是该帧所在位置的确切字节位置吗?如果有,我们怎么知道它有多长?

我查阅了一些关于帧和帧指针的文章,得到了许多令人困惑的答案。不知道我们是否可以用简单的英语来谈论它,哈哈。

到底什么是帧或帧指针?

这是不同工具集通常使用的约定。在函数入口EBP|RBP被压入堆栈,然后设置为ESP|RSP,导致[ESP|RSP]包含调用函数的EBP|RBP的值。在嵌套函数的情况下,这会创建一个指向每个函数堆栈的反向指针链,这被称为帧,EBP|RBP将被认为是当前帧指针。

请注意,一些工具集包括一个选项来禁用EBP|RBP的使用,释放它作为一个通用寄存器,而不是作为一个帧指针。

最新更新