相关疑难解决方法(0)

x86-64 System V ABI在哪里记录?

x86-64 System V ABI(用于除Windows之外的所有内容)过去常常访问http://x86-64.org/documentation/abi.pdf,但该网站现已脱离互联网.

该文件是否有新的权威主页?

linux assembly x86-64 abi calling-convention

43
推荐指数
2
解决办法
2万
查看次数

是什么阻止了将函数参数用作隐藏指针?

我尝试了解System V AMD64 的含义-ABI的调用约定并查看以下示例:

struct Vec3{
    double x, y, z;
};

struct Vec3 do_something(void);

void use(struct Vec3 * out){
    *out = do_something();
}
Run Code Online (Sandbox Code Playgroud)

Vec3-variable是型存储器的,因此调用者(use)必须返回的变量分配空间并把它传递为隐藏指针到被叫方(即,do_something)。这是我们在生成的汇编器中看到的(在godbolt上,使用编译-O2):

use:
        pushq   %rbx
        movq    %rdi, %rbx           ;remember out
        subq    $32, %rsp            ;memory for returned object
        movq    %rsp, %rdi           ;hidden pointer to %rdi
        call    do_something
        movdqu  (%rsp), %xmm0        ;copy memory to out
        movq    16(%rsp), %rax
        movups  %xmm0, (%rbx)
        movq    %rax, 16(%rbx)
        addq    $32, …
Run Code Online (Sandbox Code Playgroud)

c optimization gcc x86-64 calling-convention

13
推荐指数
1
解决办法
235
查看次数

超大结构如何返回到堆栈上?

据说从函数返回过大的值(而不是返回指向 的指针)会在堆栈上产生不必要的复制我所说的“超大”是指无法放入返回寄存器的值。structstructstruct

不过,引用维基百科

当需要超大的结构返回时,另一个指向调用者提供的空间的指针将作为第一个参数添加到前面,将所有其他参数向右移动一个位置。

返回结构/类时,调用代码分配空间并通过堆栈上的隐藏参数传递指向该空间的指针。被调用函数将返回值写入该地址。

看起来至少在x86架构上,所讨论struct的问题是由被调用者直接写入调用者指定的内存中,那么为什么会有一个副本呢?返回超大的structs 真的会在堆栈上产生副本吗?

c x86 struct abi calling-convention

6
推荐指数
2
解决办法
1172
查看次数

标签 统计

calling-convention ×3

abi ×2

c ×2

x86-64 ×2

assembly ×1

gcc ×1

linux ×1

optimization ×1

struct ×1

x86 ×1