Fixed ebp not being set
Stopped compiling for gnu99
Fixed memset bug & potential memcpy bug

When optimizations were enabled, the idt not being cleared by memset.
This was caused by the compiler optimizing away needed variables in the
optimized memset version. This bug also appeared to be in memcpy (no
symptoms shown), so this was fixed as a precaution.

There also appeared to be some paramater scrambling in gdt_set_gate,
which was fixed with `volatile`. The irq handler and the idt pointer was
also volatile'd.