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

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

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

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

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Q&A

解決済

1回答

1273閲覧

[nand2tetris] アセンブリプログラムのラベルシンボルが理解できない

退会済みユーザー

退会済みユーザー

総合スコア0

アセンブリ言語

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

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

0グッド

0クリップ

投稿2020/04/11 08:28

編集2020/04/11 10:05

コンピュータシステムの理論と実装を学習中です。
アセンブラの実装でL命令の扱いのイメージが持てないので質問させていただきます。
テキスト中で、ラベルシンボルの説明として
「(Xxx)という疑似コマンドはXxxというシンボルを定義する。これは疑似コマンドの次のコマンドの次のコマンドの位置を参照する。」とあります。
以下サンプルコードです。

asm

1// Computes R2 = max(R0, R1) (R0,R1,R2 refer to RAM[0],RAM[1],RAM[2]) 2 300 @R0 401 D=M // D = first number 502 @R1 603 D=D-M // D = first number - second number 704 @OUTPUT_FIRST 805 D;JGT // if D>0 (first is greater) goto output_first 906 @R1 1007 D=M // D = second number 1108 @OUTPUT_D 1209 0;JMP // goto output_d 1310 (OUTPUT_FIRST) 1411 @R0 1512 D=M // D = first number 1613 (OUTPUT_D) 1714 @R2 1815 M=D // M[2] = D (greatest number) 1916 (INFINITE_LOOP) 2017 @INFINITE_LOOP 2118 0;JMP // infinite loop 22

例えば、@R0のR0のようなシンボルは物理アドレスを表していますが(間違っていたらごめんなさい)、これに対して(OUTPUT_FIRST)のような疑似コマンドは一体何を表していいるのでしょうか?
テキスト中の説明に従うと、OUTPUT_FIRSTというシンボルが参照しているものは、そのコマンドである@R0の位置ということになります。
この位置という言葉の曖昧さが理解の障壁となっています。質問内容をうまく言語化することができませんが、くっきりとしたイメージのつく説明があれば是非ご教授ください。宜しくお願いします。

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

OUTPUT_FIRST というのはアドレス値を表します。
そのアセンブリコード(キカイ語)がどこに配置されるかはわかりませんが、その位置のメモリアドレス値を示します
そして、@OUTPUT_FIRST とすると、そのメモリアドレス値に格納されたデータ値を表します

さて、ここで重要なのは、OUTPUT_FIRSTの値がどんな値でも気にする必要はない、ってことです。
こいつがどーゆー値であろーが関係なく、そのナカミのデータが意味を持ちます

で、R0とかR1とかはレジスタを表してます
その中に数値を入れることができる入れ物、と理解しましょう。

#って説明があなたの求めるものかな?w


04 @OUTPUT_FIRST

05 D;JGT // if D>0 (first is greater) goto output_first

こういうコードであるなら、(おそらく)OUTPUT_FIRSTへのジャンプ命令ですね
(OUTPUT_FIRST)が記述されている位置の命令へジャンプするってことですね

#よくみるとこのコードにでているラベルは全部ジャンプ先指定ですね
#って、現実のCPUのコードではないため、おそらく、ということになります

投稿2020/04/11 08:46

編集2020/04/11 09:18
y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2020/04/11 10:10 編集

もう一歩進んで質問させていただきたく思います。 では、@OUTPUT_FIRSTがさすレジスタに格納されているデータ値が表すものは一体何なのでしょうか? これこそが一番聞きたかったことで、言語化していただいたことではっきりしました。 OUTPUT_FIRSTの指すレジスタに格納されているものは,「R0のアドレスが格納されたレジスタ」のアドレスという理解であっていますか?
y_waiwai

2020/04/11 09:19

追記しました
y_waiwai

2020/04/11 09:20

@R0 って命令は レジスタR0のデータをMに格納する、ってことですか
退会済みユーザー

退会済みユーザー

2020/04/11 10:09

図にしてまとめると理解が進みました。 位置とはつまり、命令メモリ上のアドレスであり、これはまさにプログラムカウンタの保持する値であると理解しました。
y_waiwai

2020/04/11 10:19

そゆことですね。 ジャンプ命令ってのはプログラムカウンタ(という名前のレジスタ)へのロード命令だったり んで、今存在する一般的なCPUってのは、命令メモリとデータメモリは同じ空間を共用できるようになってます
退会済みユーザー

退会済みユーザー

2020/04/11 10:24 編集

ハードウェアアーキテクチャの勉強をしているのに、視点が別な方向にいってましたね。 勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問