当前位置: 首页 > 知识库问答 >
问题:

就汇编语言而言,如果一个结构太大而无法放入寄存器,那么该结构如何通过值返回?[副本]

苏洛城
2023-03-14

在 C 中,可以按值返回用户定义类型。在 x86-64 中,ASM 按值返回是通过将返回值移动到 RAX 并将存储的上一个 RIP 值弹出到 RIP 中以返回到调用方来实现的。如何通过值返回大于 RAX 的结构或实际上任何类型的数组?

共有1个答案

申颖逸
2023-03-14

SYSV x86_64调用约定(除Microsoft外,所有人都使用)允许在RAX/RDX寄存器对中返回最多16字节的结构和INTEGER分类,而SSE分类和最多32字节的结构可以在XMM0/XMM1寄存器对内返回。

结构的分类取决于结构中字段的类型,但基本上整数和指针类型将是integer,而float和double将是SSE。

较大的结构将获得 MEMORY 分类,因此需要一个额外的隐藏参数(在 RDI 中传递,因此附加到现有参数之前),指定一个指向返回值将写入的内存的指针。此指针将在 RAX 中返回。

这在SYSV x86_64 ABI文档中有详细说明

 类似资料:
  • 魔方加密的 PHP 规范支持标准 PHP 规范中常用的语法结构。 echo 语法为: echo statement; echo statement_1[, statement_2[, ...]]; exit 语法为: exit; exit(); exit(statement); 请注意,exit(statement); 不论表达式的值是整数还是字符串,总会输出后才终止脚本,这与标准

  • 本文向大家介绍汇编语言之寄存器详解,包括了汇编语言之寄存器详解的使用技巧和注意事项,需要的朋友参考一下 上图是cpu中三个组成部分:寄存器 运算器 控制器。其中寄存器是cpu中程序员用指令读取的唯一部件(调剂界面中的 寄存器窗口)。如果是16位cpu,就是处理,传输,暂时存储的数据长度都是16位。所以16位的cpu,寄存器也是16位。《汇编语言》这本书中使用的是16位寄存器位例子来讲的,所以下面的

  • 本文向大家介绍16位汇编语言寄存器及指令整理(小结),包括了16位汇编语言寄存器及指令整理(小结)的使用技巧和注意事项,需要的朋友参考一下 寄存器 通用寄存器 8位寄存器 16位寄存器 32位寄存器 寄存器名称 AH,AL AX EAX 累加寄存器 BH,BL BX EBX 基地址寄存器 CH,CL CX ECX 计数器寄存器 DH,DL DX EDX 数据寄存器 SI ESI 源变址寄存器 DI

  • 在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello World!": package main import "fmt" func main() { /* 这是我的

  • 现代计算机都是基于冯·诺依曼或哈佛体系结构的,不管是嵌入式系统、个人电脑还是服务器。这种两种体系结构的主要特点是:CPU和内存是计算机的两个主要组成部分,内存中保存着数据和指令,CPU从内存中取指令执行,其中有些指令让CPU做运算,有些指令让CPU读写内存中的数据。 冯·诺依曼结构 冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储

  • 问题内容: 我正在尝试学习Go并遵循现有的约定,但是,作为每个约定,您都需要先了解它们,然后才能很好地使用它们,经过一些研究,我没有找到以下问题的确切答案: 我已经在自己的内部建立了一个类似以下结构的项目: 我的主要是: 因此,问题是: 我读到我需要在每个package文件夹中都有一个文件,对吗? 如果是这样,在内部,我将如何导入,以及? 然后,是否可能会有类似的内容: …并且主要是做什么的? 问