x86 64位额外的寄存器

我写了我自己的setjmp / longjmp ,它符合我的需求,如下所示。 我在32位系统上testing过,效果很好。 我保存并恢复寄存器eax,ebx,ecx,edi,esi,esp,ebp和eip。

但是,我知道,这对64位系统来说是不够的。 首先,我想我需要用rXreplace寄存器eX。 其次,我想我需要保存在x86-64位,这是r8,r9,r10,r11,r12,r13,r14,r15的8个额外的寄存器。 这足够了,还是我需要做更多?

#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";" \ ) 

你的指令序列不会保存标志寄存器 ,它甚至可能在IA32中。 wikipedia页面包含您可以使用的说明pushfpopf

除非你知道程序不使用它们,否则你需要保存所有的向量寄存器。 注意:它们也可以用于标量浮点,所以你不需要在你的程序中使用矢量化的代码来使用它们。 哦,如果程序使用浮点数,那么应该保存历史浮点数栈以防使用。 Dan Kruchinin的答案显示了如何一步保存所有这些。

也许你需要使用fxsave / fxrestore指令来保存x87的上下文: http ://siyobik.info/main/reference/instruction/FXSAVE

虽然,我不确定fxsave / fxresrtore可以从用户空间应用程序(也就是超级用户模式)中安全地使用,但是您几乎可以完成fxsave自己做的所有事情。