当前位置: 首页 > 面试题库 >

x86_64 va_list结构的格式是什么?

微生雨泽
2023-03-14
问题内容

任何人都可以参考va_listx86_64
ABI(在Linux上使用的)的表示形式?我正在尝试调试一些代码,这些代码中的堆栈或参数似乎已损坏,这确实有助于理解我 应该 看到的内容…


问题答案:

我发表了评论。

这可能会有所帮助。这是一个参考,尽管很轻巧(
编辑 :原始链接已失效;已替换Wayback Machine保留的链接)。

变量参数列表参考从第50页开始,然后在第52-53页的文档中继续va_list

va_list类型

va_list类型是一个数组,其中包含一个结构的单个元素,该结构包含实现va_arg宏所需的信息。va_list类型的C定义在图3.34中给出

// Figure 3.34
typedef struct {
   unsigned int gp_offset;
   unsigned int fp_offset;
   void *overflow_arg_area;
   void *reg_save_area;
} va_list[1];

va_start宏

va_start宏按如下所示初始化结构:

reg_save_area 该元素指向寄存器保存区的开始。

overflow_arg_area该指针用于获取在堆栈上传递的参数。它使用在堆栈上传递的第一个参数的地址(如果有的话)进行初始化,然后始终更新以指向堆栈上下一个参数的开头。

gp_offset该元素保存从reg_save_area到保存下一个可用的通用参数寄存器的位置的字节偏移量。如果所有参数寄存器都已用尽,则将其设置为值48(6 * 8)。

fp_offset该元素保存从reg_save_area到保存下一个可用浮动点自变量寄存器的位置的字节偏移量。如果所有参数寄存器都已用尽,则将其设置为值304(6 * 8 + 16 * 16)。



 类似资料:
  • 问题内容: 我在Go中编写解释器,并且正在寻找惯用的方式来存储AST。我阅读了Go编译器的源代码,似乎他们使用了带有空方法的接口来表示AST。例如,我们具有以下层次结构, 这就是上述层次结构以“空方法”方式实现的方式。 上面的代码是一个人为的示例,这就是Go编译器如何使用许多空方法来实现 AST的方式。但为什么?注意定义了多少个空方法。随着层次结构深度的增加,它可能会变得非常复杂。 注释中指出,空

  • 当你决定看这篇文章,就意味着系统学习 数据结构的开始。本节,我们先来讲什么是 数据结构。   数据结构,直白地理解,就是研究数据的存储方式。 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储 是为了后期取得它们的加和值,无缘由的数据存储行为是对存储空间的不负责任。 因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好的方式来存储数据,而这也是数

  • 问题内容: 在SQL中,“结构化”一词是什么意思? 是否因为此(SQL)语言语句被组织为子句,表达式和谓词? 由于这个组织,它被称为“结构化”吗? 问题答案: 最初的全名是SEQUEL,代表“结构化英语查询语言”。由于商标问题,后来不得不将其重命名为SQL。 因此,基本上,这是将编程语言出售为“就像英语一样,除了具有正式语法外”的另一种尝试(因此称为“结构化”)。

  • 以下是我正在使用的数据结构示例- 所有数据都在字符串中,包括子列表都是字符串值 子列表值可能与其他子列表值重复 我需要能够获得大小并遍历子列表 本质上,每个子列表都有我需要获取的引用ID,以及与该列表关联的子列表ID 我不知道哪一个最合适。我可能会先选择我能实施的那个。 我应该使用、、还是与列表一起使用?

  • 本文向大家介绍lucence内部结构是什么?相关面试题,主要包含被问及lucence内部结构是什么?时的应答技巧和注意事项,需要的朋友参考一下 面试官:想了解你的知识面的广度和深度。 解答: Lucene是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点。可以基于这个脉络展开一些。      

  • 本文向大家介绍kafka的message格式是什么样的?相关面试题,主要包含被问及kafka的message格式是什么样的?时的应答技巧和注意事项,需要的朋友参考一下 一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。 当magic的值为1的时候,