我写了x86-64 Assembly。但是它仅在OnlineGDB(Linux)上不能在Windows下运行]] << [

问题描述 投票:0回答:1
我用汇编语言编写了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

但是当我进入https://www.onlinegdb.com/online_gcc_assembler并对其进行编译时,我得到了正确的答案(17)。

“截图”

我仍在学习汇编语言。我搜索了一个答案,但找不到答案。您能解释一下原因吗?

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

AMD RYZEN 5处理器(基于x64)

64位Windows 10

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

out.s:31: Error: 'cqo' is only supported in 64-bit mode告诉您您尝试在32位模式下汇编此64位代码。也许您尝试在Windows下使用mingw32?

此代码用于x86-64 GNU / Linux:请注意在RDI,RSI和@plt的使用中传递args的调用约定; DLL不使用PLT。这就是为什么它在使用x86-64 GNU / Linux的OnlineGDB中工作的原因。

除了在WSL中,它不能在64位Windows上运行。甚至Cygwin 64都是源兼容性层,而不是二进制/ ABI /调用约定。

assembly gcc compilation nasm
1个回答
0
投票
out.s:31: Error: 'cqo' is only supported in 64-bit mode告诉您您尝试在32位模式下汇编此64位代码。也许您尝试在Windows下使用mingw32?
© www.soinside.com 2019 - 2024. All rights reserved.