我正在学习 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]
答案 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中,但我认为是这样。