【问题标题】:Can not compile Assembly (.s) code with Cygwin on Win无法在 Win 上使用 Cygwin 编译汇编 (.s) 代码
【发布时间】:2017-02-03 18:10:15
【问题描述】:

我有这个“.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 和下面的 main 文件在 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 上运行?

谢谢

【问题讨论】:

  • 你错过了.globl interleave
  • 在 Windows 上,cdecl 函数的符号名称必须带有下划线前缀。也许这就是您收到“未定义引用”错误的原因?
  • @fuz 非常感谢,我不知道!现在可以了! :)
  • @Jester 你说得对,我更正了代码,谢谢

标签: gcc assembly cygwin att


【解决方案1】:

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

.globl _interleave
_interleave:
 ...

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

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多