Я написал свой setjmp / longjmp , который соответствует моим потребностям, как показано ниже. Я протестировал его на 32-битных системах, и он работает хорошо. Для этой цели я сохраняю и восстанавливаю регистры eax, ebx, ecx, edi, esi, esp, ebp и eip.
Однако, я знаю, этого было бы недостаточно для 64-битной системы. Прежде всего, я думаю, что мне нужно заменить регистры eX на rX. Во-вторых, я думаю, что мне нужно сохранить 8 дополнительных регистров, найденных в битах x86-64: 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";" \
)