質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

3回答

1533閲覧

解決済み

wakataka

総合スコア13

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2017/01/05 08:34

編集2017/02/06 03:47

以下の英語での動作をするようなプログラムを作れと言われてるんですが、ポインタとスタックの意味がよくわかりません。よければ教えてほしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2017/01/05 10:35

アーキテクチャを明記ください。
wakataka

2017/01/05 10:52

大変申し訳ございません。今回は解決したので、次回以降は気をつけて明記します。
guest

回答3

0

mit0223さんの詳しい解説で終わったと思ってましたが、コメントの英文を機械翻訳すると、

以下は、512バイトページを持つコンピュータのプログラムフラグメントの実行トレースです。プログラムはアドレス1020に配置され、スタックポインタは8192になります(スタックは0に向かって増加します)。このプログラムによって生成されたページ参照文字列を与えます。各命令は、即値の定数を含む4バイト(1ワード)を占有します。命令とデータの両方の参照は、参照文字列に含まれます。」

となって、単なる説明にしか過ぎず、要求とか質問とかが含まれてませんね。

最初の問題文の英文を機械翻訳すると、

レジスタ0にワード6144をロードする

レジスタ0をスタックにプッシュする
5120でプロシージャをコールし、戻りアドレスをスタックする
スタックポインタから即値定数16を減算する
実際のパラメータと即値定数4を比較する
5152に等しい場合にジャンプする

なので、プログラムの説明と思われるので、この通りプログラムすれば良い様に思われますが・・・。

できれば、英文の全文を質問の編集で載せた方が良いように思います。
(もしかしたらteratail向きの内容ではないかもしれないので)

投稿2017/01/05 09:46

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakataka

2017/01/05 10:53

わざわざありがとうございました。
guest

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
mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakataka

2017/02/06 03:47 編集

ありがとうございます!!ちなみに,こんな感じで問われているんですけど,これはプログラムを書けばいいのでしょうか、それとも処理の内容を説明すればいいのでしょうか。
wakataka

2017/01/05 10:54

色々と教えていただきありがとうございました。おかげさまで解決しました。質問の仕方にも以後気をつけます。
guest

0

スタック / Wikipedia
コールスタック / Wikipedia

pushでデータを保存、popで取り出す。
データの保存場所がスタック、保存する場所を示すのがポインタ。

call/retは、push/pop+ジャンプです。
callで戻る場所(現在地)を保存してジャンプ、retで戻る場所を取り出してジャンプ。

投稿2017/01/05 08:46

編集2017/01/05 08:51
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問