2017-07-08 50 views
0

我正在关注教程和学习x64英特尔语法大会和我有这个代码示例,假设编译没有问题,但我得到错误,所以我无法开始。NASM ASM没有正确编译?

代码示例:

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

我使用NASM组件编译器,使用MinGW的(G ++)代码编译,如果我编译使用内联组件使用64英特尔语法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

你写的代码是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格式)。 (你的可以在这些在NASM上建立在Windows上,当然,但是你将无法以运行他们。)对于64位Windows,你需要win64。因此,这将是:

nasm.exe -f win64 Foo.asm -o Foo.obj 

(注意.obj是传统的Windows上,不.o目标文件,虽然你可以使用整个-o开关实际上是可选的,如果忽略它,NASM会自动。名与标准扩展和相同的名字我们的输入源文件中的目标文件。)

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