Assembly NASM ASM未正确编译?

Assembly NASM ASM未正确编译?,assembly,g++,nasm,intel,Assembly,G++,Nasm,Intel,我正在学习一个教程,学习x64英特尔语法汇编,我有这个代码示例,假设编译时没有问题,但我遇到了错误,因此我无法开始 代码示例: .code ASM_Debug proc mov rax, 55 ret ASM_Debug endp end 我使用的是NASM汇编编译器,使用的是MinGW(G++)代码编译器,如果我使用x64英特尔语法MASM使用内联汇编进行编译,我不会得到任何错误 有人能告诉我需要做什么吗?正确的NASM命令行是什么来编译这些代码,这样我就可以开始学习了。谢谢

我正在学习一个教程,学习x64英特尔语法汇编,我有这个代码示例,假设编译时没有问题,但我遇到了错误,因此我无法开始

代码示例:

.code
ASM_Debug proc
    mov rax, 55
    ret
ASM_Debug endp
end
我使用的是NASM汇编编译器,使用的是MinGW(G++)代码编译器,如果我使用x64英特尔语法MASM使用内联汇编进行编译,我不会得到任何错误

有人能告诉我需要做什么吗?正确的NASM命令行是什么来编译这些代码,这样我就可以开始学习了。谢谢

我当前的命令行是:nasm.exe-f elf64 Foo.asm-o Foo.o

PS:我没有使用Visual Studio IDE进行开发,我不想听到任何关于它的消息

PS2:我正在开发Windows操作系统,而不是Linux

编译错误

CoreASM.asm:1: warning: label alone on a line without a colon might be in error [-w+orphan-labels]
CoreASM.asm:1: error: attempt to define a local label before any non-local labels
CoreASM.asm:2: error: parser: instruction expected
CoreASM.asm:5: error: symbol `ASM_Debug' redefined
CoreASM.asm:5: error: parser: instruction expected
CoreASM.asm:6: warning: label alone on a line without a colon might be in error [-w+orphan-labels]

您编写的代码是MASM语法,NASM不支持这种语法。您可以通过
PROC
/
ENDP
关键字来判断,这些关键字只存在于MASM中(以及TASM,TASM主要与MASM语法兼容)

这就是MASM语法:

.code
ASM_Debug proc
    mov rax, 55
    ret
ASM_Debug endp
end
SECTION .text

ASM_Debug:
    mov rax, 55
    ret
这与翻译成NASM语法的代码相同:

.code
ASM_Debug proc
    mov rax, 55
    ret
ASM_Debug endp
end
SECTION .text

ASM_Debug:
    mov rax, 55
    ret
请特别注意:

  • .code
    指令已替换为
    节.text
  • PROC
    /
    ENDP
    关键字已被删除,并使用一个简单的标签来命名过程。过程不会在结尾重复它们的名称
  • 代码文件末尾没有
    END
    指令
你可以在网上找到多个关于MASM和NASM语法差异的指南。这看起来相当全面

运行NASM的命令行也错误,因为它试图构建Linux格式的二进制文件(
elf64
format)。(当然,您可以在Windows上的NASM中构建它们,但无法运行它们。)对于64位Windows,您需要
win64
。因此,它将是:

nasm.exe -f win64 Foo.asm -o Foo.obj
(请注意,
.obj
对于Windows上的对象文件是常规的,而不是
.o
,尽管您可以使用其中任何一个。整个
-o
开关实际上是可选的;如果您忽略它,NASM将自动以标准扩展名命名对象文件,并与我们的输入源文件同名。)


但是,如果您正试图学习如何在汇编中编程,您确实需要找到一个使用与您的汇编程序期望的语法相同的教程。如果您想使用NASM作为汇编程序,那么可以找到一个同样使用NASM的教程。或者,如果您想使用MASM教程,那么可以使用MASM作为汇编程序。非商业用途;它不是最新的版本,但非常适合学习。但是,这是32位版本。如果要汇编64位代码,则需要x86-64版本,文件名为
ml64.exe
。我不知道在哪里可以单独下载,但它包含在Windows SDK中。至少,我知道它包含在;我不确定它是否仍然存在于最新的Windows 10 SDK中,但我想是的。

相关/可能重复:,除了它是关于古老的16位MASM代码,而不是x86-64 MASM