質問: 以下の英語での動作をするようなプログラムを作れと言われてるんですが、ポインタとスタックの意味がよくわかりません。よければ教えてほしいです。
回答: レジスタやメモリ上のワードが、他のメモリ上のアドレス(=番地)を保持している場合に、そのアドレスへの**ポインタと呼びます**。 一般的に、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 .... という文字列を作ればいいのではないでしょうか?