以下に示すように、自分のニーズに合った自分自身のsetjmp/longjmpを書いています。私は32ビットシステムでそれをテストし、それは良い動作します。そのためにレジスタeax、ebx、ecx、edi、esi、esp、ebp、eipを保存して復元します。x86の余分なレジスタ64ビット
しかし、これは64ビットシステムでは十分ではありません。まず第一に、レジスタeXをrXに置き換える必要があると思います。第2に、x86-64ビットの8つの追加レジスタ(r8、r9、r10、r11、r12、r13、r14、r15)を保存する必要があると思います。それで十分でしょうか、それ以上のことをする必要がありますか?
#define MY_SETJMP(n) __asm__ __volatile__ ("movl %eax, regax"#n";" \
"movl %ebx, regbx"#n";" \
"movl %ecx, regcx"#n";" \
"movl %edi, regdi"#n";" \
"movl %esi, regsi"#n";" \
"movl %esp, regsp"#n";" \
"movl %ebp, regbp"#n";" \
"call next"#n";" \
"next"#n": pop regip"#n";" \
"addl $6, regip"#n";" \
)
#define MY_LONGJMP(n) __asm__ __volatile__ ("movl regax"#n", %eax;" \
"movl regbx"#n", %ebx;" \
"movl regcx"#n", %ecx;" \
"movl regdi"#n", %edi;" \
"movl regsi"#n", %esi;" \
"movl regsp"#n", %esp;" \
"movl regbp"#n", %ebp;" \
"jmp *regip"#n";" \
)
なぜあなたは_working_システムを使用するのではなく、あなた自身のものを作成しましたか? –
私が言ったように、私はそれを既存のsetjmpt/longjmpを使って行うことができない特別な目的のために使用しています。 – MetallicPriest