NASM ASM编译不正确?

时间:2017-07-08 08:50:40

标签: assembly g++ nasm intel

我正在学习 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]

1 个答案:

答案 0 :(得分:1)

您编写的代码采用MASM语法,NASM不支持。您可以判断,因为PROC / ENDP关键字只在MASM中(和TASM,它主要与MASM语法兼容)。

所以,这是MASM语法:

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

这是转换为NASM语法的相同代码:

SECTION .text

ASM_Debug:
    mov rax, 55
    ret

特别注意:

  • .code指令已被SECTION .text替换。
  • 已删除PROC / ENDP个关键字,并使用简单标签命名该过程。程序最后不要重复他们的名字。
  • 代码文件末尾没有END指令。

您可以在线找到MASM和NASM之间语法差异的多个指南。 Here is a blog post by Dara Hazeghi看起来非常全面。

运行NASM的命令行也是错误的,因为它试图构建Linux格式二进制(elf64格式)。 (当然,可以在Windows上的NASM中构建这些内容,但是您无法运行它们。)对于64位Windows,您需要{ {1}}。所以,它将是:

win64

(请注意nasm.exe -f win64 Foo.asm -o Foo.obj 对于Windows上的目标文件是常规的,而不是.obj,尽管您也可以使用。{整个.o开关实际上是可选的;如果省略它,NASM将使用标准扩展名和与输入源文件相同的名称自动命名目标文件。)

但是,如果您正在尝试学习如何在汇编中进行编程,那么您真的需要找到一个教程,它使用语法相同的来构建汇编程序所期望的。如果您想使用NASM作为汇编程序,那么找一个也使用NASM的教程。或者,如果要使用MASM教程,则使用MASM作为汇编程序。 Version 8 of MASM can be downloaded here用于非商业用途;它不是最新版本,但它非常适合学习。但是,这是32位版本。如果要组装64位代码,则需要x86-64版本,文件名为-o。我不知道你可以在任何地方单独下载它,但 包含在Windows SDK中。至少,我知道它包含在Windows 7 SDK中;我不确定它是否仍然存在于最新的Windows 10 SDK中,但我认为是这样。

相关问题