我想了解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