• ベストアンサー

アセンブラ > アドレッシングモード

アセンブラの資料など見ていますと、アドレッシングモードがいくつか用意されているのをよく見ます。 ただ、なぜ色々なアドレッシングモードがあるかの理由がはっきりしません。 アドレッシングモードがいくつもある利点とは何でしょうか。 適切なアドレッシングモードを利用することにより、処理クロック数を短縮できるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

レジスタ操作やロードが減るので処理クロックの節約=高速化が期待できます。 いまどきのCPUだと高級言語で必要とされるアドレッシングモードを持っているのが多いと思います。

flex1101
質問者

お礼

回答ありがとうございます。 レジスタ操作やロードが減るという利点により処理クロックが節約できるのですね。 勉強になりました。

その他の回答 (2)

回答No.3

アドレッシングモードというのは、高級言語ではあまり表に出てこないだけです。 たとえば、高級言語で、 i = 3; と書けば、たいていは、「変数 i として割り当てられているメモリに、3 という数値を代入する」という意味です。 ところが、 i = j; は、「変数 i として割り当てられているメモリに、変数 j が割り当てられているメモリにある数値を代入する」であって、「j が割り当てられているメモリの番地を代入する」という意味ではありません。 前者では、右辺の値(ここでは3)が直接取り扱われていますが、後者では、j(番地)の「中身」が取り扱われています。 また、配列へのアクセスを i = j[3]; と書けば、取り扱う値は、「j が割り当てられているメモリから数えて、3つ後のメモリに入っている値」ですし、 i = j[x]; と書けば、「jが割り当てられているメモリから数えて、x の中身の値のぶんだけ後ろのメモリに入っている値」です。 ※この場合、「後ろのメモリ」をカウントするには、取り扱っているデータ型のサイズを考慮したもの。 このように、高級言語では、見かけは同じ「代入」でも、何を代入するか(そして、本当は、「どこに代入するか」)が様々です。 もちろん、これは、必要性があって、存在している考え方ですが、アセンブラレベルで、これを区別するのが、アドレッシングモードになります。 ※ここでは、データアクセスだけを取り扱ってますが。 さらに言えば、配列のアクセスなどは、それをひとつのアドレッシングモードとして扱うか、単純なアドレッシングモードを組み合わせて実現するかと、そういう設計思想の違いもあったりしますが、上記のようなデータの区別を、アセンブラレベルで扱うものが、アドレッシングモードということになります。

flex1101
質問者

お礼

回答ありがとうございます。 i=3; i=j; i=j[3]; などで内部的に処理が色々変わるのですね。 勉強になりました。 設計思想によっても組み合わせが異なるというのも参考になりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そもそも, プロセッサによって「何を『アドレッシングモード』として区別するか」が異なります. とはいえアドレッシングモードが 1つしかないとメモリアクセスも不可能に近いからねぇ.... ・種類が少ないと構造が簡単になる ・種類が多いとプログラムでの使い勝手がよくなる というトレードオフ (と「互換性」という名前の縛り) によって決まってくる, というところじゃないかな.

flex1101
質問者

お礼

回答ありがとうございます。 トレードオフによって、数多くのアドレッシングモードがあるものと種類が少ないアドレッシングモードのものがあるのですね。

関連するQ&A

  • アセンブラの機能について

    今、アセンブラの勉強をしているのですがある書籍の説明文において 「ハードウェアすなわちコンピュータが用意している機能を原理的にはすべて使用してプログラムを作成できる。」 ということや、 「C言語などの高級言語には存在しない、ハードウェアに予め用意されている機能を利用してのプログラム製作が可能」 という記述があったのですが、具体的にアセンブラには高級言語には存在しないどのような機能が内臓されているのでしょうか? 私は多少C言語およびJavaの経験があるのですが、是非ともアセンブラとの比較を勉強したいと思い、この疑問が浮かび上がりました。 分かる方、よろしくお願いいたします。

  • アセンブラに関する質問

    アセンブラに関する質問 現在アセンブラの勉強をしている者ですが2つ質問があります (1)以下のサイトの分岐とジャンプ命令の説明にPC+4という記述があるのですがこれはメモリアドレスを指しているのですか?そうだとしたら、4というのはデータ語長が4バイトだとだからという意味だと思うのですがPCというのは何なんでしょうか? R3000 URI:http://ja.wikipedia.org/wiki/R3000#.E5.91.BD.E4.BB.A4.E3.82.BB.E3.83.83.E3.83.88.E3.81.AE.E6.A6.82.E8.A6.81 (2)レジスタr1がレジスタr2の値より小さいとき処理Aと処理Bをさせる方法はどうしたらいいでしょうか?自分が思うに addi r2, r2, 100 ?←ループの始まりを知らせる命令を用意する 処理A 処理B addi r1, r1, 1 ble r1, r2, ?←ループの始まりに行く値をセットする という命令を書けばいいと思うのですが?の部分の書き方が分かりません。 使用できる無条件、条件分岐命令は以下のものが指定されています。 無条件分岐:j, jr, jal 条件分岐:beq, bne, blt, ble

  • PICアセンブラ言語で、TMR0で1秒をカウントさせ割込みさせたいのですが

    現在、一定時間に車の車速信号をカウントして、その一定時間が経てばカウントをストップして、そのカウント数に対応するLEDを点灯させるというものを作ろうとしています。 一定時間というのは1秒にしたいのですが、色んな方のサイトを調べてみたらTMR0機能の内部クロックを使用してカウント出来るのは20msとかばかりで、1秒という長い時間をカウントされている資料が見つかりません。 どなたかやり方を教えてもらえないでしょうか。 手持ちのPICは16F873Aで、水晶は10MHzです。 宜しくお願い致します。

  • C言語によるウェイト

    C言語による正確な時間を定めたウェイト(例えば100msのウェイト)の挿入方法を探しています。 C言語でのウェイトの挿入方法を調べたところ、for文等で挿入できるのはわかったのですが、時間の求め方までわかりませんでした。 時間の求め方で調べたところ、アセンブラなら命令のステート数とクロック周波数より求める方法を知りました。 ですがアセンブラでの方法ではなく、C言語での時間の計算方法を覚えたいと思います。 些細な事でもかまいませんので、ご回答頂ければと思います。 どうぞ宜しくお願いします。

  • 処理時間の計算 PICアセンブラ

    あるプログラムで、TIMERというサブルーチンを作りました。適当に数値を変えてうまく行った値を採用したのですが、実際に処理時間が何秒かかるのかが分りません。 TIMER MOVLW 0x40 ;この40が採用した値です MOVWF WC1 LOOPT DECFSZ WC2,F ;WC2はあらかじめCLRされてます GOTO LOOPT DECFSZ WC1,F RETURN 見難くてすいません(TIMER、LOOPTがラベルです) 使用ハードはPIC16F84Aでクロック周波数は20[MHz]です。 たしか通常は一つの命令にクロック4周期分だった気がするので、最初の二行で8/20M[s]なのは分るんですが、LOOPTのDECFSZとかは4周期分じゃなかったような気がして、混乱してしまいました・・・。 知りたいのはRETURNで戻るまで(メインルーチンに戻るまで)です。 わかる方ご教示願います。

  • ニーモニックから機械語へ変換する簡易アセンブラ

    ニーモニックから機械語へ変換する簡易アセンブラ 初期のアセンブラにおいて、ニーモニックから機械語への変換はどのようなアルゴリズムで行われていたか知りたいのですが、H8マイコンなどで実際にコードを書いたウェブサイトなどはありますでしょうか? またイメージとしては、メモリに格納された文字コードを1バイトずつ命令変換テーブルと比較し、同じ場合はそのオペコードを出力するといったようなアルゴリズムになると思うのですが、これは正しいでしょうか? 例えば具体的に「MOV A B(BレジスタからAレジスタへの転送命令)」を機械語へ変換する処理を考えると、下記のようになると思います。 [命令変換テーブル] OPコード(1バイト) 文字列長(1バイト) 文字コード : 文字コード を命令数分用意する。 (1)ニーモニックの左端から1文字(1バイト)ずつ、まず命令変換テーブルの最初の命令の文字コードと比較が行われる (2)空白まで全ての文字コードが一致すれば、一致した命令変換テーブルのOPコードを得る (3)一致しない場合は、命令テーブルの次の命令の文字コードと比較していく((1)にループする) (4)命令テーブルの最後まで一致するものがなければエラー 高級言語ではこのような処理はブラックボックスになっていると思いますが、アセンブラレベルでどのように実現されているか解説が見当たらなかっため質問させて頂きました。どうぞよろしくお願い致します。

  • アセンブラのCAP-X COMP-X

    アセンブラのCAP-X COMP-X  いつも回答いただきありがとうございます。 アセンブラのCAP-X COMP-Xと言っても、知っている人は、少ないのでは無いでしょうか?  アセンブラのプログラムを組む機会自体が、減少していると思えるのです。  私が、最初に情報処理試験で触れたのは、このアセンブラと仮想のコンピュータでした。いつか、征服したいテーマでした。  でも、今でも、アセンブラと仮想機械では、もっとも、シンプルで、アセンブラの言語と原理を知るには、もっともふさわしいのでは、無いかと考えているのです。  その後も、アセンブラと仮想の機械は、進展しましたが、知らない者には、いよいよ理解しがたく、近づくことが、できないので、この CAP-X COMP-Xを  まず、理解したいと考えているのです。、  アセンブラを理解できる人には、なじみの無いアセンブラと仮想機械と思いますが、現在知っているアセンブラから、類推して回答していただけるとありがたいです。  今は、Windowsの時代になってCAP-X COMP-Xをシュミレーションできるソフトも無くなりました。頭の中で仮想するばかりです。  一語16ビットの計算機であって、0を含めて256の整数倍の番地から始まる連続した256語を1記録ブロックとして、最少1記憶ブロックから最大256記憶ブロックを実装することができる。N個の記憶ブロックを使用するとき、アクセスできるアドレスは、 0番地から(256*N-1)番地までである。  Nが、256の時、 256*256-1=65536 となって65Kのアドレス空間を持つことになる。 ●Q01. このメモリーの中で、コードとテータの両者を使っていると解釈してもよいのだろうか? ●Q02. もし、メモリーのアドレス空間をコードとデータの両者を混合して使用していると誤ってプログラムしてしまうとコードをデータとして読み込んだり、コードのアドレスに誤って、データを書いてしまい、これが、原因で、コンピューターが、暴走したりする危険性は、あるのでしょうか? ●Q03. この仮想の機械には、OSのような領域は、存在しないのでしょうか? ●Q04. 必要ないのでしょうか?  OSが、必要であるのなら、65Kの全ての領域は、使用できなくなると考えることができるのでしょうか? ●Q05. アセンブラの記号を作って、実行するようにしています。しかし、アセンブラを機械語にアセンブルして、メモリーにロードする必要があるように感じますが、この機械では、 アセンブラを機械語に翻訳するソフトは、どのようにして利用されるのでしょうか? ●Q06. 最初にアセンブラ言語を機械語に変換するアセンブリ言語をメモリーにロードしてから、アセンブラを機械語に変換して、メモリーにロードして、アセンブリ言語をクリアして使用するということになるのでしょうか? ●Q07. これなら、機械語とデータ領域の合計として65Kを使えるということになるのでしょうか?  16ビットの命令語のうちアドレスを指定できるのは、 ADフィールドの アドレスの下位8ビットを指定することになります。  これでは、256通りしか表現できません。  上位8ビットは、 BR(基底レジスターbase register)で定められる。  つまり、BRを変更しないと256通りのアドレスを超えてのアドレスを指定できなくなる。  このBRを変更するのに、 JSR命令(jump to subroutine)が使用される。subroutineに飛ぶのと、記憶ブロックを超えるのとどうして、同じ命令で行われるのか分かりません。 ●Q08. どうしてでしょうか?  昔、ユニバック、マシーンというのがありました。  36ビット、1ワードの機械でした。36ビットの中に命令部分とアドレス部分16ビットの両方を納めなければならないので、アドレス空間には、限度がありました。  16ビットだと限度のアドレス空間は、65Kワードということになります。  これ以上に大きな空間は、アクセスできない。  バイトマシーンのように最初の命令語によって、何バイトでも、アキュームレーターに収納できて大きなアドレス空間にアクセスできるようになっていなかったのです。  大きな容量のプログラムを作るとき、65Kワードでは、収納できない。それで、使用したのは、オーバーレイという手法でした。  プログラムをセグメントに切って、必要に応じて順にプログラムをメモリーに載せ替えるという方法です。しかし、セグメントが大きくなるとこれでは、収まることができないので限度がありました。 ●Q09. オーバレイのやり方は、記憶ブロックのやり方と同様と考えて良いのでしょうか?  初期的な質問で申訳ありません。  また、質問が続くようなことがありましてもよろしく教授方お願いします。 ーーーーーーーーーー CAP-X Computer Application X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 COMP-X の仕様[編集] COMP-X はデータワード長が16ビット、メモリアドレス長も16ビットのコンピュータである。アドレスはバイト単位ではなくワード単位に付与される。ワード中のビットの番号付けは、最上位ビットを 0 番、最下位ビットを 15 番とする。バイト単位の処理という概念がないため、エンディアンも規定されていない。また、COMP-X には入出力の概念が規定されておらず、何らかの手段でメモリ上にプログラムとデータを格納し、実行し、その結果はメモリを読み取ることでわかるようになっている。従って、入出力命令は存在しない。扱う数は整数のみで、2の補数表現を採用している。 レジスタは次の通り。 ーーーーーーーー COMP-X Compuer X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 命令語は全て 1 ワードであり、先頭から順に OP フィールド(4ビット)、GR フィールド(2ビット)、XR フィールド(2ビット)、AD フィールド(8ビット)で構成される。OP フィールドは命令の種類を表すコード(オペコード)であり、COMP-X には 12 種類の命令しかない。GR フィールドでは演算で使用する GR の番号が指定される。また、JC命令では分岐条件の指定に使われる。XR フィールドではアドレス修飾を行う GR の番号が指定され、内容が 0 の場合は GR0 を意味するのではなく、GR によるアドレス修飾をしない。AD フィールドはアドレスの下位8ビットを指定する。 実効アドレスとは命令で使用するメモリアドレスであり、上位8ビットは BR で、下位8ビットは AD フィールドで指定される。XR フィールドが 0 以外の場合、指定された GR の下位8ビットと AD フィールドの値を加算し、結果の下位8ビットを実効アドレスの下位8ビットとする。

  • アセンブラでのフロッピーディスク読み込み処理について

    アセンブラでのフロッピーディスク読み込み処理について IPLに興味を持ちCygwinのgas(ver2.19.51)とQEMUで開発を行っています。 フロッピーディスク読み込み処理で、以下の現象がおきて困っています。 esレジスタには0x0100を設定済み、bxレジスタに0x0e00を設定した状態で フロッピーディスクの1セクタ(0x200バイト)を呼び出すと、処理が終わった後のレジスタの 中身がおかしくなり、以降の処理ができなくなってしまいます。 本来ならbxレジスタは0x1000になるのが正しいと思うのですが、 添付図のようになってしまいます。(esレジスタ、csレジスタなども値がおかしい) 桁上がりがうまくいってないのかなと思うのですが、その原因が全くわかりません どなたかお分かりになる方よろしくお願いします。 ちなみに、 bxレジスタに0x0c00を設定 ⇒ 処理後0x0e00 となり問題なし bxレジスタに0x1e00を設定 ⇒ 処理後0x2000 となり問題なし(ちゃんと桁上りしている) 処理は問題ありませんでした。(ワケがわかりません) --------------------------------------------------- read_fd : #処理内容 読み出し movb $0x02, %ah #開始セクタ番号 movb $3, %cl #連続して処理するセクタ数 movb $1, %al #シリンダ番号(トラック番号) movb $0, %ch #ヘッド番号 movb $0, %dh #ドライブ番号 movb $0, %dl #フロッピーディスクから読み出したセクタの #メモリ書き込みアドレス[es:bx] esには0x0100設定済み movw $0xXXX, %bx ←ここのアドレス設定が問題! int $0x13 ret

  • マイコンの1サイクルの処理時間について

    周波数8MHzののマイコンで、1命令(1サイクル)の処理時間を計算しています。 某サイトで、以下のような計算式があったのですが、×4している理由が分かりません。 1サイクル実行時間=4/クロック発振子の周波数 1サイクルの実行時間にはかならず4クロック要するのでしょうか? 素人質問で申し訳ありません。

  • percent-of-clock とは?

    日本語ではパーセントクロックと言いますか? その定義はなんでしょうか? 仕様のクロック周波数(100%として)からのずれのことかと想像しますが。これを人為的に上げるとパフォーマンスが上がりますか? どこかのサイトに関連資料がありますでしょうか。

専門家に質問してみよう