通常、プロセッサ ベンダーまたはプロセッサ用の一般的な言語コンパイラを開発した最初の企業は、関数を呼び出す前に関数の呼び出し元が何をすべきか (スタックに何を入れるべきか、さまざまなレジスタに何を含めるべきかなど) と、呼び出されたものを定義します。関数は、戻る前に実行する必要があります (特定のレジスタが変更されている場合は、その値を復元するなど)。一部のプロセッサでは、複数の規則が普及しており、特定の関数のコードが、呼び出し元のコードが期待する規則を確実に使用するようにすることが一般的に非常に重要です。
レジスタの数がやや少ない 8088/8086 では、2 つの主要な規則が出現しました。C 規則は、呼び出し元が関数を呼び出す前に引数をスタックにプッシュし、後でそれらをポップする必要があることを指定します (つまり、呼び出された関数がスタックからポップオフする必要があるのは戻りアドレス)、および Pascal 規則では、呼び出された関数がリターンアドレスをポップするだけでなく、渡されたすべての引数をポップオフする必要があることを指定します。8086 では、Pascal の慣習により、わずかに小さいコードを使用できることがよくあります (スタックのクリーンアップは、関数呼び出しごとに 1 回ではなく、呼び出し可能な関数ごとに 1 回だけ行う必要があるためです。また、8086 には、指定された値を後のスタックポインタリターンアドレスをポップします。Pascal 規則の欠点の 1 つは、呼び出される関数が渡されるパラメーターのバイト数を知る必要があることです。呼び出された関数が正確に正しいバイト数をポップしなかった場合、スタックの破損はほぼ確実に発生します。
多くの新しいプロセッサでは、少数の固定数のパラメーターを持つルーチンでは、通常、パラメーターがスタックにプッシュされません。代わりに、コンパイラ ベンダーは、関数が呼び出される前に最初のいくつかのパラメーターがレジスタに配置されるように指定します。これにより、多くの場合、スタックベースのパラメーターを使用して達成されるよりも優れたパフォーマンスが得られます。ただし、多くのパラメーターまたは可変引数リストを持つルーチンでは、引き続きスタックを使用する必要があります。