Hardware interrupt problem solved. I put "_asm cli;" at the beginning of my handler and "outportb(0x20,0x20); _asm sti;" at the end, and it works now. However, I'm still having an issue with firing the same software interrupt back-to-back.
I am glad that you managed to solve the hardware interrupt problem. Sending the EOI command (Setting but 4 of the PIC command register) is required for all hardware interrupts.
Remember that the PIC uses several internal registers to determine the status of the interrupts. By sending EOI, the PIC will reset the appropriate bit in the In Service Register (ISR). This will tell the PIC to signal the completion of the interrupt request.
Not doing this will result in what you were experiencing. The interrupt was competed, but the bit was never reset. Hence, both the IR line on the PIC and CPU are still active. Hence, it will work the first time, but no more after that.
All of this is inside of the Programmable Interrupt Controller tutorial.
With regards to your software interrupt problem, I am going to do some testing with the current code to insure there is no problems with it.
I will post again if I find any problems.