msvcrt: Preserve all registers in call_ebp_func.
diff --git a/dlls/msvcrt/cppexcept.c b/dlls/msvcrt/cppexcept.c
index 425a384..29d7b58 100644
--- a/dlls/msvcrt/cppexcept.c
+++ b/dlls/msvcrt/cppexcept.c
@@ -52,8 +52,15 @@
inline static void *call_ebp_func( void *func, void *ebp )
{
void *ret;
- __asm__ __volatile__ ("pushl %%ebp; movl %2,%%ebp; call *%%eax; popl %%ebp" \
- : "=a" (ret) : "0" (func), "r" (ebp) : "ecx", "edx", "memory" );
+ int dummy;
+ __asm__ __volatile__ ("pushl %%ebx\n\t"
+ "pushl %%ebp\n\t"
+ "movl %4,%%ebp\n\t"
+ "call *%%eax\n\t"
+ "popl %%ebp\n\t"
+ "popl %%ebx"
+ : "=a" (ret), "=S" (dummy), "=D" (dummy)
+ : "0" (func), "1" (ebp) : "ecx", "edx", "memory" );
return ret;
}