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

标签 winapi assembly x86 nasm

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

global _myEntryPoint

section .text
_myEntryPoint:
    mov eax, 12345

现在这就是我对 Win32 入口点的了解(如果我错了,请纠正我):
  • Win32 入口点不会像正常一样返回值
    函数执行(要退出 Win32 入口点,我必须调用ExitProcess() )。
  • Win32 入口点不接受任何参数。

  • 现在我不知道的是以下内容:
  • Win32 入口点是否必须保留任何寄存器值(被调用者保存的寄存器)?我认为答案是否定的,因为当 Win32 入口点退出时,它会终止进程并且不会将执行返回到期望保留某些寄存器值的函数。
  • 最佳答案

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

    如果您忽略该建议并无论如何从入口点返回,那么实际上答案是相同的:您实际上不需要保留任何寄存器。然而,据我所知,这种行为没有被记录在案,所以如果你想保持谨慎,你可以选择严格遵循 stdcall习俗。

    关于winapi - Win32 入口点是否必须保留任何寄存器值(被调用者保存的寄存器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46294072/

    相关文章:

    c# - 如何在 C# 中记录低级操作系统文件事务?

    windows - fopen 使用 unicode 文件名

    c# - 如何获取 WinForm 应用程序中最顶层窗体的句柄?

    assembly - 如何删除字符串中的所有标点符号和空格?

    c++ - 非阻塞 ConnectNamedPipe 事件未收到信号

    performance - rdpmc 的 CR4.PCE 已清除

    performance - 条件指令(cmov)和跳转指令之间的区别

    c - 在不更改 x87 寄存器的情况下进行十进制除法

    linux - 每次使用 rdmsrl(MSR_LSTAR, system_call) 时,system_call 值都不同

    x86 - 在保护模式下重启