Ich versuche, einen Scheduler zu schreiben, was wir "Fasern" nennen. Leider bin ich es nicht gewohnt, Inline-Assembly zu schreiben.Inline-Assembly - nutzlose Zwischenkopie Anweisungen
typedef struct {
//fiber's stack
long rsp;
long rbp;
//next fiber in ready list
struct fiber *next;
} fiber;
//currently executing fiber
fiber *fib;
So ist die allererste Aufgabe ist - natürlich - eine Faser für die main
Funktion zu schaffen, damit es aufgehängt werden kann.
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__(...);
}
Dies wird
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
zu
zusammengestellt Warum diesemov
s in temporäre Register nicht kompiliert? Kann ich sie irgendwie loswerden?
Die erste Version dieser Frage hatte asm Ausgabe von gcc -O0
, mit noch mehr Anweisungen und Provisorien.
Optimierungen werden nicht ausgeschaltet.
Haben Sie Optimierungen aktivieren? – Jester
@Jester Ich hatte es zunächst nicht, aber wenn ich sie einschalte, werden die Provisorien nicht gelöscht (siehe oben). – User1291
C unterstützt nicht _methods_ – Olaf