x64似乎不像x86那样接受END指令中的入口点。语法有此更改的任何特定原因吗?

问题描述 投票:1回答:1

根据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的语法变化是否有任何特定原因。

assembly x86 x86-64 masm
1个回答
3
投票

不幸的是,对于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

注意选项周围的空格。

© www.soinside.com 2019 - 2024. All rights reserved.