gpt4 book ai didi

c++ - GNU 内联汇编 : which registers get clobbered by __stdcall?

转载 作者:行者123 更新时间:2023-11-30 04:16:03 27 4
gpt4 key购买 nike

如果我使用 call 指令,通过 C++ 代码中的 GNU 内联汇编程序,调用一个我知道使用 __stdcall 约定的函数,我是否必须列出任何注册为破坏?

我在互联网上找不到很好的指导,但看起来 %eax%edx%ecx 是调用者-save,前两者保留作为返回值。

这是我的代码。我想知道我需要在第三个冒号后面放什么。

#include <cstdint>

namespace {

inline uint64_t invoke_stdcall(uint64_t (* stdcall_func)())
{
unsigned long hi32, lo32;
asm(
"call %2"
: "=d" (hi32), "=a" (lo32)
: "m" (stdcall_func)
: /* HELP! What goes here? */
);
return static_cast<uint64_t>(hi32) << 32 | static_cast<uint32_t>(lo32);
}

} // anonymous namespace

This message thread是我在互联网上能找到的最好的,但我没能找到任何说“这就是 __stdcall 假定它可以在不保存的情况下修改的东西”...

最佳答案

MS 确实解释了 EAX、EDX 和 ECX 被调用“破坏”了,所有其他寄存器必须由被调用者以 32 位代码保留,link to MSDN docs - 使用哪种调用约定并不重要。

所以,为了清楚起见,您需要将 ecx 标记为已破坏,因为 eaxedx 已经在内联汇编器中使用.

对于 x86-64,文档是 here , 并说

The registers RBX, RBP, RDI, RSI, R12, R13, R14, and R15 are considered nonvolatile and must be saved and restored by a function that uses them.

关于c++ - GNU 内联汇编 : which registers get clobbered by __stdcall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17932423/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com