我正在简要研究SystemVABIforamd64/x86-64体系结构,并很好奇它如何处理超过128位的返回值,其中rax
和rdx
还不够。
我在 Ubuntu 18.04 64 位(更一般地说,任何符合 amd64 POSIX 的系统)上编写了以下 C 代码:
struct big {
long long a, b, c, d;
};
struct big bigfunc(void) {
struct big r = {12, 34, 56, 78};
return r;
}
将其编译为gcc-S-masm=intel t. c
,并检查t. s
:
.file "t.c"
.intel_syntax noprefix
.text
.globl bigfunc
.type bigfunc, @function
bigfunc:
.LFB0:
.cfi_startproc
mov QWORD PTR -40[rsp], rdi
mov QWORD PTR -32[rsp], 12
mov QWORD PTR -24[rsp], 34
mov QWORD PTR -16[rsp], 56
mov QWORD PTR -8[rsp], 78
mov rcx, QWORD PTR -40[rsp]
mov rax, QWORD PTR -32[rsp]
mov rdx, QWORD PTR -24[rsp]
mov QWORD PTR [rcx], rax
mov QWORD PTR 8[rcx], rdx
mov rax, QWORD PTR -16[rsp]
mov rdx, QWORD PTR -8[rsp]
mov QWORD PTR 16[rcx], rax
mov QWORD PTR 24[rcx], rdx
mov rax, QWORD PTR -40[rsp]
ret
.cfi_endproc
.LFE0:
.size bigfunc, .-bigfunc
.ident "GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
.section .note.GNU-stack,"",@progbits
毫不奇怪,结构定义没有编译成任何指令,所以输出只包含函数bigfunc
。输出程序集看起来非常简单,从堆栈中为struct bigfunc
分配内存并分配初始值,然后返回它。
如果我理解正确的话,在执行< code>ret之前,寄存器< code>rax包含函数调用开始处的< code>rdi的值(来自< code>QWORD PTR -40[rbp])。根据SysV,< code>rdi是提供给函数的第一个参数,这是不可能的,因为函数不接受任何参数。所以我有几个问题:
根据ABI(1),第22页
如果类型有类MEMORY,那么调用者会为返回值提供空间,并在%rdi中传递此存储的地址,就像它是函数的第一个参数一样。实际上,这个地址变成了“隐藏”的第一个字母。此存储不得与被调用方通过此参数以外的其他名称看到的任何数据重叠。返回时,%rax将包含调用者在%rdi中传入的地址
第17、18和19页描述了分类,我相信第19页的下面是将struct big
指定为MEMORY类的子句。
(c) 如果聚合的大小超过 2 个 8 字节,而前 8 个字节不是 SSE 或任何其他 8 个字节不是 SSEUP,则整个参数将在内存中传递。
也就是说,调用者必须为返回值分配内存,并在%rdi中传递一个指向该内存的指针(被调用的函数在%rax中返回相同的地址)
(1)在https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI有更新的官方版本的ABI,虽然链接目前不能正常工作。
问题内容: 我正在使用具有以下签名的类: 我正试图通过其他班级来称呼它: 但是在这里我得到这个错误: 为什么在Class扩展行中将我指定为第三个参数? 问题答案: 您可以通过对返回的AsyncTask调用AsyhncTask的get()方法来获得结果,但是当它等待获取结果时,它将把它从异步任务变成同步任务。 由于您的AsyncTask位于单独的类中,因此您可以创建一个接口类并在AsyncTask中
特别是如果信号处理需要调用一个/一些活动,我如何实现? 我试图返回数据或异常,但它不起作用。 无法从信号方法返回数据。抛出异常将阻止工作流执行。
1.API 返回结构 返回结果(response)分为:状态码(status code)、头部(headers)、消息体(body)。其中算法的结果会以 JSON 格式放在消息体中。 如何从 HTTP 返回中分别获取这三部分信息,请参见所用 HTTP 库的文档。 解析 JSON 格式需要寻找所用语言的 JSON 库,参见 http://www.json.org/ 2.正常结果 状态码为 2xx的为
问题内容: 使用jQuery,我使用’serialize’检索可排序列表的位置,如下所示: 然后,变量“ order”将收到以下内容: 现在如何在ajax调用中使用这些数据? 我打算这样做,但是很丑陋,我不能更改参数名称’id’: 也许我需要反序列化,然后内嵌变量“ order”并将其分配给一个参数? 服务器端代码没有问题,但是jQuery客户端站点代码有问题。问题是,如何在脚本中放置“ orde
问题内容: 我正在使用Hibernate 4.2,JPA 2.0和Postgres 9.2 代码卡在 在进一步调查中,我发现Hibernate调用了class 方法。此方法尝试加载有关每个数据库对象的元数据 的代码是Postgers的JDBC驱动程序的一部分,而确实是花费时间来执行该方法的驱动程序(我加载了驱动程序源并尝试了跟踪)。但是由于这个问题在Hibernate 3.3(我之前使用过)中没有
我有一个Python进程(或者更确切地说,在一个使用者组中并行运行的一组进程),它根据来自某个主题的Kafka消息输入来处理数据。通常每条消息的处理都很快,但有时,取决于消息的内容,可能需要很长时间(几分钟)。在这种情况下,Kafka broker断开客户端与组的连接,并启动重新平衡。我可以将设置为一个非常大的值,但它可能会超过10分钟,这意味着如果客户机死亡,集群在10分钟内无法正确地重新平衡。