私は "ファイバー"と呼ばれるものを実行するためにスケジューラーを作成しようとしています。 残念ながら、私は実際にインラインアセンブリを書くことに慣れていません。インラインアセンブリ - 不要な中間コピー命令
typedef struct {
//fiber's stack
long rsp;
long rbp;
//next fiber in ready list
struct fiber *next;
} fiber;
//currently executing fiber
fiber *fib;
だから、非常に最初の仕事は - 明らかに - それは一時停止できるようにmain
機能のための繊維を作成します。
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__(...);
}
この
はなぜ、これが一時的なレジスタにmov
Sをコンパイルん
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
にコンパイルされますか?どうにか私はそれらを取り除くことができますか?
この質問の最初のバージョンは、gcc -O0
のasm出力を持っていましたが、さらに多くの命令と一時ファイルがありました。
最適化をオンにしても、それを取り除くことはできません。それらをオン
あなたが最適化を可能にしましたか? – Jester
@Jester私は最初はなかったが、それらをオンにしても一時的なものを取り除くことはできない(上記の編集を参照)。 – User1291
Cは_methods_ – Olaf