以下の英語での動作をするようなプログラムを作れと言われてるんですが、ポインタとスタックの意味がよくわかりません。よければ教えてほしいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/05 10:52
回答3件
0
mit0223さんの詳しい解説で終わったと思ってましたが、コメントの英文を機械翻訳すると、
以下は、512バイトページを持つコンピュータのプログラムフラグメントの実行トレースです。プログラムはアドレス1020に配置され、スタックポインタは8192になります(スタックは0に向かって増加します)。このプログラムによって生成されたページ参照文字列を与えます。各命令は、即値の定数を含む4バイト(1ワード)を占有します。命令とデータの両方の参照は、参照文字列に含まれます。」
となって、単なる説明にしか過ぎず、要求とか質問とかが含まれてませんね。
最初の問題文の英文を機械翻訳すると、
レジスタ0にワード6144をロードする
レジスタ0をスタックにプッシュする
5120でプロシージャをコールし、戻りアドレスをスタックする
スタックポインタから即値定数16を減算する
実際のパラメータと即値定数4を比較する
5152に等しい場合にジャンプする
なので、プログラムの説明と思われるので、この通りプログラムすれば良い様に思われますが・・・。
できれば、英文の全文を質問の編集で載せた方が良いように思います。
(もしかしたらteratail向きの内容ではないかもしれないので)
投稿2017/01/05 09:46
総合スコア3579
0
ベストアンサー
レジスタやメモリ上のワードが、他のメモリ上のアドレス(=番地)を保持している場合に、そのアドレスへのポインタと呼びます。
一般的に、CPUにはスタックポインタという特殊なレジスタがあり、このレジスタの値はスタックと呼ばれるメモリ領域の、とあるアドレスを指しています。
スタックというメモリ領域は積み木を積み上げるように使うことからそう呼ばれています。スタックに積み木(データ)を積むことを Push するといい、積み木(データ)を一つ取り除くことを Pop するといいます。実際には、メモリ領域は積み木ではないので、Push はスタックポインタの指している領域にデータをしまい、スタックポインタをデクリメントする(スタックポインタはいまデータをしまったメモリの1個前のワードを指す)ことで実現されます。Pop はスタックポインタをインクリメントすることで実現されます。
Push register 0 onto the stack
「スタックにレジスタの0番の内容をプッシュしなさい」と言っているので、レジスタ0番の値をスタックポインタが指しているメモリ領域に格納し、スタックポインタをデクリメントします。たとえば、
0番レジスタの値:1010
スタックポインタの値: 2000
の状態で、「スタックにレジスタの0番の内容をプッシュ」すると、
0番レジスタの値:1010
2000番地の値:1010
スタックポインタの値: 1999
というように変化します。
Call a procedure at 5120, stacking the return address
「戻り番地をスタックに積んで、5120番地の手続き(サブルーチン)をよびだしなさい」となっているので、現在の命令の次の命令のアドレスをスタックに Push して 5120 番地にジャンプします。 Push したアドレスは、あとでサブルーチンから戻るときに戻り先の番地として利用されます。たとえば、
プログラムカウンタの値:4000
スタックポインタの値: 1999
の状態で、「戻り番地をスタックに積んで、5120番地の手続き(サブルーチン)を呼び出す」と、
プログラムカウンタの値:5120
1999番地の値:4001
スタックポインタの値: 1998
というように変化します。
長くなりましたが、いかがでしょうか?
ただし、上記で、スタックポインタのデクリメント、インクリメントは1ずつ進退していますが、実際のCPUでは、番地はバイト単位、語は4バイト単位だったりしますので、スタックポインタのデクリメント、インクリメントは4ずつ進退したりします。
"the page reference string"
これについて、どのような形式のものが求められているかわかっていますか?ページ番号をカンマで区切ったようなものでしょうか?であれば、
Load word 6144 into register 0
1020番地の命令へのアクセス: → ページ番号:1
6144番地のデータへのアクセス: → ページ番号:12
Push register 0 onto the stack
1024番地の命令へのアクセス: → ページ番号:2
8192番地のスタックへのアクセス: → ページ番号:16
Call a procedure at 5120, stacking the return address
1028番地の命令へのアクセス: → ページ番号:2
8188番地のスタックへのアクセス: → ページ番号:15
5120番地の命令へのアクセス: → ページ番号:10
みたいな感じで進めていって、(すみません、めんどくさすぎるー)
1,12,2,16,2,15,10 ....
という文字列を作ればいいのではないでしょうか?
投稿2017/01/05 09:05
編集2017/01/05 10:18総合スコア3401
0
投稿2017/01/05 08:46
編集2017/01/05 08:51総合スコア16731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。