2017-02-03 11 views
1

私はこのATファイルを、& Tアセンブリで書いています。Cygwin Winでアセンブリ(.s)コードをコンパイルできません

.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上で、それをコンパイルしたいが、それは動作しません。 gcc

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 -m32es1B.s:3: Error: invalid instruction suffix for push

を取得し、私は私もi686-w64-mingw32-gccと32ビットでそれをコンパイルしようとしたが、私は私ができる午前undefined reference to interleave

を取得collect2: error: ld returned 1 exit status

を取得それをコンパイルし、gcc -m32、bとlinuxで実行するあなたは窓でこの作業をする方法はありますか?

感謝のコメントで提案されているように、関数名の前アンダースコアを追加することで解決

+1

'.globl interleave'が見つかりませんでした。 – Jester

+2

Windowsでは、cdecl関数のシンボル名の先頭にアンダースコアを付ける必要があります。おそらく、なぜあなたは "未定義の参照"エラーを取得するのですか? – fuz

+0

@fuzありがとう、私はそれを知らなかった!それは今働きます! :) – Ford1892

答えて

1

i686-w64-mingw32-gccしてコンパイル
.globl _interleave 
_interleave: 
... 

が動作するようになりました。

関連する問題