Я пытаюсь узнать больше о том, как возвращаются ссылки, и в настоящее время я застрял на том, как они отображаются в сборке. Код, который я запускаю, таков:
struct Obj {
char buf[100];
int i;
long b;
} B, B2;
Obj foo(Obj b) {
b.i = 100; // Do something to the argument
return b;
}
int main() {
B2 = foo(B);
}
, а код сборки выглядит следующим образом:
.file "return_function_assembly.cpp"
.text
.globl B
.bss
.align 32
.type B, @object
.size B, 112
B:
.zero 112
.globl B2
.align 32
.type B2, @object
.size B2, 112
B2:
.zero 112
.text
.globl _Z3foo3Obj
.type _Z3foo3Obj, @function
_Z3foo3Obj:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -8(%rbp)
movl $100, 116(%rbp)
movq -8(%rbp), %rax
movq 16(%rbp), %rdx
movq 24(%rbp), %rcx
movq %rdx, (%rax)
movq %rcx, 8(%rax)
movq 32(%rbp), %rdx
movq 40(%rbp), %rcx
movq %rdx, 16(%rax)
movq %rcx, 24(%rax)
movq 48(%rbp), %rdx
movq 56(%rbp), %rcx
movq %rdx, 32(%rax)
movq %rcx, 40(%rax)
movq 64(%rbp), %rdx
movq 72(%rbp), %rcx
movq %rdx, 48(%rax)
movq %rcx, 56(%rax)
movq 80(%rbp), %rdx
movq 88(%rbp), %rcx
movq %rdx, 64(%rax)
movq %rcx, 72(%rax)
movq 96(%rbp), %rdx
movq 104(%rbp), %rcx
movq %rdx, 80(%rax)
movq %rcx, 88(%rax)
movq 112(%rbp), %rdx
movq 120(%rbp), %rcx
movq %rdx, 96(%rax)
movq %rcx, 104(%rax)
movq -8(%rbp), %rax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size _Z3foo3Obj, .-_Z3foo3Obj
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
addq $-128, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
leaq -128(%rbp), %rax
pushq 104+B(%rip)
pushq 96+B(%rip)
pushq 88+B(%rip)
pushq 80+B(%rip)
pushq 72+B(%rip)
pushq 64+B(%rip)
pushq 56+B(%rip)
pushq 48+B(%rip)
pushq 40+B(%rip)
pushq 32+B(%rip)
pushq 24+B(%rip)
pushq 16+B(%rip)
pushq 8+B(%rip)
pushq B(%rip)
movq %rax, %rdi
call _Z3foo3Obj
addq $112, %rsp
movq -128(%rbp), %rax
movq -120(%rbp), %rdx
movq %rax, B2(%rip)
movq %rdx, 8+B2(%rip)
movq -112(%rbp), %rax
movq -104(%rbp), %rdx
movq %rax, 16+B2(%rip)
movq %rdx, 24+B2(%rip)
movq -96(%rbp), %rax
movq -88(%rbp), %rdx
movq %rax, 32+B2(%rip)
movq %rdx, 40+B2(%rip)
movq -80(%rbp), %rax
movq -72(%rbp), %rdx
movq %rax, 48+B2(%rip)
movq %rdx, 56+B2(%rip)
movq -64(%rbp), %rax
movq -56(%rbp), %rdx
movq %rax, 64+B2(%rip)
movq %rdx, 72+B2(%rip)
movq -48(%rbp), %rax
movq -40(%rbp), %rdx
movq %rax, 80+B2(%rip)
movq %rdx, 88+B2(%rip)
movq -32(%rbp), %rax
movq -24(%rbp), %rdx
movq %rax, 96+B2(%rip)
movq %rdx, 104+B2(%rip)
movl $0, %eax
movq -8(%rbp), %rdx
xorq %fs:40, %rdx
je .L5
call __stack_chk_fail@PLT
.L5:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
.section .note.GNU-stack,"",@progbits
Система Linux, скомпилированная с g ++, и из моего понимания функциональных фреймовЯ должен увидеть дополнительную инструкцию "push", которая помещает адрес B2 в стек перед инструкцией call в функциональном фрейме.
Однако ни одна из этих инструкций push не соответствует тому, что янаходясь в поиске. Я вижу инструкцию по выводу и pushq (% rbp) в начале main, но ничего такого, что я должен видеть, мне кажется. Кто-нибудь может посоветовать, пожалуйста?