Voglio conoscere la convenzione di chiamata C. Per fare questo ho scritto il seguente codice:Comprensione C chiamata smontata
#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;
}
poi ho usato GCC con il seguente comando:
gcc -S test3.c
e si avvicinò con il suo montaggio. Non mostrerò l'intero codice che ho ottenuto, ma piuttosto incollerò il codice per la funzione my_func. È questo:
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
Per quanto ho capito, questo è ciò che accade: primo puntatore base chiamanti viene spinto nella pila ed il suo stack pointer viene fatto il nuovo puntatore base per impostare lo stack per il nuovo funzione. Ma poi il resto non capisco. Per quanto ne so, gli argomenti (o il puntatore all'argomento) sono memorizzati nello stack. In caso affermativo qual è lo scopo della seconda istruzione,
movq -24(%rbp), %rax
Qui, il contenuto del registro% rax viene spostato all'indirizzo 24 byte dal indirizzo nel registro% rbp. Ma cosa c'è in% rax ???? Niente è inizialmente memorizzato lì ??? Penso di essere confuso. Si prega di aiutare a capire come funziona questa funzione. Grazie in anticipo!
Compilare con 'gcc -fverbose-asm -s' e forse anche' gcc -fverbose-asm -O -s'; vedi anche [questa risposta] (http://stackoverflow.com/a/16088155/841108) che fornisce un * lotto * di riferimenti. –
Grazie per tutti i riferimenti e il consiglio di compilazione. – user2290802