2017-02-03 72 views
1

我有這個「.s」文件,寫在AT & T程序集中。無法在Win上編譯與Cygwin的彙編(.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,但它不工作。

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,b有沒有辦法讓這個工作在Windows上?

感謝

+1

您錯過了'.globl interleave'。 – Jester

+2

在Windows上,cdecl函數的符號名稱必須以下劃線作爲前綴。也許這就是爲什麼你得到一個「未定義的參考」錯誤? – fuz

+0

@fuz非常感謝,我不知道!它現在有效! :) – Ford1892

回答

1

通過添加解決了函數名前強調所建議的意見:

.globl _interleave 
_interleave: 
... 

i686-w64-mingw32-gcc現在工作編譯。