41886


コンピュータの構成と設計を勉強しています。  
プログラムの手続き中にレジスタのデータをスタックポインタにプッシュして、  
手続きが終わったら、スタックされていた退避データをスタックからポップして、レジスタの変数に代入し、  
プログラムカウンタ(PC)のアドレスから呼び出し元に戻るという理解で大丈夫でしょうか？

また、スタックポインタというのはメモリ上で連続なアドレスでなければいけないのでしょうか？  
その場合、スタックポインタには最大で何バイトになるのでしょうか？


CC BY-SA 3.0
2018-02-21T01:09:46.913
41880
2019-09-19T10:14:35.107
15279
question
ハードウェア
スタックポインタの最大値


具体的なハードウエア（CPU)を想定しないと回答が難しいですが、

> プログラムの手続き中にレジスタのデータをスタックポインタにプッシュして、  
>  手続きが終わったら、スタックされていた退避データをスタックからポップして、  
>  レジスタの変数に代入し、

その理解でよろしいかと思われます。  
通常のCPUでは、サブルーチンのコール／リターンの呼び出しアドレス保存／復帰にもスタックが使用されますね

> スタックポインタというのはメモリ上で連続なアドレスでなければいけないのでしょうか？

通常のスタックでは連続してないといけません  
スタックの使用量は、使用するサブルーチンで使用するスタックの量で決まりますね


CC BY-SA 4.0
2018-02-21T04:25:11.460
41886
2019-09-19T10:13:50.150
2019-09-19T10:13:50.150
32986
27481
41880
answer


具体的なハードウェア(CPU)だけでなく、コンパイラにも依存します。  
単なる勉強だけなら、レジスタの退避と、戻り先の格納だけでも良いかも知れませんが、、、

環境(CPU, OS, コンパイラ)によって以下の用途にも使われます。

  * 関数内で使用される変数
  * コンパイラが必要とする作業領域
  * 関数の引数

(他にもあるかも)  
スタックが連続していないと、これらの処理が大変となります。  
ただ、用途によっては、途中でスタックを切り替えることもありますね。 (特に割込み処理)

組込み系でメモリが少ない場合、スタックにどれだけメモリを割り当てるかは、重要な検討項目です。 (最大で、どれだけ必要か調べる)


CC BY-SA 4.0
2018-02-21T11:37:11.077
41895
2019-09-19T10:14:35.107
2019-09-19T10:14:35.107
32986
41880
answer