问题标签 [stack-frame]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
9491 浏览

assembly - 装配中的 EBP、ESP 和堆栈框架

我对以下代码中的 EBP、ESP 和堆栈框架有一些疑问。

  1. 为什么我们从 esp 中减去 28?我们在 main 中有两个局部变量 x 和 y。那么为什么我们不减去 8 呢?

  2. 而且我们不是将值从右(或顶部)到左(或底部)放入堆栈吗?那么为什么我们在 [eax+8] 中加 1 而不是 [eax+4] 呢?


在程序集中传递参数

0 投票
1 回答
1212 浏览

c++ - 如何在 Visual Studio (2008)、C++ 中显示包含函数变量的堆栈帧

有没有办法配置 Visual Studio (2008) 以可视化每个堆栈帧中的函数变量?我可以使用函数参数很好地看到调用堆栈,但想知道是否也有办法查看函数中的变量。这对于检查堆栈内容和了解递归函数调用的工作方式特别有帮助。非常感谢。

0 投票
3 回答
75029 浏览

c - 试图理解 gcc 选项 -fomit-frame-pointer

我让 Google 告诉我gccoption的含义-fomit-frame-pointer,这会将我重定向到以下语句。

-fomit-frame-pointer

不要将帧指针保存在不需要的函数的寄存器中。这避免了保存、设置和恢复帧指针的指令;它还为许多功能提供了额外的寄存器。这也使得在某些机器上无法进行调试。

根据我对每个函数的了解,将在进程内存的堆栈中创建一个激活记录,以保存所有局部变量和更多信息。我希望这个帧指针表示一个函数的激活记录的地址。

在这种情况下,哪些函数类型不需要将帧指针保存在寄存器中?如果我得到这个信息,我会尝试基于它设计新函数(如果可能的话),因为如果帧指针没有保存在寄存器中,一些指令将在二进制中被省略。在有许多功能的应用程序中,这将真正显着提高性能。

0 投票
4 回答
28770 浏览

c++ - C中的函数序言和结语

我知道嵌套函数调用中的数据会进入堆栈。堆栈本身实现了一个分步方法,用于在函数被调用或返回时从堆栈中存储和检索数据。这些方法的名称最广为人知的是 Prologue 和结语。

我尝试搜索有关此主题的材料但没有成功。你们知道关于函数序言和结尾如何在 C 中通常工作的任何资源(站点、视频、文章)吗?或者如果你能解释会更好。

PS:我只是想要一些一般的看法,而不是太详细。

0 投票
2 回答
95594 浏览

debugging - ESP和EBP之间是什么?

是的,我确信这已经被隐含地回答了很多次,但我似乎无法完全理解它。

如果您有一个 (x86) 堆栈跟踪(例如,在 WinDbg 中查看它),并且查看寄存器,那么 EBP 和 ESP 值相隔 x 字节意味着什么?

链接:

举一个我最近的堆栈跟踪的例子:

ESP 的值1ac5ee8c- EBP 1ac5eef4= 104 字节差。那么里面有什么?

0 投票
2 回答
1225 浏览

assembly - 栈帧的基本结构

我目前正在玩,检查堆栈帧,试图了解它是如何工作的。在阅读了一些总是解释一般结构的文章之后:

local vars <---SP 低地址

BP <---BP

ret addr args 高地址

我有一个示例程序,它调用一个带有三个参数的函数,并有两个缓冲区作为局部变量:

我看了看程序的汇编代码,很惊讶在调用函数时没有找到我所期望的。我期待的东西是:

因此,在执行函数时,框架的结构将类似于:

但相反,会发生以下情况:

函数调用:

既然我们可以直接压栈,为什么还要在这里使用寄存器???在我们调用的实际函数中:

据我所见,为堆栈帧保留了 48 个字节,对吗?然后,使用函数调用中的寄存器,将函数的参数复制到堆栈的末尾。所以它看起来像这样:

我假设缓冲区介于 args 和 old 之间BP。但是我真的不确定确切的位置...因为它们总共只有 15 个字节,而保留了 48 个字节...那里不会有一堆未使用的空间吗?有人可以帮我概述这里发生的事情吗?这是依赖于处理器的东西吗?我正在使用英特尔 i7。

干杯,砖

0 投票
1 回答
1327 浏览

exception - MIPS 汇编子例程和堆栈,异常 5 错误数据地址,异常 7 存储地址错误

我正在尝试通过组装找出一些堆栈框架业务,我承认我不知道我在做什么......但我认为我很接近?

我的程序调用一个从 10 开始倒计时然后退出的子程序。这实际上似乎工作正常,但我收到一些异常错误。

这是我的输出

在此处输入图像描述

这是我的代码:

0 投票
2 回答
3670 浏览

assembly - 用汇编语言访问堆栈帧

我是组装新手,然后我遇到了这篇文章

它说这段代码

相当于这个

根据这个视频,要访问基指针上方的堆栈值,我们应该添加。如果它低于指针,我们应该减去。鉴于上面的例子,他们从基指针中减去了一些东西来移动所需变量的位置,这与视频中的说明相反。

我错过了什么?我知道 sub esp, 12 正在为局部变量分配空间,所以我想到的是 EBP 低于该分配,所以我认为它应该是 [ebp + something] 而不是减去。

所以当他做这个 sub esp, 12 时,这就是 Stack 的样子。

文章是错的,还是我误解了?

0 投票
1 回答
915 浏览

c# - 使用调用方法名作为条件语句的条件

是否可以获取调用方法的名称,并根据这些结果执行代码?

下面,我有两种用于数据库 CRUD 操作的方法。一个向数据库添加一个对象,另一个更新。两者都返回一个包含操作统计报告的对象。

在某些情况下,如果将 stat-o​​bj 返回到 Add 方法,我不会费心在 Update 方法中更新操作 stat 对象的 pkey 字段。

0 投票
1 回答
184 浏览

c++ - 是否会共享调用者/被调用者堆栈帧的一部分?

我想知道编译器是否有可能做到这些场景?

首先我们将 SomeDataType 定义为:

场景 #1 _关于具有如下引用参数的被调用函数:

假设函数不是内联的,并且只有调用函数范围内的变量在程序中传递给该函数,并且考虑到引用不一定是指针这一事实,放置输入参数的内存部分在堆栈帧之间共享任何调用者函数和“doSomething”被调用者函数的堆栈帧,以便“doSomething”可以像寻址其本地范围内的任何局部变量一样寻址该参数,即通过将偏移量添加到确定其堆栈起始地址的基指针框架。

情景#2 _这对我来说似乎更不可能,但无论如何;关于返回“SomeDataType”类型结构的被调用函数:

结构“someStruct”所在的内存部分在任何调用者的堆栈帧和“doSomething”被调用函数的堆栈帧之间共享,因此请考虑调用函数中的以下语句:

在该调用者的范围内使用“TheStruct”会导致使用与被调用者范围内的“SomeStruct”所在的内存相同的部分,这意味着被调用者函数不会在任何地方复制“someStruct”,即使复制是必要的,比如在那里是调用者函数中的如下语句,表明目标不是调用者范围内的结构:

将共享部分的内容复制到该指针指示的位置将是调用者的职责。