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)
引用只不过是一个指针,"只是"用不同的符号.
因此,无论您使用指针还是引用,最终生成的汇编代码都是相同的
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)