我想在Windows 7(与NASM)上编译下面的代码:
[BITS 32] extern ExitProcess import ExitProcess kernel32.dll extern MessageBoxA import MessageBoxA user32.dll segment .data use32 Caption db 'Caption Text',0 Text db "My MessageBox Text.",0 segment .code use32 ..start: push dword 0 push dword Caption push dword Text push dword 0 call [MessageBoxA] push dword 0 call [ExitProcess]
为了编译这个,我尝试了nasm -o test.o test.asm
,但是接着说:
test.asm:4: error: parser: instruction expected test.asm:6: error: symbol `import' redefined test.asm:6: error: parser: instruction expected
为什么不起作用?
编辑:好的。 简单的错误… nasm -o test.o -f obj test.asm
工程…
看起来像一个已知的问题。 解决方案建议在http://cboard.cprogramming.com/windows-programming/114989-nasm-import-directive-failing-expected-instruction-error.html
你不应该使用Obj。 这是为了DOS而不是Windows。 是的,你可以在你的ASM代码中使用大量的编译器指令来使它在Windows中工作,但是如果你使用Win32编译,那么你最终将得到专门用于Windows的代码。 不幸的是,编写NASM的人会这样做,即导入在Win32模式下不起作用(即使导入是非常标准的,而且需要在Windows中工作)。 更不幸的是,写NASM的人似乎已经停止了添加/改进/升级程序,基本上已经放弃了这个项目。 而且社区没有办法修复这个bug(NASM的源代码并没有公开提供),这给我们留下了一个非常糟糕的产品!