我寫了自己的setjmp/longjmp,它符合我的需求,如下所示。我在32位系統上進行了測試,效果很好。我爲此保存和恢復寄存器eax,ebx,ecx,edi,esi,esp,ebp和eip。x86中的額外寄存器64位
但是,我知道,這對64位系統來說是不夠的。首先,我認爲我需要用rX替換寄存器eX。其次,我想我需要保存在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