C++ 和汇编工具链:GNU
我有以下 C++ 代码:
int main(void)
{
int i = 33, j = 66;
swap(i,j);
cout << i << ", " << j << endl;
return(0);
}
如果我现在检查生成的汇编代码,我会进入以下区域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
交换例程本身是:
_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
那么 - 由于我对汇编程序不太熟悉 - 这是否意味着对于引用来说,变量的地址直接给出给函数?这意味着它们不会通过堆栈传递(这是有道理的,因为引用应该是什么)?
这是做什么的? (在呼叫周围的区域):
movq %rdx, %rsi
movq %rax, %rdi