スタックは、NSISによって保持されている値の山です。 この山は好きなだけ大きくできるので、値をスタックに置いたりスタックから値を受け取ることが できます。スタックは1つだけあります。スタックはLIFO(Last In First Out 最後に入れたものを 最初に出す)原則に従っています。例えば、パラメータを関数やプラグインに渡すためにスタックを 使う事ができます。現在の値をスタックに置く事によって、$0-$9 と $R0-$R9値 を、新しい値を それらに割り当てて それで何かをして 古い値を変数に戻す事に広がって使用できます。スタックとの 相互作用のために使われうる3つの命令があります:Pop, Push, Exchです。
push命令はスタックの上に値をpushします。値はスタックの「てっぺんに」置かれます。 スタックのサイズはそれにより増大します。
pop命令は、「てっぺんの値」をスタックから取り出しそれを指定された変数に割り当てます。 スタックのサイズはそれにより減少します。もしスタックに値が全くない(例えば、スタックのサイズ が 0 )なら、エラーフラグがセットされるでしょう。
Exchは2つの値を入れ換えます。もしExchがどんなパラメーターも無しに使用されると、スタックの 「てっぺん2つ」の値が交換されます。もしユーザー変数がExch命令の為のパラメーターとして 使われると、スタックの値が変数に割り当てられ、変数の値がスタックの「てっぺんに」置かれます。 もしExchがスタックインデックス(例えば スタック上の値を指し、0(てっぺんの値)で始まる数字) との組み合わせで使われると、てっぺんの値は指定されたインデックスで値と交換されます。
以下の例は、Pop、Push、Exch命令の使用を示しています。左で実行されたコードが示されます。 そして右で、コードを実行した後にスタックにある値を見ます。(上から下へ連続しています。)
Code | Stack |
---|---|
Push "Value1" Push "Value2" |
Value 2 Value 1 |
Pop $0 ; $0 は "Value 2"を含んでいる |
Value 1 |
Push $0 Push "Value 3" Push "Value 4" |
Value 4 Value 3 Value 2 Value 1 |
Exch ;パラメーター無し ; スタックの上から2つの値を交換する |
Value 3 Value 4 Value 2 Value 1 |
StrCpy $0 "Value X" Exch $0 ; てっぺんの値と変数を交換 ; $0 は"Value 3"を含んでいる |
Value X Value 4 Value 2 Value 1 |
Exch 3 ; てっぺんの値と4番目の値(従って index 3)を交換 |
Value 1 Value 4 Value 2 Value X |