スタックのpush/pop動作ですが、
通常、
push動作の場合、現在スタックポインタが指しているアドレスに値をプッシュした後、
アドレスをデクリメント、
逆に、
pop動作の場合、現在スタックポインタが指しているアドレスをインクリメントした後、
その値をポップする
という事になると思うのですが、
push動作で、現在スタックポインタが指しているアドレスをデクリメントした後に
値をプッシュする、
pop動作で、現在スタックポインタが指しているアドレスの値をポップした後に、
アドレスをインクリメントする、
または、push動作で、アドレスをインクリメントし、pop動作でアドレスをデクリメントする
様な書き方は自由に行っても良いのでしょうか?
No.1
- 回答日時:
> push動作で、現在スタックポインタが指しているアドレスをデクリメントした後に値をプッシュする、
スタックが空の時はどうしますか?
そういうやり方をしてもかまいませんが、スタックの一番底の領域が無駄になります。
> pop動作で、現在スタックポインタが指しているアドレスの値をポップした後に、アドレスをインクリメントする、
スタックにデータが一つしか残っていないときには、どうしますか?
スタックがアンダーフローしてしまいそうですが。
> push動作で、アドレスをインクリメントし、pop動作でアドレスをデクリメントする
これは別にかまいません。ハードウェアではそういう記述のほうが一般的です。
確かに通常よく見るメモリマップは、スタック領域は、高アドレス側に近いある番地から高アドレス方向に向かってデータを積んでいくものが多いですよね。
No.2
- 回答日時:
はい。
自分でCPUを設計するという話ならどっちでもかまいません。特定のCPUについての話ならそのCPUにあった説明をする必要があります。x86のCPUは、お書きの後半の動作ですね。
高級言語で配列でスタックを実現するなら、先頭領域が無駄になるならないという違いが生じますが、対象がCPUの命令で、スタックがメモリ上の話であれば関係ないです。
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行があなたの「プッシュ」?
お探しの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を読み込んで実行す...
-
printf / sprintf のスタック消...
-
Cプログラミングの関数電卓のア...
-
スタックの仕組み
-
アセンブラでmain関数から作成...
-
スタックとキューの使い所
-
マス目上の移動のアルゴリズム
-
C言語・スタックを使用した逆...
-
基本情報技術者のデータ構造あ...
-
エラー?メッセージ
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
タイピングの癖
-
ルータの負荷対策でL2スイッチ...
-
第一級陸上特殊無線技士
-
SP領域とはなんですか?
-
タイピングソフト
-
乱数をC言語で
-
サブネットマスクが255.255.255...
-
イーサネット10Mbpsの通信速度...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
エラー?メッセージ
-
printf / sprintf のスタック消...
-
_CRTIMPの意味は?
-
スタックを用いて整数配列を入...
-
スタックフレームの消滅
-
関数呼び出しでのスタック消費量
-
スタックの伸張方向
-
スタック領域変更
-
逆ポーランド記法
-
関数のプロローグとエピローグ...
-
Ethernetヘッダの取得 NDIS
-
スタックとキューの使い所
-
再帰処理を非再帰処理に書き換...
-
CASLとCASL2の違いについて
-
マス目上の移動のアルゴリズム
-
コンパイラオプション
-
VC++6.0 Stack Overflow !!
-
VCでのスタックサイズ
おすすめ情報