2017-02-03 8 views
1

У меня есть этот файл .s, написанный на AT & T сборке.Не удается скомпилировать код сборки (.s) с помощью Cygwin on Win

.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 

Я хочу, чтобы скомпилировать его на окнах 10 с Cygwin со следующим файлом основной, но он не работает.

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

Я даже пытался скомпилировать его в 32 бит с i686-w64-mingw32-gcc, но я получаю undefined reference to interleave

Я могу скомпилировать его и запустить на linux с gcc -m32, b ut есть способ сделать эту работу над окнами?

Благодаря

+1

Вы пропустили '.globl interleave'. – Jester

+2

В Windows имена символов для функций cdecl должны иметь префикс с подчеркиванием. Возможно, именно поэтому вы получаете ошибку «неопределенной ссылки»? – fuz

+0

@fuz Огромное вам спасибо, я этого не знал! Он работает сейчас! :) – Ford1892

ответ

1

решаемые путем добавления подчеркивания перед именем функции, как предложено в комментариях:

.globl _interleave 
_interleave: 
... 

Компиляция с i686-w64-mingw32-gcc теперь работает.