我想了解 C 调用约定。为此,我编写了以下代码:
#include <stdio.h>
#include <stdlib.h>
struct tstStruct
{
void *sp;
int k;
};
void my_func(struct tstStruct*);
typedef struct tstStruct strc;
int main()
{
char a;
a = 'b';
strc* t1 = (strc*) malloc(sizeof(strc));
t1 -> sp = &a;
t1 -> k = 40;
my_func(t1);
return 0;
}
void my_func(strc* s1)
{
void* n = s1 -> sp + 121;
int d = s1 -> k + 323;
}
然后我使用 GCC 和以下命令:
gcc -S test3.c
并提出了它的组装。我不会显示我得到的整个代码,而是粘贴函数 my_func 的代码。它是这个:
my_func:
.LFB1:
.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 -24(%rbp), %rax
movq (%rax), %rax
addq $121, %rax
movq %rax, -16(%rbp)
movq -24(%rbp), %rax
movl 8(%rax), %eax
addl $323, %eax
movl %eax, -4(%rbp)
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
据我了解,情况是这样的:首先将调用者的基指针压入堆栈,并将其堆栈指针设为新的基指针,以便为新函数设置堆栈。但是其他的我不明白。据我所知,参数(或指向参数的指针)存储在堆栈中。如果是这样,第二条指令的目的是什么,
movq -24(%rbp), %rax
这里,%rax 寄存器的内容被移动到距离寄存器 %rbp 中地址 24 个字节的地址。但是 %rax 中有什么????最初什么都没有存储在那里???我想我很困惑。请帮助了解此功能的工作原理。提前致谢!