プロが教えるわが家の防犯対策術!

スタックのpush/pop動作ですが、
通常、
push動作の場合、現在スタックポインタが指しているアドレスに値をプッシュした後、
アドレスをデクリメント、
逆に、
pop動作の場合、現在スタックポインタが指しているアドレスをインクリメントした後、
その値をポップする
という事になると思うのですが、

push動作で、現在スタックポインタが指しているアドレスをデクリメントした後に
値をプッシュする、
pop動作で、現在スタックポインタが指しているアドレスの値をポップした後に、
アドレスをインクリメントする、
または、push動作で、アドレスをインクリメントし、pop動作でアドレスをデクリメントする
様な書き方は自由に行っても良いのでしょうか?

A 回答 (4件)

> push動作で、現在スタックポインタが指しているアドレスをデクリメントした後に値をプッシュする、



スタックが空の時はどうしますか?
そういうやり方をしてもかまいませんが、スタックの一番底の領域が無駄になります。

> pop動作で、現在スタックポインタが指しているアドレスの値をポップした後に、アドレスをインクリメントする、

スタックにデータが一つしか残っていないときには、どうしますか?
スタックがアンダーフローしてしまいそうですが。


> push動作で、アドレスをインクリメントし、pop動作でアドレスをデクリメントする

これは別にかまいません。ハードウェアではそういう記述のほうが一般的です。
    • good
    • 0
この回答へのお礼

確かに通常よく見るメモリマップは、スタック領域は、高アドレス側に近いある番地から高アドレス方向に向かってデータを積んでいくものが多いですよね。

お礼日時:2021/04/14 18:39

はい。

自分でCPUを設計するという話ならどっちでもかまいません。

特定のCPUについての話ならそのCPUにあった説明をする必要があります。x86のCPUは、お書きの後半の動作ですね。

高級言語で配列でスタックを実現するなら、先頭領域が無駄になるならないという違いが生じますが、対象がCPUの命令で、スタックがメモリ上の話であれば関係ないです。
    • good
    • 0
この回答へのお礼

自分もx86系のアセンブラを見ていたら、後者の書き方になっていたので、質問させていただきました。

お礼日時:2021/04/14 18:42

○概念と実装の違い


○スタックポインタの機能
あたりを正しくできていれば、問題はありません。
が、なにか前提がある(例えば特定のCPUのPUSH/POPについて説明する)のなら、それに従ったものでなければなりません。


スタックの概念は
・スタックの先頭に積む
・スタックの先頭から取り出す
の2つの操作しかありません。
ここに「スタックポインタをインクリメント」等という操作は出てきません。


それを実装するときに、どんな手段を使うか、というのは別の話題です。
実装方法の一つにスタックポインタと配列状の領域を使ったものがあります。
「スタックポインタをインクリメント」等という操作はここで出てきます。



stack[0]〜stack[9] の10要素の配列をスタックとして利用する例で考えます。
このとき、次の仕様が考えられます。
(a) stack[0]から使う
(b) stack[9]から使う
(1) SPは次に積まれる場所
(2) SPは現在に積まれている最後の場所

「通常」とあるのは、(b)(1)の組合せのときのものです。
・SP=9 で初期化/このときスタックは空
・SP=-1でスタックが一杯


> push動作で、現在スタックポインタが指しているアドレスをデクリメントした後に値をプッシュする、
> pop動作で、現在スタックポインタが指しているアドレスの値をポップした後にアドレスをインクリメントする

これは(b)(2)の組合せです。
・SP=10 で初期化/このときスタックは空
・SP=0でスタックが一杯
実在のCPUでは、これを採用しているものが多そうです。


> push動作で、アドレスをインクリメントし、pop動作でアドレスをデクリメントする

これは、(a)(1)、(a)(2)での説明になります。
(a)(1)
・SP=0 で初期化/このときスタックは空
・SP=10でスタックが一杯
(a)(2)
・SP=-1 で初期化/このときスタックは空
・SP=9でスタックが一杯

「スタックと実装方法」が違えば、「PUSH/POPの実装方法」も変わってきます。
それをちゃんと考えていれば、「どの方法でスタックを作るか」は自由です。
ですが、既にあるスタックについて「どんな説明をするか」は自由ではありません。


なお、プログラムで作る場合は、連結リストによる実装もあります。
この場合「インクリメント」「デクリメント」はしません。
    • good
    • 0
この回答へのお礼

詳しい説明有り難うございました。

お礼日時:2021/04/14 18:52

これ両方とも動作後、スタックポインタはスタックトップを指す


イメージなんだろうか?
そうであれば結果は同じなのでどうでも良いです。
カタカナのプッシュ、ポップの具体的な動作の記述がないので・・・

例えばz80だと
PUSH HL:

[SP-1]←H
[SP-2]←L
SP←SP-2

この最初の2行があなたの「プッシュ」?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!