无法在 Win 上使用 Cygwin 编译汇编 (.s) 代码

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

我有这个“.s”文件,是用 AT&T 程序集编写的。

.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 [=10=], %al
    jmp D
E:  movb [=10=], (%edi)
    popl %edi
    popl %esi
    popl %ebx
    ret

我想在 windows 10 上用 cygwin 和以下 main 文件编译它,但它不起作用.

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;}

使用 gcc 我得到 es1B.s:3: Error: invalid instruction suffix for push

使用 gcc -m32 我得到 collect2: error: ld returned 1 exit status

我什至尝试用 i686-w64-mingw32-gcc 编译成 32 位,但我得到 undefined reference to interleave

我可以在 linux 上用 gcc -m32 编译它并 运行 它,但是有没有办法让它在 windows 上工作?

谢谢

通过在评论中建议的函数名称前添加 下划线 解决:

.globl _interleave
_interleave:
 ...

现在可以使用 i686-w64-mingw32-gcc 进行编译。