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

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

ただいまの
回答率

90.62%

  • アセンブリ言語

    105questions

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

解決済み

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 561

wakataka

score 5

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2017/01/05 19:35

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

    キャンセル

  • wakataka

    2017/01/05 19:52

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

    キャンセル

  • 退会済みユーザー

    2017/02/06 14:16

    他のユーザから「意図的に内容が抹消された質問」という指摘を受けました
    解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
    投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
    「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

回答 3

checkベストアンサー

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 18:29 編集

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

    キャンセル

  • 2017/01/05 19:54

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

    キャンセル

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/05 19:53

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • アセンブリ言語

    105questions

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

閲覧数の多いアセンブリ言語の質問