call
C++ コードで GNU のインライン アセンブラを介して命令を使用して、__stdcall
規則を使用していることがわかっている関数を呼び出す場合、すべてのレジスタを clobbered としてリストする必要がありますか?
私はインターネット上で優れたガイダンスを見つけていませんが%eax
、 、%edx
、およびのように見えます%ecx
が、前の 2 つは戻り値用に予約されています。
これが私のコードです。3 番目のコロンの後に何を入力する必要があるか知りたいです。
#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
このメッセージ スレッドは、インターネット上で見つけることができる最高のものですが、「これは、__stdcall
保存せずに変更できることを前提としています」というものを見つけることができませんでした...