J'essaie d'écrire un planificateur pour exécuter ce que nous appelons «fibres». Malheureusement, je ne suis pas vraiment habitué à l'écriture en ligne.assemblage en ligne - instructions de copie intermédiaires inutiles
typedef struct {
//fiber's stack
long rsp;
long rbp;
//next fiber in ready list
struct fiber *next;
} fiber;
//currently executing fiber
fiber *fib;
Ainsi, la première tâche est - évidemment - la création d'une fibre pour la fonction main
de sorte qu'il peut être suspendu.
int main(int argc, char* argv[]){
//create fiber for main function
fib = malloc(sizeof(*fib));
__asm__(
"movq %%rsp, %0;"
"movq %%rbp, %1;"
: "=r"(fib->rsp),"=r"(fib->rbp)
);
//jump to actual main and execute
__asm__(...);
}
Ce sera compilé à
movl $24, %edi #,
call malloc #
#APP
# 27 "scheduler.c" 1
movq %rsp, %rcx;movq %rbp, %rdx; # tmp92, tmp93
# 0 "" 2
#NO_APP
movq %rax, fib(%rip) # tmp91, fib
movq %rcx, (%rax) # tmp92, MEM[(struct fiber *)_3].rsp
movq %rdx, 8(%rax) # tmp93, MEM[(struct fiber *)_3].rbp
Pourquoi cette compilation mov
s dans des registres temporaires? Puis-je me débarrasser d'eux?
La première version de cette question avait la sortie asm de gcc -O0
, avec encore plus d'instructions et de temporaires.
Activer les optimisations ne les supprime pas.
Avez-vous activé optimisations? – Jester
@Jester Je n'avais pas au début, mais les allumer ne se débarrasse pas des temporaires (voir edit ci-dessus). – User1291
C ne supporte pas _methods_ – Olaf