Assembly 我编写了x86-64汇编。但是它';它不在Windows下工作,仅在OnlineGDB(Linux)上工作

Assembly 我编写了x86-64汇编。但是它';它不在Windows下工作,仅在OnlineGDB(Linux)上工作,assembly,gcc,compilation,x86-64,nasm,Assembly,Gcc,Compilation,X86 64,Nasm,我用汇编语言编写了一个x86-64代码。输出为17 .text .LC0: .string "%d\n" printint: pushq %rbp movq %rsp, %rbp subq $16, %rsp movl %edi, -4(%rbp) movl -4(%rbp), %eax movl %eax, %esi leaq .LC0(%rip), %rdi

我用汇编语言编写了一个x86-64代码。输出为17

    .text
.LC0:
    .string "%d\n"
printint:
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $16, %rsp
    movl    %edi, -4(%rbp)
    movl    -4(%rbp), %eax
    movl    %eax, %esi
    leaq    .LC0(%rip), %rdi
    movl    $0, %eax
    call    printf@PLT
    nop
    leave
    ret

    .globl  main
    .type   main, @function
main:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    $2, %r8
    movq    $3, %r9
    movq    $5, %r10
    imulq   %r9, %r10
    addq    %r8, %r10
    movq    $8, %r8
    movq    $3, %r9
    movq    %r8,%rax
    cqo
    idivq   %r9
    movq    %rax,%r8
    subq    %r10, %r8
    movq    %r10, %rdi
    call    printint
    movl    $0, %eax
    popq    %rbp
    ret

当我编译这个GCC时,我得到了这个错误

out.s: Assembler messages:
out.s:5: Error: bad register name `%rbp'
out.s:6: Error: bad register name `%rsp'
out.s:7: Error: bad register name `%rsp'
out.s:8: Error: bad register name `%rbp)'
out.s:9: Error: bad register name `%rbp)'
out.s:11: Error: bad register name `%rip)'
out.s:19: Warning: .type pseudo-op used outside of .def/.endef: ignored.
out.s:19: Error: junk at end of line, first unrecognized character is `m'
out.s:21: Error: bad register name `%rbp'
out.s:22: Error: bad register name `%rsp'
out.s:23: Error: bad register name `%r8'
out.s:24: Error: bad register name `%r9'
out.s:25: Error: bad register name `%r10'
out.s:26: Error: bad register name `%r9'
out.s:27: Error: bad register name `%r8'
out.s:28: Error: bad register name `%r8'
out.s:29: Error: bad register name `%r9'
out.s:30: Error: bad register name `%r8'
out.s:31: Error: `cqo' is only supported in 64-bit mode
out.s:32: Error: bad register name `%r9'
out.s:33: Error: bad register name `%rax'
out.s:34: Error: bad register name `%r10'
out.s:35: Error: bad register name `%r10'
out.s:38: Error: bad register name `%rbp'
同样,当我在NASM中这样做时,我得到了以下错误

out.s:1: warning: label alone on a line without a colon might be in error [-w+orphan-labels]
out.s:3: error: parser: instruction expected
out.s:5: error: parser: instruction expected
out.s:6: error: expression syntax error
out.s:7: error: parser: instruction expected
out.s:8: error: parser: instruction expected
out.s:9: error: parser: instruction expected
out.s:10: error: parser: instruction expected
out.s:11: error: parser: instruction expected
out.s:12: error: parser: instruction expected
out.s:18: error: parser: instruction expected
out.s:19: error: parser: instruction expected
out.s:21: error: label `pushq' inconsistently redefined
out.s:5: note: label `pushq' originally defined here
out.s:21: error: parser: instruction expected
out.s:22: error: expression syntax error
out.s:23: error: expression syntax error
out.s:24: error: expression syntax error
out.s:25: error: expression syntax error
out.s:26: error: parser: instruction expected
out.s:27: error: parser: instruction expected
out.s:28: error: expression syntax error
out.s:29: error: expression syntax error
out.s:30: error: expression syntax error
out.s:32: error: parser: instruction expected
out.s:33: error: expression syntax error
out.s:34: error: label `subq' inconsistently redefined
out.s:7: note: label `subq' originally defined here
out.s:34: error: parser: instruction expected
out.s:35: error: expression syntax error
out.s:37: error: label `movl' inconsistently redefined
out.s:8: note: label `movl' originally defined here
out.s:37: error: parser: instruction expected
out.s:38: error: parser: instruction expected
但是当我去编译它时,我得到了正确的答案(17)

我还在学汇编语言。我寻找答案,但没有找到。你能解释一下原因吗

关于我笔记本电脑的详细信息

AMD RYZEN 5处理器(基于x64)

64位Windows 10


out.s:31:Error:“cqo”仅在64位模式下受支持
告诉您试图在32位模式下汇编此64位代码。也许您尝试在Windows下使用mingw32,而不是64位mingw

此代码适用于x86-64 GNU/Linux:请注意在RDI、RSI和使用
@plt
中传递参数的调用约定。DLL不使用PLT,这是GNU/Linux的东西(传统的动态链接,不是新样式的
gcc-fno-PLT
,使用早期绑定而不是延迟绑定)。这就是它在使用x86-64 GNU/Linux的OnlineGDB中工作的原因

它在64位Windows下不工作,除非在WSL内部。甚至Cygwin 64也是源代码兼容层,而不是二进制/ABI/调用约定



此外,它是用AT&T语法和GAS指令编写的。NASM使用具有不同指令的英特尔语法;难怪当你试图用
nasm-fwin64

组装它时,几乎每一行都是错误的。你给这个nasm加了标签,但这就是GAS-AT&T语法。NASM使用英特尔语法。您使用了哪些命令来尝试组装它?您在本地使用了哪些GCC?当你运行
gcc-dumpmachine
,你会得到什么?@Michael mingw32:|@PeterCordes我只使用了nasm out.s(out.s是一个汇编文件)@LasanNishshanka:那更糟;NASM的默认输出格式是16位平面二进制文件。但无论如何,除非您使用NASM指令将其完全重写为Intel语法,否则无法使用NASM进行组装。当然,您必须重写大部分指令才能将其移植到Windows。可能从Windows的C编译器输出重新开始,而不是GNU/Linux。(很明显,您的代码是经过手工调整的GCC输出。)