x64 での呼び出し規則x64 calling convention

このセクションでは、標準のプロセスと x64 の別の関数 (呼び出し先) に呼び出しを実行する 1 つの関数 (呼び出し元) を使用する規則について説明します。 コード。This section describes the standard processes and conventions that one function (the caller) uses to make calls into another function (the callee) in x64 code.

呼び出し規則の既定値Calling convention defaults

既定のアプリケーション バイナリ インターフェイス (ABI) によって、4 つの登録を高速呼び出しの呼び出し規約を使用して x64 です。The x64 Application Binary Interface (ABI) uses a four-register fast-call calling convention by default. これらのレジスタを保存する呼び出し先のシャドウ ストアとしてコール スタックに領域が割り当てられます。Space is allocated on the call stack as a shadow store for callees to save those registers. 関数呼び出しに引数とそれらの引数に使用されるレジスタの間は、厳密な一対一で対応します。There's a strict one-to-one correspondence between the arguments to a function call and the registers used for those arguments. 8 バイトに収まらないか、1、2、4、または 8 バイトは、引数は、参照渡しする必要があります。Any argument that doesn’t fit in 8 bytes, or isn't 1, 2, 4, or 8 bytes, must be passed by reference. 1 つの引数は、複数のレジスタを分散ことはありません。A single argument is never spread across multiple registers. X87 stack の登録は、使用されていないと、呼び出し先で使用することが考慮する必要が揮発性関数呼び出しで。The x87 register stack is unused, and may be used by the callee, but must be considered volatile across function calls. すべての浮動小数点操作が完了したら個の XMM レジスタを 16 を使用します。All floating point operations are done using the 16 XMM registers. 整数の引数が RCX、RDX、R8、および R9 レジスタに渡されます。Integer arguments are passed in registers RCX, RDX, R8, and R9. 浮動小数点引数は XMM0L、XMM1L、XMM2L、および XMM3L で渡されます。Floating point arguments are passed in XMM0L, XMM1L, XMM2L, and XMM3L. 16 バイトの引数は、参照によって渡されます。16-byte arguments are passed by reference. パラメーターの引き渡しがで詳しく説明されているパラメーターの引き渡しします。Parameter passing is described in detail in Parameter Passing. これらのレジスタだけでなく RAX、R10、R11、XMM4、および XMM5 と見なされます揮発性。In addition to these registers, RAX, R10, R11, XMM4, and XMM5 are considered volatile. その他のすべてのレジスタは、非揮発性です。All other registers are non-volatile. レジスタの使用量の詳細に記載されているUsage の登録呼び出し元/呼び出し先保存登録します。Register usage is documented in detail in Register Usage and Caller/Callee Saved Registers.

プロトタイプ宣言された関数の場合は、すべての引数が渡される前に予期される呼び出し先の型に変換されます。For prototyped functions, all arguments are converted to the expected callee types before passing. 呼び出し元は、呼び出し先へのパラメーター領域を割り当てる必要があり、呼び出し先はそれほど多くのパラメーターを受け取るしない場合でも常に、4 つの登録パラメーターを格納するための十分な領域を割り当てる必要があります。The caller is responsible for allocating space for parameters to the callee, and must always allocate sufficient space to store four register parameters, even if the callee doesn’t take that many parameters. この規則は、C 言語の関数のプロトタイプ宣言されていないと vararg C と C++ の関数のサポートを簡略化します。This convention simplifies support for unprototyped C-language functions and vararg C/C++ functions. Vararg またはプロトタイプ宣言されていない関数では、任意の浮動小数点値をする必要があります、対応する汎用レジスタ内で重複します。For vararg or unprototyped functions, any floating point values must be duplicated in the corresponding general-purpose register. 呼び出しの前に影を格納後、最初の 4 つを超えるすべてのパラメーターをスタックに格納する必要があります。Any parameters beyond the first four must be stored on the stack after the shadow store prior to the call. Vararg 関数の詳細が記載されてVarargsします。Vararg function details can be found in Varargs. プロトタイプ宣言されていない関数についての詳細についてはプロトタイプ宣言されていない関数します。Unprototyped function information is detailed in Unprototyped Functions.

アラインメントAlignment

ほとんどの構造体は、自然なアラインメントに揃えて配置されます。Most structures are aligned to their natural alignment. プライマリの例外は、スタック ポインターとmallocまたはallocaメモリで、パフォーマンスを支援するために、16 バイトに揃えられます。The primary exceptions are the stack pointer and malloc or alloca memory, which are aligned to 16 bytes in order to aid performance. 16 バイトを超える配置を手動で行う必要がありますが、XMM 操作の一般的な配置のサイズを 16 バイトには、この値がほとんどのコードの作業する必要があります。Alignment above 16 bytes must be done manually, but since 16 bytes is a common alignment size for XMM operations, this value should work for most code. 構造体レイアウトやアラインメントの詳細については、次を参照してください。型とストレージします。For more information about structure layout and alignment, see Types and Storage. スタックのレイアウトについては、次を参照してください。 x64 スタックの使用状況します。For information about the stack layout, see x64 stack usage.

UnwindabilityUnwindability

リーフ関数は、任意の非 volatile レジスタが変更されない関数です。Leaf functions are functions that don't change any non-volatile registers. 非リーフ関数は、関数を呼び出すか、ローカル変数の追加のスタック領域の割り当てによって、非揮発性 RSP をたとえば、変更できます。A non-leaf function may change non-volatile RSP, for example, by calling a function or allocating additional stack space for local variables. 例外を処理するときに非 volatile レジスタを回復するには、非リーフ関数を正しく任意命令に関数をアンワインドする方法を説明する静的データで注釈する必要があります。In order to recover non-volatile registers when an exception is handled, non-leaf functions must be annotated with static data that describes how to properly unwind the function at an arbitrary instruction. このデータとして格納されますpdata、またはプロシージャのデータは、順番を指すxdata、例外データを処理します。This data is stored as pdata, or procedure data, which in turn refers to xdata, the exception handling data. Xdata アンワインドの情報を格納し、追加 pdata または例外のハンドラー関数を指すことができます。The xdata contains the unwinding information, and can point to additional pdata or an exception handler function. プロローグとエピローグは、正しく xdata で説明されている可能性があるように高度に制限されます。Prologs and epilogs are highly restricted so that they can be properly described in xdata. スタック ポインターは、16 バイトのプロローグまたはエピローグの一部を除くリーフ関数の中でないコードを任意のリージョン内に配置する必要があります。The stack pointer must be aligned to 16 bytes in any region of code that isn’t part of an epilog or prolog, except within leaf functions. リーフ関数は、pdata および xdata は必要ありませんので、戻り値をシミュレートするだけでさかのぼることができます。Leaf functions can be unwound simply by simulating a return, so pdata and xdata are not required. 詳細については、関数プロローグとエピローグの適切な構造は、次を参照してください。 x64 プロローグとエピローグします。For details about the proper structure of function prologs and epilogs, see x64 prolog and epilog. 例外処理、および例外処理アンワインディング pdata と xdata の詳細については、次を参照してください。 x64 例外処理します。For more information about exception handling, and the exception handling and unwinding of pdata and xdata, see x64 exception handling.

パラメーター渡しParameter passing

最初の 4 つの整数引数はレジスタで渡されます。The first four integer arguments are passed in registers. 整数値は、それぞれで RCX、RDX、R8、および R9、左から右の順序で渡されます。Integer values are passed in left-to-right order in RCX, RDX, R8, and R9, respectively. 5 つの引数以上スタックに渡されるとします。Arguments five and higher are passed on the stack. すべての引数がレジスタに右揃え、呼び出し先がレジスタの上位ビットを無視し、必要なレジスタの部分にのみアクセスできるようにします。All arguments are right-justified in registers, so the callee can ignore the upper bits of the register and access only the portion of the register necessary.

最初の 4 つのパラメーターと倍精度の浮動小数点引数は、位置に応じて XMM0 - XMM3 で渡されます。Any floating-point and double-precision arguments in the first four parameters are passed in XMM0 - XMM3, depending on position. RCX、RDX、R8、および R9 これらの位置に通常使用される整数レジスタは無視されます、varargs 引数は除きます。The integer registers RCX, RDX, R8, and R9 that would normally be used for those positions are ignored, except in the case of varargs arguments. 詳細については、次を参照してください。 Varargsします。For details, see Varargs. 同様に、XMM0 - XMM3 レジスタは、対応する引数が整数またはポインター型で無視されます。Similarly, the XMM0 - XMM3 registers are ignored when the corresponding argument is an integer or pointer type.

_ _m128型、配列、および文字列がイミディ エイト値によって渡されることはありません。__m128 types, arrays, and strings are never passed by immediate value. 代わりに、呼び出し元が割り当てたメモリへのポインターが渡されます。Instead, a pointer is passed to memory allocated by the caller. 場合、同じサイズの整数と同様の構造体と共用体のサイズが 8、16、32、または 64 ビット、および、_ _m64 型が渡されます。Structs and unions of size 8, 16, 32, or 64 bits, and __m64 types, are passed as if they were integers of the same size. 構造体または共用体の他のサイズは、呼び出し元が割り当てたメモリへのポインターとして渡されます。Structs or unions of other sizes are passed as a pointer to memory allocated by the caller. このような集計の種類のポインターとしてやり取りされるなど__m128、呼び出し元が割り当てたの一時的なメモリは 16 バイトでアラインする必要があります。For these aggregate types passed as a pointer, including __m128, the caller-allocated temporary memory must be 16-byte aligned.

場合によって、スタックの領域の割り当てをしないし、他の関数を呼び出さないでください組み込み関数は、追加のレジスタ引数を渡す他 volatile レジスタを使用します。Intrinsic functions that don't allocate stack space, and don't call other functions, sometimes use other volatile registers to pass additional register arguments. この最適化は、コンパイラと組み込み関数の実装間の緊密なバインドによって実現されます。This optimization is made possible by the tight binding between the compiler and the intrinsic function implementation.

呼び出し先は、登録パラメーターを必要な場合は、そのシャドウ領域にダンプします。The callee is responsible for dumping the register parameters into their shadow space if needed.

次の表では、パラメーターが渡される方法を示します。The following table summarizes how parameters are passed:

パラメーターの型Parameter type 渡された方法How passed
浮動小数点数Floating point 最初に 4 つのパラメーター - XMM3 を通じて XMM0 します。First 4 parameters - XMM0 through XMM3. 他のユーザーは、スタックで渡されます。Others passed on stack.
整数型Integer 最初に 4 つのパラメーター - RCX、RDX、R8、R9。First 4 parameters - RCX, RDX, R8, R9. 他のユーザーは、スタックで渡されます。Others passed on stack.
集計 (8、16、32、または 64 ビット) と _ _m64Aggregates (8, 16, 32, or 64 bits) and __m64 最初に 4 つのパラメーター - RCX、RDX、R8、R9。First 4 parameters - RCX, RDX, R8, R9. 他のユーザーは、スタックで渡されます。Others passed on stack.
集計 (その他)Aggregates (other) ポインター。By pointer. まず、4 つのパラメーターが RCX、RDX、R8、および R9 のポインターとして渡されますFirst 4 parameters passed as pointers in RCX, RDX, R8, and R9
__m128__m128 ポインター。By pointer. まず、4 つのパラメーターが RCX、RDX、R8、および R9 のポインターとして渡されますFirst 4 parameters passed as pointers in RCX, RDX, R8, and R9

1 - すべての整数を渡す引数の例Example of argument passing 1 - all integers

func1(int a, int b, int c, int d, int e);
// a in RCX, b in RDX, c in R8, d in R9, e pushed on stack

2 - すべての浮動小数点値を渡す引数の例Example of argument passing 2 - all floats

func2(float a, double b, float c, double d, float e);
// a in XMM0, b in XMM1, c in XMM2, d in XMM3, e pushed on stack

3 - 混合整数と浮動小数点数を渡す引数の例Example of argument passing 3 - mixed ints and floats

func3(int a, double b, int c, float d);
// a in RCX, b in XMM1, c in R8, d in XMM3

引数渡し 4 の例-、_ _m64 __m128 と集計Example of argument passing 4 -__m64, __m128, and aggregates

func4(__m64 a, _m128 b, struct c, float d);
// a in RCX, ptr to b in RDX, ptr to c in R8, d in XMM3

varargVarargs

Varargs (たとえば、省略記号引数) を使用してパラメーターが渡されると場合、通常登録パラメーター規則を渡すことは適用されます、によってが書き込まれる 5 番目と後続の引数は、スタックを含むです。If parameters are passed via varargs (for example, ellipsis arguments), then the normal register parameter passing convention applies, including spilling the fifth and subsequent arguments to the stack. アドレスを取得する引数をダンプする、呼び出し先の責任です。It's the callee's responsibility to dump arguments that have their address taken. 浮動小数点値の場合にのみ、整数レジスタと浮動小数点レジスタの両方含める必要があります、値場合は、呼び出し先は、整数レジスタに値が必要です。For floating-point values only, both the integer register and the floating-point register must contain the value, in case the callee expects the value in the integer registers.

プロトタイプ宣言されていない関数Unprototyped functions

関数の完全なプロトタイプではない場合は、呼び出し元は、整数と浮動小数点値として整数値を倍精度として渡します。For functions not fully prototyped, the caller passes integer values as integers and floating-point values as double precision. 浮動小数点値の場合にのみ、整数レジスタと浮動小数点レジスタの両方が含まれている浮動小数点値場合は、呼び出し先は、整数レジスタに値が必要です。For floating-point values only, both the integer register and the floating-point register contain the float value in case the callee expects the value in the integer registers.

func1();
func2() {   // RCX = 2, RDX = XMM1 = 1.0, and R8 = 7
   func1(2, 1.0, 7);
}

戻り値Return values

RAX; から 64 ビットに収まるスカラー戻り値が返されますこれには、_ _m64 型が含まれます。A scalar return value that can fit into 64 bits is returned through RAX; this includes __m64 types. Float、double 型、およびなどのベクター型を含む非スカラー型型_ _m128_ _m128i_ _m128d XMM0 で返されます。Non-scalar types including floats, doubles, and vector types such as __m128, __m128i, __m128d are returned in XMM0. RAX や XMM0 で返される値の未使用ビットの状態は未定義です。The state of unused bits in the value returned in RAX or XMM0 is undefined.

ユーザー定義型は、グローバル関数や静的メンバー関数からの値で返すことができます。User-defined types can be returned by value from global functions and static member functions. 値によって RAX にユーザー定義型を返すには、1、2、4、8、16、32、または 64 ビットの長さが必要です。To return a user-defined type by value in RAX, it must have a length of 1, 2, 4, 8, 16, 32, or 64 bits. 必要ないユーザー定義のコンス トラクター、デストラクター、またはコピー代入演算子。プライベートまたはプロテクトの非静的データ メンバーはありません。参照型の非静的データ メンバーはありません。基底クラスを持たない。仮想関数はありません。これらの要件も満たさないデータ メンバーがありません。It must also have no user-defined constructor, destructor, or copy assignment operator; no private or protected non-static data members; no non-static data members of reference type; no base classes; no virtual functions; and no data members that do not also meet these requirements. (これは、実質的には C++03 POD 型の定義です。(This is essentially the definition of a C++03 POD type. 使用は推奨されませんので、標準の c++ 11 で変更が定義され、std::is_podこのテストします)。それ以外の場合は、呼び出し元が、メモリを割り当て、最初の引数として戻り値のポインターを渡す必要があります。Because the definition has changed in the C++11 standard, we don't recommend using std::is_pod for this test.) Otherwise, the caller assumes the responsibility of allocating memory and passing a pointer for the return value as the first argument. 後続する引数は、引数 1 つ分だけ右にシフトされます。Subsequent arguments are then shifted one argument to the right. RAX 内の呼び出し先は同じポインターを返す必要があります。The same pointer must be returned by the callee in RAX.

以下の例は、宣言を指定して関数に対してパラメーターと戻り値を渡す方法を示しています。These examples show how parameters and return values are passed for functions with the specified declarations:

戻り値 1 - 64 ビットの結果の例Example of return value 1 - 64-bit result

__int64 func1(int a, float b, int c, int d, int e);
// Caller passes a in RCX, b in XMM1, c in R8, d in R9, e pushed on stack,
// callee returns __int64 result in RAX.

2 - 128 ビットの結果の戻り値の例Example of return value 2 - 128-bit result

__m128 func2(float a, double b, int c, __m64 d);
// Caller passes a in XMM0, b in XMM1, c in R8, d in R9,
// callee returns __m128 result in XMM0.

3 - ポインターによるユーザー型の結果の戻り値の例Example of return value 3 - user type result by pointer

struct Struct1 {
   int j, k, l;    // Struct1 exceeds 64 bits.
};
Struct1 func3(int a, double b, int c, float d);
// Caller allocates memory for Struct1 returned and passes pointer in RCX,
// a in RDX, b in XMM2, c in R9, d pushed on the stack;
// callee returns pointer to Struct1 result in RAX.

4 - 値によるユーザー型の結果の戻り値の例Example of return value 4 - user type result by value

struct Struct2 {
   int j, k;    // Struct2 fits in 64 bits, and meets requirements for return by value.
};
Struct2 func4(int a, double b, int c, float d);
// Caller passes a in RCX, b in XMM1, c in R8, and d in XMM3;
// callee returns Struct2 result by value in RAX.

呼び出し元/呼び出し先保存済みレジスタCaller/Callee saved registers

RAX、RCX、RDX、R8、R9、R10、R11、XMM0 ~ 5、および場合は YMM0 ~ 15 と ZMM0 15 の上の部分は揮発性と見なされます、見なす必要があります、レジスタが関数の呼び出しで破棄 (しない限り、それ以外の場合の安全性が証明可能なプログラム全体の最適化などの分析によって)。The registers RAX, RCX, RDX, R8, R9, R10, R11, XMM0-5, and the upper portions of YMM0-15 and ZMM0-15 are considered volatile and must be considered destroyed on function calls (unless otherwise safety-provable by analysis such as whole program optimization). AVX512VL、16 ~ 31 の ZMM、YMM、および XMM レジスタは揮発性です。On AVX512VL, the ZMM, YMM, and XMM registers 16-31 are volatile.

RBX、RBP、RDI、RSI、RSP、R12、R13、R14、R15、および XMM6 15 レジスタの不揮発性と見なされます保存する必要がありますや関数によって復元されるそれらを使用します。The registers RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15, and XMM6-15 are considered nonvolatile and must be saved and restored by a function that uses them.

関数ポインターFunction pointers

関数ポインターは、個々 の関数のラベルへのポインターだけです。Function pointers are simply pointers to the label of the respective function. 関数ポインターの目次 (TOC) の要件の表ではありません。There are no table of contents (TOC) requirements for function pointers.

古いコードの浮動小数点サポートFloating-point support for older code

MMX と浮動小数点スタック レジスタ (MM0-MM7/st0 を割り当てます-ST7) は、コンテキストの切り替えの間で保持されます。The MMX and floating-point stack registers (MM0-MM7/ST0-ST7) are preserved across context switches. これらのレジスタの明示的な呼び出し規約はありません。There is no explicit calling convention for these registers. これらのレジスタの使用は、カーネル モード コードで禁じられています。The use of these registers is strictly prohibited in kernel mode code.

FpCsrFpCsr

レジスタの状態にも、x87 FPU 制御ワード。The register state also includes the x87 FPU control word. 呼び出し規約では、このレジスタを不揮発性によって決まります。The calling convention dictates this register to be nonvolatile.

X87 FPU 制御ワードのレジスタの先頭に次の標準的な値に設定されているプログラムの実行。The x87 FPU control word register is set to the following standard values at the start of program execution:

登録[ビット]Register[bits] 設定Setting
FPCSR[0:6]FPCSR[0:6] 例外はすべて 1 の (すべての例外マスク) をマスクします。Exception masks all 1's (all exceptions masked)
FPCSR[7]FPCSR[7] 予約 - 0Reserved - 0
FPCSR[8:9]FPCSR[8:9] 精度の制御 - 10B (有効桁数を 2 倍)Precision Control - 10B (double precision)
FPCSR[10時 11分]FPCSR[10:11] 丸め制御 - 0 (round を最も近い)Rounding control - 0 (round to nearest)
FPCSR[12]FPCSR[12] 無限の制御 - 0 (未使用)Infinity control - 0 (not used)

FPCSR 内のフィールドのいずれかを変更する呼び出し先は、呼び出し元に返す前にそれらを復元する必要があります。A callee that modifies any of the fields within FPCSR must restore them before returning to its caller. さらに、呼び出し元がこれらのフィールドのいずれかが変更する必要がありますの標準値の前に復元アグリーメントによって、呼び出し先が変更後の値を期待しない限り、呼び出し先を呼び出します。Furthermore, a caller that has modified any of these fields must restore them to their standard values before invoking a callee unless by agreement the callee expects the modified values.

非揮発性に関する規則に制御フラグの 2 つの例外があります。There are two exceptions to the rules about the non-volatility of the control flags:

  1. 不揮発性 FpCsr を変更するが、指定された関数のドキュメント化の目的の関数でフラグを設定します。In functions where the documented purpose of the given function is to modify the nonvolatile FpCsr flags.

  2. ある場合に、これらの規則の違反が、これらの規則は違反すると、たとえば、プログラム全体の分析によって、プログラムと同様に動作するプログラムで結果を修正します。When it's provably correct that the violation of these rules results in a program that behaves the same as a program where these rules aren't violated, for example, through whole-program analysis.

MxCsrMxCsr

レジスタの状態には、MxCsr も含まれています。The register state also includes MxCsr. 呼び出し規約は、揮発性の部分と不揮発性の部分にこのレジスタを分割します。The calling convention divides this register into a volatile portion and a nonvolatile portion. 揮発性の部分から成る、MXCSR の 6 つのステータス フラグ[0:5]、MXCSR レジスタの残りの部分を while[6時 15分]、不揮発性と見なされます。The volatile portion consists of the six status flags, in MXCSR[0:5], while the rest of the register, MXCSR[6:15], is considered nonvolatile.

不揮発性の部分は、プログラムの実行の開始時に、次の標準的な値に設定されます。The nonvolatile portion is set to the following standard values at the start of program execution:

登録[ビット]Register[bits] 設定Setting
MXCSR[6]MXCSR[6] Denormals 0 - 0 のられますDenormals are zeros - 0
MXCSR[7時 12分]MXCSR[7:12] 例外はすべて 1 の (すべての例外マスク) をマスクします。Exception masks all 1's (all exceptions masked)
MXCSR[13時 14分]MXCSR[13:14] 丸め制御 - 0 (round を最も近い)Rounding control - 0 (round to nearest)
MXCSR[15]MXCSR[15] マスクされたアンダー フロー - 0 (オフ) に 0 へのフラッシュします。Flush to zero for masked underflow - 0 (off)

MXCSR 内不揮発性のフィールドのいずれかを変更する呼び出し先は、呼び出し元に返す前にそれらを復元する必要があります。A callee that modifies any of the nonvolatile fields within MXCSR must restore them before returning to its caller. さらに、呼び出し元がこれらのフィールドのいずれかが変更する必要がありますの標準値の前に復元アグリーメントによって、呼び出し先が変更後の値を期待しない限り、呼び出し先を呼び出します。Furthermore, a caller that has modified any of these fields must restore them to their standard values before invoking a callee unless by agreement the callee expects the modified values.

非揮発性に関する規則に制御フラグの 2 つの例外があります。There are two exceptions to the rules about the non-volatility of the control flags:

  • 不揮発性の MxCsr を変更するが、指定された関数のドキュメント化の目的の関数でフラグを設定します。In functions where the documented purpose of the given function is to modify the nonvolatile MxCsr flags.

  • ある場合に、これらの規則の違反が、これらの規則は違反すると、たとえば、プログラム全体の分析によって、プログラムと同様に動作するプログラムで結果を修正します。When it's provably correct that the violation of these rules results in a program that behaves the same as a program where these rules aren't violated, for example, through whole-program analysis.

関数の境界を越えて MXCSR の揮発性の部分の状態に関する仮定は行われません関数のドキュメントで説明されている場合を除き、します。No assumptions can be made about the state of the volatile portion of MXCSR across a function boundary, unless specifically described in a function's documentation.

setjmp/longjmp の使用setjmp/longjmp

呼び出す setjmpex.h または setjmp.h を含めると、 setjmpまたはlongjmpを呼び出すデストラクター アンワインドが発生し、__finally呼び出し。When you include setjmpex.h or setjmp.h, all calls to setjmp or longjmp result in an unwind that invokes destructors and __finally calls. 一方、x86、含む setjmp.h が結果に__finally句とデストラクターを呼び出さない。This differs from x86, where including setjmp.h results in __finally clauses and destructors not being invoked.

呼び出しsetjmp現在のスタック ポインター、非 volatile レジスタ、および MxCsr レジスタに保持されます。A call to setjmp preserves the current stack pointer, non-volatile registers, and MxCsr registers. 呼び出すlongjmp最新に戻りsetjmp呼び出しサイトとリセット スタック ポインター、非 volatile レジスタ、および MxCsr レジスタ、状態に戻すように、最新では保持されますsetjmp呼び出します。Calls to longjmp return to the most recent setjmp call site and resets the stack pointer, non-volatile registers, and MxCsr registers, back to the state as preserved by the most recent setjmp call.

関連項目See also

x64 ソフトウェア規約x64 software conventions