Your code has a lot of mistakes, I'm not sure which one is causing the crash.
Interrupt 0x08 and 0x0D are not IRQs, they are CPU exceptions. The first 32 interrupts are reserved for CPU exceptions. You will need to reprogram the PIC because it will try to use some of those reserved interrupts for IRQs, and you won't be able to tell the difference between an IRQ and an exception.
Some exceptions have error codes. You see the "push dword 0" in all of your interrupt handler stubs? Many tutorials use that as a placeholder for the error code for exceptions that don't have error codes, so the same interrupt handler routine can run whether the exception pushes an error code or not. You must remove that line from the interrupt handler stubs that belong to exceptions with error codes.
When it's time to return from your interrupt handler with IRET, you need to clean up the stack. That "add esp, 8" line you've commented out removes the interrupt number and error code from the stack. Without it, all of your interrupts will cause a crash.
You're not obeying the C ABI, so the C code in your interrupt handler is clobbering the contents of the stack. This can cause the interrupted program to crash.
GRUB loads your OS in protected mode with the A20 line already enabled, so you don't need code to switch to protected mode or enable A20. You still need code to reload segment registers. Don't forget RET at the end of your functions!
These are just problems I've spotted from looking at your code for a few minutes.
Perhaps you are not yet ready to write an OS.