#include <stdio.h>

#if defined _WIN32 && !defined __TINYC__
# define _ "_"
#else
# define _
#endif

static int x1_c(void)
{
    printf("x1\n");
    return 1;
}

asm(".text;"_"x1: call "_"x1_c; ret");

int main(int argc, char *argv[])
{
    asm("call "_"x1");
    asm("call "_"x2");
    asm("call "_"x3");
    return 0;
}

static
int x2(void)
{
    printf("x2\n");
    return 2;
}

extern int x3(void);

#include <stdio.h>

#if defined _WIN32 && !defined __TINYC__
# define U "_"
#else
# define U
#endif

const char str[] = "x1\n";
#ifdef __x86_64__
asm(U"x1: push %rbp; mov $"U"str, %rdi; call "U"printf; pop %rbp; ret");
#elif defined (__i386__)
asm(U"x1: push $"U"str; call "U"printf; pop %eax; ret");
#endif

int main(int argc, char *argv[])
{
    asm("call "U"x1");
    asm("call "U"x2");
    asm("call "U"x3");
    return 0;
}

static
int x2(void)
{
    printf("x2\n");
    return 2;
}

extern int x3(void);

--- 
+++ 
@@ -1,23 +1,24 @@
 #include <stdio.h>
 
 #if defined _WIN32 && !defined __TINYC__
-# define U "_"
+# define _ "_"
 #else
-# define U
+# define _
 #endif
 
-const char str[] = "x1\n";
-#ifdef __x86_64__
-asm(U"x1: push %rbp; mov $"U"str, %rdi; call "U"printf; pop %rbp; ret");
-#elif defined (__i386__)
-asm(U"x1: push $"U"str; call "U"printf; pop %eax; ret");
-#endif
+static int x1_c(void)
+{
+    printf("x1\n");
+    return 1;
+}
+
+asm(".text;"_"x1: call "_"x1_c; ret");
 
 int main(int argc, char *argv[])
 {
-    asm("call "U"x1");
-    asm("call "U"x2");
-    asm("call "U"x3");
+    asm("call "_"x1");
+    asm("call "_"x2");
+    asm("call "_"x3");
     return 0;
 }
 
Adjust asm-c-connect testcase for Windows

Calling conventions are different, let's use functions without
any arguments.
