Winapi Win32入口点是否必须保留任何寄存器值(被调用方保存的寄存器)?

Winapi Win32入口点是否必须保留任何寄存器值(被调用方保存的寄存器)?,winapi,assembly,x86,nasm,Winapi,Assembly,X86,Nasm,我正在用NASM编写一个程序,我不想将它与CRT链接,因此我将指定入口点(即Win32入口点)。这是程序源代码: global _myEntryPoint section .text _myEntryPoint: mov eax, 12345 以下是我对Win32入口点的了解(如果我错了,请纠正我): Win32入口点不像正常值那样返回值 函数没有(要退出Win32入口点,我必须调用 ExitProcess()) Win32入口点不接受任何参数 现在我不知道的是: Win32入

我正在用NASM编写一个程序,我不想将它与CRT链接,因此我将指定入口点(即Win32入口点)。这是程序源代码:

global _myEntryPoint

section .text
_myEntryPoint:
    mov eax, 12345
以下是我对Win32入口点的了解(如果我错了,请纠正我):

  • Win32入口点不像正常值那样返回值 函数没有(要退出Win32入口点,我必须调用
    ExitProcess()
  • Win32入口点不接受任何参数
现在我不知道的是:

  • Win32入口点是否必须保留任何寄存器值(被调用方保存的寄存器)?我认为答案是否定的,因为当Win32入口点退出时,它会终止进程,而不会将执行返回到期望保留一些寄存器值的函数
如中所述,您根本不应该从Win32入口点返回,在这种情况下,显然不需要保留任何寄存器。您的问题措辞含糊不清,表明您担心在调用
ExitProcess
之前需要恢复寄存器,但情况绝对不是这样;调用
ExitProcess
不会导致您从入口点返回。(另请参见以获取更新和。)


不管怎样,如果忽略该建议并从入口点返回,那么实际上答案是一样的:实际上不需要保留任何寄存器。据我所知,这种行为没有记录在案,但是,如果你想保持谨慎,你可以选择严格遵守
stdcall
惯例。

。这种行为的可能重复并不是真正的重复。它解释了从入口返回的后果,并得出结论,没有任何好的理由这样做。如果您选择从入口点返回,它不会解释是否(以及哪些)要保留的寄存器。我不确定OP是否真的需要知道,但这正是问题所在。@IInspectable,当时我认为它可能会消除一些混乱-OP声明为不能从入口点返回的前提,但随后询问是否需要保留寄存器,这真的没有意义。但现在回想起来,我认为你是对的。我将撤回投票。入口点这是唯一的功能。如果我们直接调用ExitProcess
ExitProcess
,我们是否保存一些寄存器并不重要。如果我们返回-需要像任何常用函数一样保存/恢复寄存器-x86中的ebx、ebp、edi、esi、esp和amd64中的rbx、rbp、rdi、rsi、rsp、r12-r15。