【问题标题】:Does the Win32 entry point have to preserve any registers values (callee-saved registers)?Win32 入口点是否必须保留任何寄存器值(被调用者保存的寄存器)?
【发布时间】:2018-02-27 20:42:55
【问题描述】:

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

global _myEntryPoint

section .text
_myEntryPoint:
    mov eax, 12345

现在这就是我对 Win32 入口点的了解(如果我错了,请纠正我):

  • Win32 入口点不返回正常值 函数确实(要退出我必须调用的 Win32 入口点 ExitProcess())。
  • Win32 入口点不接受任何参数。

现在我不知道的是:

  • Win32 入口点是否必须保留任何寄存器值(被调用者保存的寄存器)?我认为答案是,因为当 Win32 入口点退出时,它会终止进程并且不会将执行返回给期望保留一些寄存器值的函数。

【问题讨论】:

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

标签: winapi assembly x86 nasm


【解决方案1】:

正如my answer to the proposed duplicate 中所述,您根本不应该从 Win32 入口点返回,在这种情况下,您显然不需要保留任何寄存器。您的问题措辞含糊地表明您担心晚上需要在致电ExitProcess 之前恢复寄存器,但绝对不是这种情况;调用ExitProcess 不会导致您从入口点it just stops running your code 返回。 (有关更新,另请参阅 here,以及 this may also be of interest。)

如果您忽略该建议并从入口点返回,那么实际上答案是相同的:您实际上不需要保留任何寄存器。然而,据我所知,这种行为并未记录在案,因此如果您想谨慎行事,可以选择严格遵守stdcall 约定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 2019-05-13
    • 2015-03-27
    • 2012-03-05
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多