You need to save the esi register too.
ebx, esi, edi, and ebp are callee-saved registers in win32/x86.
VC++ and gcc expect external functions not to modify these registers.
http://msdn.microsoft.com/library/en-us/vclang/html/_core_argument_passing_…
| The compiler generates prolog and epilog code to save and restore
| the ESI, EDI, EBX, and EBP registers, if they are used in the function.