我有一个简单的C代码,可以通过GCC 7.5生成汇编代码:
void swap(int* a, int* b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
int main()
{
int a = 16, b = 32;
swap(&a, &b);
return 0;
}
我使用此命令获取汇编代码:gcc -Wall -S -o main.s main.c,在main.s中找到以下行:
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp #line 9
movq %fs:40, %rax #line 10
movq %rax, -8(%rbp) #line 11
xorl %eax, %eax #line 12
......
我有两个问题:
我只有问题2的答案
第10行到第12行正在返回您的代码。
xorl
正在将您的返回寄存器清零。在这种情况下,返回寄存器为eax。对应于0。
rbp
是返回基本指针。它指示堆栈指向的位置。但是在这里,我们采用-8,即rip
,即重新运行地址。
FS
寄存器与线程信息块对齐,该线程信息块包含各种特定于线程的信息。