问题标签 [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.
assembly - 装配中的 EBP、ESP 和堆栈框架
我对以下代码中的 EBP、ESP 和堆栈框架有一些疑问。
为什么我们从 esp 中减去 28?我们在 main 中有两个局部变量 x 和 y。那么为什么我们不减去 8 呢?
而且我们不是将值从右(或顶部)到左(或底部)放入堆栈吗?那么为什么我们在 [eax+8] 中加 1 而不是 [eax+4] 呢?
c++ - 如何在 Visual Studio (2008)、C++ 中显示包含函数变量的堆栈帧
有没有办法配置 Visual Studio (2008) 以可视化每个堆栈帧中的函数变量?我可以使用函数参数很好地看到调用堆栈,但想知道是否也有办法查看函数中的变量。这对于检查堆栈内容和了解递归函数调用的工作方式特别有帮助。非常感谢。
c - 试图理解 gcc 选项 -fomit-frame-pointer
我让 Google 告诉我gcc
option的含义-fomit-frame-pointer
,这会将我重定向到以下语句。
-fomit-frame-pointer
不要将帧指针保存在不需要的函数的寄存器中。这避免了保存、设置和恢复帧指针的指令;它还为许多功能提供了额外的寄存器。这也使得在某些机器上无法进行调试。
根据我对每个函数的了解,将在进程内存的堆栈中创建一个激活记录,以保存所有局部变量和更多信息。我希望这个帧指针表示一个函数的激活记录的地址。
在这种情况下,哪些函数类型不需要将帧指针保存在寄存器中?如果我得到这个信息,我会尝试基于它设计新函数(如果可能的话),因为如果帧指针没有保存在寄存器中,一些指令将在二进制中被省略。在有许多功能的应用程序中,这将真正显着提高性能。
c++ - C中的函数序言和结语
我知道嵌套函数调用中的数据会进入堆栈。堆栈本身实现了一个分步方法,用于在函数被调用或返回时从堆栈中存储和检索数据。这些方法的名称最广为人知的是 Prologue 和结语。
我尝试搜索有关此主题的材料但没有成功。你们知道关于函数序言和结尾如何在 C 中通常工作的任何资源(站点、视频、文章)吗?或者如果你能解释会更好。
PS:我只是想要一些一般的看法,而不是太详细。
debugging - ESP和EBP之间是什么?
是的,我确信这已经被隐含地回答了很多次,但我似乎无法完全理解它。
如果您有一个 (x86) 堆栈跟踪(例如,在 WinDbg 中查看它),并且查看寄存器,那么 EBP 和 ESP 值相隔 x 字节意味着什么?
链接:
- https://stackoverflow.com/a/3699916/321013
- https://stackoverflow.com/a/2466587/321013
- https://stackoverflow.com/a/5738940/321013
举一个我最近的堆栈跟踪的例子:
ESP 的值1ac5ee8c
- EBP 1ac5eef4
= 104 字节差。那么里面有什么?
assembly - 栈帧的基本结构
我目前正在玩,检查堆栈帧,试图了解它是如何工作的。在阅读了一些总是解释一般结构的文章之后:
local vars <---SP
低地址
老BP
<---BP
ret addr args 高地址
我有一个示例程序,它调用一个带有三个参数的函数,并有两个缓冲区作为局部变量:
我看了看程序的汇编代码,很惊讶在调用函数时没有找到我所期望的。我期待的东西是:
因此,在执行函数时,框架的结构将类似于:
但相反,会发生以下情况:
函数调用:
既然我们可以直接压栈,为什么还要在这里使用寄存器???在我们调用的实际函数中:
据我所见,为堆栈帧保留了 48 个字节,对吗?然后,使用函数调用中的寄存器,将函数的参数复制到堆栈的末尾。所以它看起来像这样:
我假设缓冲区介于 args 和 old 之间BP
。但是我真的不确定确切的位置...因为它们总共只有 15 个字节,而保留了 48 个字节...那里不会有一堆未使用的空间吗?有人可以帮我概述这里发生的事情吗?这是依赖于处理器的东西吗?我正在使用英特尔 i7。
干杯,砖
exception - MIPS 汇编子例程和堆栈,异常 5 错误数据地址,异常 7 存储地址错误
我正在尝试通过组装找出一些堆栈框架业务,我承认我不知道我在做什么......但我认为我很接近?
我的程序调用一个从 10 开始倒计时然后退出的子程序。这实际上似乎工作正常,但我收到一些异常错误。
这是我的输出
这是我的代码:
c# - 使用调用方法名作为条件语句的条件
是否可以获取调用方法的名称,并根据这些结果执行代码?
下面,我有两种用于数据库 CRUD 操作的方法。一个向数据库添加一个对象,另一个更新。两者都返回一个包含操作统计报告的对象。
在某些情况下,如果将 stat-obj 返回到 Add 方法,我不会费心在 Update 方法中更新操作 stat 对象的 pkey 字段。
c++ - 是否会共享调用者/被调用者堆栈帧的一部分?
我想知道编译器是否有可能做到这些场景?
首先我们将 SomeDataType 定义为:
场景 #1 _关于具有如下引用参数的被调用函数:
假设函数不是内联的,并且只有调用函数范围内的变量在程序中传递给该函数,并且考虑到引用不一定是指针这一事实,放置输入参数的内存部分在堆栈帧之间共享任何调用者函数和“doSomething”被调用者函数的堆栈帧,以便“doSomething”可以像寻址其本地范围内的任何局部变量一样寻址该参数,即通过将偏移量添加到确定其堆栈起始地址的基指针框架。
情景#2 _这对我来说似乎更不可能,但无论如何;关于返回“SomeDataType”类型结构的被调用函数:
结构“someStruct”所在的内存部分在任何调用者的堆栈帧和“doSomething”被调用函数的堆栈帧之间共享,因此请考虑调用函数中的以下语句:
在该调用者的范围内使用“TheStruct”会导致使用与被调用者范围内的“SomeStruct”所在的内存相同的部分,这意味着被调用者函数不会在任何地方复制“someStruct”,即使复制是必要的,比如在那里是调用者函数中的如下语句,表明目标不是调用者范围内的结构:
将共享部分的内容复制到该指针指示的位置将是调用者的职责。