Изучите существующий код, который делает подобные вещи. Например:
SAVE_ARGS_IRQ
): entry_64.S INTR_PUSH
): privregs.h IDT_VEC
): exception.S (аналогично vector.S в NetBSD) Фактически, «ручное нажатие» рег является единственным способом на AMD64, так как PUSHA
там не существует. AMD64 не уникален в этом аспекте - большинство процессоров, отличных от x86, требуют некоторого сохранения / восстановления регистров по регистру.
Но если вы внимательно проверите ссылочный исходный код, вы обнаружите, что не все обработчики прерываний требуют сохранения / восстановления всего набора регистров, поэтому есть возможности для оптимизации.