根据MS documentation,似乎x86和x64程序集具有与END
指令相同的语法,即,它们都接受此指令的可选入口点[address]。但是考虑到GitHub中的this issue,x64似乎不接受此选项。下面的示例显示了这一点:
EXTERN ExitProcess:PROC
.CODE
main PROC
mov eax, 10
exit:
xor ecx, ecx
call ExitProcess
main ENDP
END main
在VS2017中产生以下错误消息:
error A2008: syntax error : main
error A2088: END directive required at end of file
恕我直言,这些错误消息非常混乱,特别是第二条错误消息,这似乎表明代码中没有END
指令。
但是假设GitHub中的问题是正确的,我想知道从x86到x64的语法变化是否有任何特定原因。
不幸的是,对于x64版本的MASM,这是未记录的行为。在此版本的汇编器上,END指令不接受入口点符号。您仅需使用裸露的“ END”语句结束源。 (使END指令完全无用,因为自MS-DOS 2.0以来就不需要用它来标记文件的末尾。)
作为一种解决方法,您可以使用/ENTRY
链接器选项指定入口点,可以从Visual Studio IDE在项目的“属性页->链接器->高级->入口点”下进行设置。您还可以重命名入口点,以依赖链接器的默认入口点,该入口点取决于所使用的子系统,如/ ENTRY状态的Microsoft文档:
默认情况下,起始地址是C运行时库中的函数名称。链接器根据程序的属性选择它,如下表所示。函数名称默认为mainCRTStartup(或wmainCRTStartup)使用/ SUBSYSTEM:CONSOLE的应用程序;调用main(或wmain)WinMainCRTStartup(或wWinMainCRTStartup)使用/ SUBSYSTEM:WINDOWS的应用程序;调用WinMain(或wWinMain),它必须是定义使用__stdcall_DllMainCRTStartup一个DLL;调用DllMain(如果存在),这必须被定义为使用__stdcall如果未指定/ DLL或/ SUBSYSTEM选项,则链接器将根据定义了main还是WinMain选择一个子系统和入口点。
如果您真的要在汇编文件中指定入口点,则可以使用32位x86版本的MASM用来通知链接程序的相同方法:在/ENTRY
中放置“ / ENTRY”选项部分。像这样的东西:
.drectve
注意选项周围的空格。