--- API.xs.orig	2004-08-16 01:20:16.461320000 +0200
+++ API.xs	2004-08-16 01:24:30.055971200 +0200
@@ -216,6 +216,7 @@
     int    iParam;
     long   lParam;
     float  fParam;
+    double dParamBuf;
     double dParam;
 	char   cParam;
     char  *pParam;
@@ -475,20 +476,28 @@
 #ifdef WIN32_API_DEBUG
                 printf("(XS)Win32::API::Call: parameter %d (P) is %s\n", i, pParam);
 #endif
-                _asm {
-                    mov     eax, dword ptr pParam
-                    push    eax
-                }
+                __asm__ __volatile__ (
+					"movl %0, %%eax\n\t"
+					:
+					: "g" (pParam)
+                );
+                __asm__ __volatile__ (
+					"pushl %eax\n\t"
+                );
                 break;
             case T_POINTERPOINTER:
                 ppParam = params[i].b;
 #ifdef WIN32_API_DEBUG
                 printf("(XS)Win32::API::Call: parameter %d (P) is %s\n", i, ppParam);
 #endif
-                _asm {
-                    mov     eax, dword ptr ppParam
-                    push    eax
-                }
+                __asm__ __volatile__ (
+					"movl %0, %%eax\n\t"
+					:
+					: "g" (ppParam)
+                );
+                __asm__ __volatile__ (
+					"pushl %eax\n\t"
+                );
                 break;
             case T_NUMBER:
             case T_CHAR:
@@ -496,42 +505,65 @@
 #ifdef WIN32_API_DEBUG
                 printf("(XS)Win32::API::Call: parameter %d (N) is %ld\n", i, lParam);
 #endif
-                _asm {
-                    mov     eax, lParam
-                    push    eax
-                }
+                __asm__ __volatile__ (
+					"movl %0, %%eax\n\t"
+					:
+					: "g" (lParam)
+                );
+                __asm__ __volatile__ (
+					"pushl %eax\n\t"
+                );
                 break;
             case T_FLOAT:
                 fParam = params[i].f;
 #ifdef WIN32_API_DEBUG
                 printf("(XS)Win32::API::Call: parameter %d (F) is %f\n", i, fParam);
 #endif
-                _asm {
-                    mov		eax, fParam
-                    push	eax
-                }
+                __asm__ __volatile__ (
+					"movl %0, %%eax\n\t"
+					:
+					: "g" (fParam)
+                );
+                __asm__ __volatile__ (
+					"pushl %eax\n\t"
+                );
                 break;
             case T_DOUBLE:
                 dParam = params[i].d;
+                dParamBuf = dParam+4;
 #ifdef WIN32_API_DEBUG
                 printf("(XS)Win32::API::Call: parameter %d (D) is %f\n", i, dParam);
 #endif
-                _asm {
-                    mov		eax, dword ptr [dParam + 4]
-                    push    eax
-                    mov     eax, dword ptr [dParam]
-                    push	eax
-                }
+                __asm__ __volatile__ (
+					"movl %0, %%eax\n\t"
+					:
+					: "g" (dParamBuf)
+                );
+                __asm__ __volatile__ (
+					"pushl %eax\n\t"
+                );
+                __asm__ __volatile__ (
+					"movl %0, %%eax\n\t"
+					:
+					: "g" (dParam)
+                );
+                __asm__ __volatile__ (
+					"pushl %eax\n\t"
+                );
                 break;
             case T_CODE:
                 lParam = params[i].l;
 #ifdef WIN32_API_DEBUG
                 printf("(XS)Win32::API::Call: parameter %d (K) is 0x%x\n", i, lParam);
 #endif
-                _asm {
-                    mov		eax, lParam
-                    push    eax
-                }
+                __asm__ __volatile__ (
+					"movl %0, %%eax\n\t"
+					:
+					: "g" (lParam)
+                );
+                __asm__ __volatile__ (
+					"pushl %eax\n\t"
+                );
                 break;
             }
         }
@@ -551,10 +583,6 @@
 #ifdef WIN32_API_DEBUG
     	printf("(XS)Win32::API::Call: Calling ApiFunctionFloat()\n");
 #endif
-//		_asm {
-//			call    dword ptr [ApiFunctionFloat]
-//			fstp    qword ptr [fReturn]
-//		}
 		fReturn = ApiFunctionFloat();
 #ifdef WIN32_API_DEBUG
         printf("(XS)Win32::API::Call: ApiFunctionFloat returned %f\n", fReturn);
@@ -565,12 +593,9 @@
 #ifdef WIN32_API_DEBUG
     	printf("(XS)Win32::API::Call: Calling ApiFunctionDouble()\n");
 #endif
-		_asm {
-			call    dword ptr [ApiFunctionDouble]
-			fstp    qword ptr [dReturn]
-		}
+		dReturn = ApiFunctionDouble();
 #ifdef WIN32_API_DEBUG
-       printf("(XS)Win32::API::Call: ApiFunctionDouble returned %f\n", dReturn);
+        printf("(XS)Win32::API::Call: ApiFunctionDouble returned %f\n", dReturn);
 #endif
         break;
     case T_POINTER:
