7

「楽しみ」のために Windows で x64 アセンブリを学習しています。Windows でのx64 呼び出し規約に関する MSDN ドキュメントには、次のように記載されています。

呼び出し元は、呼び出し先にパラメーター用のスペースを割り当てる責任があり、呼び出し先にそれほど多くのパラメーターがない場合でも、常に 4 つのレジスタ パラメーターに十分なスペースを割り当てる必要があります。これは、C のプロトタイプ化されていない関数と、vararg C/C++ 関数のサポートを簡素化するのに役立ちます。

私の関数は C のプロトタイプ化されていない関数でも varargs C/C++ 関数でもないので、ローカル変数のように、関数内の汎用ストレージに(呼び出し直後の変更されていない値を想定して)いつでも[rsp+8]to を使用できるということですか?[rsp+32]rsp

4

2 に答える 2

6

はい、受信パラメーターのスクラッチ スペースを任意の目的に使用できます。しかし、あなたはすでにこれを知っていました.これを行う許可は、インバウンドパラメータを変更する合法性によってすでに暗示されています.

void somefunction(int arg1)
{
    arg1 = anyvalue; // mov [rsp+8], anyvalue
}
于 2011-08-21T13:48:39.463 に答える
1

彼がやろうとしていることは、次のようなことだと思います。

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue

私の知る限り、Microsoft は、(rcx で) 引数を 1 つしかとらない関数であっても、呼び出し先が 4 つのレジスタ (rcx、rdx、r8.r9) を格納するのに十分なスペースを割り当てる必要があると述べています。

注: 見苦しい C コードと、新しい decltype キーワードが混在する旧式のキャスティングについては申し訳ありません

于 2012-06-09T16:02:57.467 に答える