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

时间:2017-02-03 18:10:16

标签: gcc assembly cygwin att

我有这个" .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 $0, %al
    jmp D
E:  movb $0, (%edi)
    popl %edi
    popl %esi
    popl %ebx
    ret

我想在带有 cygwin 的Windows 10上使用以下文件进行编译,但它不起作用。

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

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

由于

1 个答案:

答案 0 :(得分:1)

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

.globl _interleave
_interleave:
 ...

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