Как мне вернуться к основному коду из обработчика сигнала в ассемблере?

Я писал программу в NASM для Linux. Я хотел бы иметь возможность вернуться к нормальному пути кода из обработчика сигнала, который я установил для SIGFPE. Сокращенный пример кода:

section .text

global _start
_start:                  ; --- Enter the program ---
   mov      ebx,8        ; Load the signal to handle (SIGFPE)
   mov      ecx,.handle  ; Load the handler address
   mov      eax,48       ; Load the syscall number for signal
   int      0x80         ; Establish the handler
   mov      ebx,0        ; Prepare a divisor for SIGFPE
   idiv     ebx          ; Divide edx:eax by 0
   mov      ebx,0        ; Set exit status 0 (shouldn't get here)
   jmp      .exit        ; Exit the program

.handle:                 ; --- Handle a divide exception ---
   mov      ebx,31       ; Set exit status 31 (instead of real handling)

.exit:                   ; --- Exit the program ---
   mov      eax,1        ; Load the syscall number for exit
   int      0x80         ; Exit back to the system

Волшебные числа для компактности кода здесь.

Перед инструкцией idiv esp 0xffffcc00, При входе в обработчик сигнала, esp 0xffffc52c, Довольно много вещей было помещено в стек! Существует множество информации о __NR_sigreturn. Мне не повезло, пытаясь использовать его. ret инструкция в обработчике просто возвращает меня к инструкции idiv, на этот раз без обработчика.

Любые идеи о том, что я могу сделать на .handle ярлык, чтобы безопасно вернуться в магистраль?

(Я знаю, что sigaction доступен, но я хотел бы понять, что происходит в этой ситуации.)

1 ответ

Решение

Просто ret вернется, чтобы повторить попытку ошибочной инструкции. Когда используешь sigaction зарегистрировать обработчик сигнала с флагом SA_SIGINFOтретий аргумент является указателем на ucontext_t который содержит сохраненное состояние, которое может быть изменено.

Другие вопросы по тегам