Search code examples
gccassemblycygwinatt

Can not compile Assembly (.s) code with Cygwin on Win


I have this ".s" file, written in AT&T assembly.

.globl interleave   
interleave:
    pushl %ebx
    pushl %esi
    pushl %edi
    movl 16(%esp), %ebx     #a
    movl 20(%esp), %esi     #b
    movl 24(%esp), %edi     #c
D:  movb (%ebx), %cl
    testb %cl, %cl
    jz W
    movb %cl, (%edi)            #*c
    incl %edi
    incl %ebx
T:  movb (%esi), %dl
    testb %dl, %dl
    jz W
    movb %dl, (%edi)            #*c
    incl %edi
    incl %esi
W:  orb %cl,%dl
    jz E
    #movb $0, %al
    jmp D
E:  movb $0, (%edi)
    popl %edi
    popl %esi
    popl %ebx
    ret

I want to compile it on windows 10 with cygwin with the following main file, but it does not work.

void interleave(const char* a, const char* b, char* c) ;
int main(int argc, char const *argv[]){
    const char* a = "car";
    const char* b = "old";
    char c[] = "";
    interleave(a,b,c);
    printf("%s (expected coalrd)\n", c);
    return 0;}

With gcc i get es1B.s:3: Error: invalid instruction suffix for push

With gcc -m32 I get collect2: error: ld returned 1 exit status

I even tried to compile it in 32 bit with i686-w64-mingw32-gcc but I get undefined reference to interleave

I am able to compile it and run it on linux with gcc -m32 , but is there a way to make this work on windows?

Thanks


Solution

  • Solved by adding an underscore before the function name as suggested in the comments:

    .globl _interleave
    _interleave:
     ...
    

    Compiling with i686-w64-mingw32-gcc now works.