我想了解C调用约定。要做到这一点,我写了下面的代码:了解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是什么?最初没有存储?我觉得我很困惑。请帮助理解此功能的工作原理。 在此先感谢!
编译'GCC -fverbose-ASM -S',甚至'GCC -fverbose-ASM -O -S';另请参阅[本回复](http://stackoverflow.com/a/16088155/841108),它提供了很多参考文献。 –
感谢您提供的所有参考资料和编译提示。 – user2290802