
スタックのpush/pop動作ですが、
通常、
push動作の場合、現在スタックポインタが指しているアドレスに値をプッシュした後、
アドレスをデクリメント、
逆に、
pop動作の場合、現在スタックポインタが指しているアドレスをインクリメントした後、
その値をポップする
という事になると思うのですが、
push動作で、現在スタックポインタが指しているアドレスをデクリメントした後に
値をプッシュする、
pop動作で、現在スタックポインタが指しているアドレスの値をポップした後に、
アドレスをインクリメントする、
または、push動作で、アドレスをインクリメントし、pop動作でアドレスをデクリメントする
様な書き方は自由に行っても良いのでしょうか?
No.3ベストアンサー
- 回答日時:
○概念と実装の違い
○スタックポインタの機能
あたりを正しくできていれば、問題はありません。
が、なにか前提がある(例えば特定の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の実装方法」も変わってきます。
それをちゃんと考えていれば、「どの方法でスタックを作るか」は自由です。
ですが、既にあるスタックについて「どんな説明をするか」は自由ではありません。
なお、プログラムで作る場合は、連結リストによる実装もあります。
この場合「インクリメント」「デクリメント」はしません。
No.4
- 回答日時:
これ両方とも動作後、スタックポインタはスタックトップを指す
イメージなんだろうか?
そうであれば結果は同じなのでどうでも良いです。
カタカナのプッシュ、ポップの具体的な動作の記述がないので・・・
例えばz80だと
PUSH HL:
[SP-1]←H
[SP-2]←L
SP←SP-2
この最初の2行があなたの「プッシュ」?
No.1
- 回答日時:
> push動作で、現在スタックポインタが指しているアドレスをデクリメントした後に値をプッシュする、
スタックが空の時はどうしますか?
そういうやり方をしてもかまいませんが、スタックの一番底の領域が無駄になります。
> pop動作で、現在スタックポインタが指しているアドレスの値をポップした後に、アドレスをインクリメントする、
スタックにデータが一つしか残っていないときには、どうしますか?
スタックがアンダーフローしてしまいそうですが。
> push動作で、アドレスをインクリメントし、pop動作でアドレスをデクリメントする
これは別にかまいません。ハードウェアではそういう記述のほうが一般的です。
確かに通常よく見るメモリマップは、スタック領域は、高アドレス側に近いある番地から高アドレス方向に向かってデータを積んでいくものが多いですよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) このプログラミング誰か教えてくれませんか 4 2022/04/29 15:56
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- YouTube パソコンのIPアドレスを複数、持つことに関して、法律に違反ですか。 9 2022/06/23 18:20
- ツイキャス ツイキャスでアカウントロックされたとき、IPアドレスが自動取得で変更されても、PC端末が特定される? 1 2022/10/15 15:49
- その他(パソコン・周辺機器) Microsoftアカウントのサイインのメールアドレスは何台まで同じアドレスを使用できるのでしょうか 4 2023/04/07 20:12
- その他(メールソフト・メールサービス) Thunderbird 宛先アドレスの重複チェックもしくはソートをしたい 2 2023/07/25 11:30
- Windows 10 確認した「IPv4アドレス」 1 2022/10/26 20:45
- 仕事術・業務効率化 こういう人って、思考能力の弱い人って思われますか? 1 2023/04/26 23:05
- その他(インターネット接続・インフラ) アプリ利用者を特定し、裁判に 2 2022/06/09 21:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
逆ポーランド記法
-
VB.netでDLLを読み込んで実行す...
-
VC++でプログラムから現在のス...
-
_CRTIMPの意味は?
-
VC6でコンパイルでスタックの領...
-
個人が特定の人に対して自分の...
-
プログラムの規模を表す単位「k...
-
ubuntuで デイスク/deb/loopと...
-
hdmiはパラレル?シリアル?
-
ホストアドレスの0とは
-
パソコンでインターネット接続...
-
Excel VBA マクロ処理 リンク先...
-
ステップ数について
-
サブネットマスクが255.255.255...
-
磁気ディスクのアクセス時間の...
-
100台のPCをLAN接続する時に必...
-
問題集:サブネットマスクにつ...
-
【電気】フリッカー回路ってな...
-
15パズルゲームについて
-
タイピングを極めたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
最大スタックサイズを大きくす...
-
gccでスタックサイズを変更する...
-
VB.netでDLLを読み込んで実行す...
-
printf / sprintf のスタック消...
-
スタックフレームの消滅
-
H8マイコン スタック領域に...
-
ハイパーカード
-
関数のプロローグとエピローグ...
-
スタック領域変更
-
再帰処理を非再帰処理に書き換...
-
WINAPについて
-
無償Borland5.51でスタックメモ...
-
_CRTIMPの意味は?
-
エラーメッセージが・・・
-
プログラミングについての質問...
-
OCXからのコールバックを繰り返...
-
スタックとキューの使い所
-
マス目上の移動のアルゴリズム
-
WINDOWSなどのOSを構成している...
-
エラー?メッセージ
おすすめ情報