C++汇编程序输出 - 如何实现引用

Mic*_*ael 0 c++ assembly reference

用于c ++和汇编程序的工具链:GNU

我有以下C++代码:

int main(void)
{
  int i = 33, j = 66;
  swap(i,j);

  cout << i << ", " << j << endl;

  return(0);
}
Run Code Online (Sandbox Code Playgroud)

如果我现在检查生成的汇编代码,我会在swap调用区域中获得以下内容:

movl    $33, -24(%rbp)
movl    $66, -20(%rbp)
leaq    -20(%rbp), %rdx
leaq    -24(%rbp), %rax
movq    %rdx, %rsi
movq    %rax, %rdi
call    _ZSt4swapIiEvRT_S1_
movl    -20(%rbp), %ebx
movl    -24(%rbp), %eax
Run Code Online (Sandbox Code Playgroud)

交换例程本身是:

_ZSt4swapIiEvRT_S1_:
.LFB1232:
.cfi_startproc
pushq   %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq    %rsp, %rbp
.cfi_def_cfa_register 6
movq    %rdi, -24(%rbp)
movq    %rsi, -32(%rbp)
movq    -24(%rbp), %rax
movl    (%rax), %eax
movl    %eax, -4(%rbp)
movq    -32(%rbp), %rax
movl    (%rax), %edx
movq    -24(%rbp), %rax
movl    %edx, (%rax)
movq    -32(%rbp), %rax
movl    -4(%rbp), %edx
movl    %edx, (%rax)
popq    %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
Run Code Online (Sandbox Code Playgroud)

所以 - 因为我不熟悉汇编程序 - 这是否意味着对于引用,变量的地址直接赋予函数?这意味着它们不会通过堆栈传递(这是有道理的,因为应该引用什么)?

这是做什么的?(在电话周边地区):

movq    %rdx, %rsi
movq    %rax, %rdi
Run Code Online (Sandbox Code Playgroud)

Ola*_*che 5

引用只不过是一个指针,"只是"用不同的符号.

因此,无论您使用指针还是引用,最终生成的汇编代码都是相同的

void swap1(int &a, int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

void swap2(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
Run Code Online (Sandbox Code Playgroud)
_Z5swap1RiS_:
.LFB0:
    .cfi_startproc
    movl    (%rdi), %eax
    movl    (%rsi), %edx
    movl    %edx, (%rdi)
    movl    %eax, (%rsi)
    ret
    .cfi_endproc

_Z5swap2PiS_:
.LFB1:
    .cfi_startproc
    movl    (%rdi), %eax
    movl    (%rsi), %edx
    movl    %edx, (%rdi)
    movl    %eax, (%rsi)
    ret
    .cfi_endproc
Run Code Online (Sandbox Code Playgroud)