了解C/C++中函数调用的堆栈框架? [关闭]

2024-05-27

我也是 C/C++ 和汇编语言的新手。 这也可能是一个非常基本的问题。 我试图了解堆栈帧是如何构建的以及哪些变量(参数)以什么顺序推送到堆栈? 一些搜索结果表明......C/C++ 编译器根据函数内执行的操作来决定。例如,如果函数假设仅将传递的 int 参数的值增加 1 并返回(类似于 ++ 运算符),它将把函数的所有 .. 参数和局部变量放入寄存器中,并执行加法。 ...想知道哪个寄存器用于返回/按值传递?....如何返回引用? ..... eax、ebx、ecx 和 edx 的黑白差异。

请求书籍/博客/链接或任何类型的材料来了解寄存器,在函数调用期间使用/构建和销毁堆栈和堆引用......以及主函数是如何存储的? 提前致谢


你的问题在这里是边缘性的。程序员 https://softwareengineering.stackexchange.com/可能是一个更好的地方。

Queinnec 的书可能是一本了解堆栈等概念的好书Lisp 的小片段 http://en.wikipedia.org/wiki/Lisp_in_Small_Pieces(它很好地解释了 Lisp 中的栈是什么)。还,SICP http://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs是一本好书read http://mitpress.mit.edu/sicp/.

D.Knuth http://en.wikipedia.org/wiki/Donald_Knuth的书籍和MMIX http://www-cs-faculty.stanford.edu/~knuth/mmix.html也是一本好书。

仔细阅读维基百科调用堆栈 http://en.wikipedia.org/wiki/Call_stack page.

理论上,不需要调用堆栈,并且某些语言和实现(例如旧的 SML/NJ)不使用任何堆栈(而是在垃圾收集堆中分配调用帧)。参见 A.Appel 的旧论文垃圾收集可以比堆栈分配更快 http://www.cs.princeton.edu/~appel/papers/45.ps(并了解更多关于垃圾收集 http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29一般来说)。

通常 C 和 C++ 实现都有一个堆栈(并且经常使用硬件堆栈)。某些 C 局部变量可能没有任何堆栈位置(因为它们已经过优化,或者保存在寄存器中)。有时,C 局部变量的堆栈位置可能会发生变化(编译器将在某些情况下使用一个调用堆栈槽,而在同一局部变量的其他情况下使用另一个调用堆栈槽)。当然,一些临时值可能会像局部变量一样进行编译(因此保留在寄存器中,在一个堆栈槽中,然后在另一个堆栈槽中,等等......)。优化时,编译器可能会对变量执行一些奇怪的操作。

On some old machines IBM/360 http://en.wikipedia.org/wiki/System/360 or IBM z/series http://en.wikipedia.org/wiki/IBM_zSeries, there is no hardware stack; the stack used by the C compiler is a software convention (e.g. some register is dedicated to that usage, without specific hardware support)

考虑一下递归定义的函数的执行(或解释)(就像古老的函数一样)阶乘天真的编码)。阅读递归 http://en.wikipedia.org/wiki/Recursion(一般来说,在计算机科学中 http://en.wikipedia.org/wiki/Recursion_%28computer_science%29), 原始递归函数 http://en.wikipedia.org/wiki/Primitive_recursive_function, 拉姆达演算 http://en.wikipedia.org/wiki/Lambda_calculus, 指称语义 http://en.wikipedia.org/wiki/Denotational_semantics, 堆栈自动机 http://en.wikipedia.org/wiki/Stack_automaton, 寄存器分配 http://en.wikipedia.org/wiki/Register_allocation, 尾部调用 http://en.wikipedia.org/wiki/Tail_call, 延续 http://en.wikipedia.org/wiki/Continuation, ABI http://en.wikipedia.org/wiki/Application_binary_interface, 中断 http://en.wikipedia.org/wiki/Interrupt, Posix 信号 http://en.wikipedia.org/wiki/Unix_signal, 信号堆栈(2) http://man7.org/linux/man-pages/man2/sigaltstack.2.html, 获取上下文(2) http://man7.org/linux/man-pages/man2/getcontext.2.html, 长跑(3) http://man7.org/linux/man-pages/man3/longjmp.3.html等等...等等...

还可以阅读有关的书籍计算机架构 http://en.wikipedia.org/wiki/Computer_architecture。在实践中,调用堆栈非常重要,以至于多个硬件资源(包括堆栈指针注册,通常是调用框架基指针寄存器,也许还有隐藏的机器,例如缓存相关)专用于常见处理器上。

您还可以查看 GCC 编译器使用的中间表示形式。然后使用-fdump-tree-all or the GCC MELT 探针 http://gcc-melt.org/index.html#probe_id。如果查看生成的程序集,请务必通过-S -fverbose-asm给你的gcc命令。

另请参阅Linux 汇编指南 http://tldp.org/HOWTO/Assembly-HOWTO/.

I gave a lot of links. It is difficult to answer better, because I have no idea of your background.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解C/C++中函数调用的堆栈框架? [关闭] 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 按成员序列化

    我已经实现了template
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 从远程获取上个月在 git 分支上提交的文件列表

    我正在尝试获取上个月在 master 分支的 github 存储库上更改的所有文件的列表 我的本地克隆没有可以追溯到那么远的日志 因此当我运行以下命令时 git diff stat 1 month ago 我收到一条警告消息和一小部分更改
  • 如何使用 bash 中提供的工具生成一系列非周末日期?

    我想生成一个文件列表 其中名称包含 filename date 例如file 20111101 file 20120703 开始November 1 2011直到今天 应该不包括周末 Thanks 2011年试试这个 for y in 20
  • 不想保留一对一的实体

    假设我有两节课Employee and Department In Employee我已经写了 OneToOne fetch FetchType EAGER cascade CascadeType ALL JoinColumn name d
  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • django 创建多类型用户的最佳方法

    我想在 django 中创建多个用户 我想知道哪种方法是最好的 class Teachers models Model user models ForeignKey User is teacher models BooleanField d
  • 将资源文件链接到 Laravel4 中的视图

    您好 我是新手 正在学习 laravel 4 创建应用程序 我正在尝试使用 laravel Blade 将 twitter bootstrap3 文件链接到视图 我安装了一个新的 laravel 应用程序文件夹 为了从 url 路径中删除
  • 如何在lxml,Python中将<转换为<?

    有一个xml文件
  • 手动排除sbt中的一些测试类

    我通常在 CI 中执行以下命令 清理更新编译测试发布 但是 我想从 sbt 命令行中排除 1 个 或几个 测试类 我怎样才能做到这一点 我不想更改我的代码以使用忽略等 两种可能的选择 test only See http www scala
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 为什么 Cassandra 客户端在生产中没有 epoll 时会失败? [复制]

    这个问题在这里已经有答案了 当我在本地运行服务时 我收到一条警告 指出 epoll 不可用 因此它使用 NIO 很公平 当我将其部署到 Kubernetes 中时 我得到了以下信息 这导致服务无法运行 2017 03 29T19 09 22
  • 找出段落中出现的单词

    sentence Alice was not a bit hurt and she jumped up on to her feet in a moment words Alice jumped played 我可以使用filterpyth
  • APACHE POI 从 Java 中的 Excel 获取精确的字体颜色

    在 Excel 工作表中 如何使用 Java 中的 Apache POI 获取准确的字体颜色值 我试图通过使用来获取字体颜色 org apache poi ss usermodel Font f book getFontAt style g
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma
  • 创建新类别的优点和缺点是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这可能是一个非常基本的问题 但这是我在学习更多有关 Actionscript 3 的过程中实际遇到的问题 然而 我的第一个问题非常笼统 什么时候
  • 何时在 Gevent 中使用线程池

    我注意到 Gevent 有线程池对象 有人可以向我解释何时使用线程池以及何时使用常规池吗 gevent threadpool 和 gevent pool 有什么区别 当你有一段需要很长时间运行 几秒钟 并且不会导致 greenlet 切换的
  • AVAudioSessionPortBluetoothHFP、A2DP 和 LE 有什么区别?

    Apple 中记录了三种不同的蓝牙相关音频端口类型AVAudioSessionPort 描述 https developer apple com library ios documentation AVFoundation Referenc
  • 如何在SQL中查找单元格中的重复单词

    我有一个名为 situation 和 entityid 的列 Entityid Situation 1234 In the the world of of 3456 Total universe is is a 任何人都可以给我查询以找到这
  • Time 方法在另一个线程中执行并在超时时中止

    您好 我正在尝试异步运行方法 以便计算持续时间并在超过超时时取消该方法 我尝试使用异步和等待来实现这一点 但没有运气 也许我过度设计了这个 任何输入都会受到赞赏 应该注意的是 我无法更改接口 TheirInterface 因此得名 到目前为
  • 云存储 API 的错误导入“系统调用”

    我正在按照以下说明进行操作https cloud google com appengine docs go googlecloudstorageclient download开始将一些代码从现已弃用的文件 API 迁移到新的 Cloud S
  • 了解C/C++中函数调用的堆栈框架? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我也是 C C 和汇编语言的新手 这