根据我在调用 Windows 函数时可以找到的文档,以下适用:-
在 Windows 上遵循 Microsoft x64 调用约定[12][13] 并预启动 UEFI(对于 x86-64 上的长模式)。它对前四个整数或指针参数(按此顺序)使用寄存器 RCX、RDX、R8、R9,并将其他参数压入堆栈(从右到左)。如果 64 位或更少,则在 RAX 中返回整数返回值(类似于 x86)。
在 Microsoft x64 调用约定中,调用者有责任在调用函数之前在堆栈上分配 32 字节的“影子空间”(无论使用的实际参数数量如何),并在调用之后弹出堆栈。阴影空间用于溢出 RCX、RDX、R8 和 R9,[14] 但必须使所有函数都可用,即使是那些参数少于四个的函数。
寄存器 RAX、RCX、RDX、R8、R9、R10、R11 被认为是易失性的(调用者保存)。 [15]
寄存器 RBX、RBP、RDI、RSI、RSP、R12、R13、R14 和 R15 被认为是非易失性的(被调用者保存)。 [15]
所以,我一直很高兴地调用 kernel32,直到GetEnvironmentVariableA
在某些情况下调用失败。我终于将其追溯到DF
设置了方向标志并且我需要清除它的事实。
到目前为止,我还没有找到任何提及这一点的信息,并想知道在打电话之前总是清除它是否是谨慎的。
或者这可能会导致其他问题。有人知道在这种情况下调用的约定吗?