【发布时间】: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,esp 和 rbx,rbp,rdi,rsi,rsp,r12-r15 在 amd64 中。