Дополнительные регистры в x86 64 бит - PullRequest
2 голосов
/ 31 октября 2011

Я написал свой 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";" \
     )

Ответы [ 2 ]

7 голосов
/ 31 октября 2011

Ваша последовательность инструкций не сохраняет регистр flags , что, вероятно, следовало бы даже в IA32.Страница википедии содержит инструкции pushf и popf, которые вы можете использовать для этого.

Вам необходимо сохранить все векторные регистры, если только вы не знаете, что программа их не использует.Осторожно: их также можно использовать для скалярных операций с плавающей запятой, поэтому вам не нужно иметь векторизованный код в вашей программе, чтобы они могли использоваться.Да, и если программа использует плавающую точку, вы должны сохранить исторический стек с плавающей точкой на случай, если он будет использован.Ответ Дана Кручинина показывает, как сохранить все это за один шаг.

4 голосов
/ 31 октября 2011

Вероятно, вам нужно также сохранить контекст x87, используя инструкции fxsave / fxrestore: http://siyobik.info/main/reference/instruction/FXSAVE

Хотя я не уверен, что fxsave / fxresrtore можно безопасно использовать из приложения пользовательского пространства (т.е. внережим супервизора), но вы можете делать почти все, что делает fxsave, самостоятельно.

...