• ベストアンサー

マイクロコンピュータのプログラムについて

TK-85にプログラムを入力する実験を先日やったんですけど、そこで直接番地指定と間接番地指定(メモリ番地をHLレジスタで指定する)の2つの方法をしました。この2つの方法の長所と短所をそれぞれ教えて欲しいです。 あとプログラムを短くしたり、実行速度を早くしたりする方法があればぜひ教えて欲しいです。

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

  • ベストアンサー
  • FantomX8
  • ベストアンサー率11% (82/740)
回答No.1

直接番地指定だと、そのまま実行したいメモリ番地に行くので実行速度が速くなるはず。 ただ、そのメモリ番地へ多くのプログラムコードが実行させようとする場合にいちいち番地を都度入力しないといけない。 間接番地指定だとレジスタにメモリ番地を記憶させておけば、少ないプログラムコードで変数をしていしてあげれば入力の手間が省けたり、多くのプログラムコードで読み出したりする際に楽。 プログラムの行数は短くなるが、直接指定よりも実行速度が落ちる。 ただ、ここ最近はハードの性能が著しい進歩で早くなってるので上記のデメリットはほとんどないような状況ですからね。

関連するQ&A

  • C++でメモリの絶対番地を指定する方法はありますか。

    C++でメモリの絶対番地を指定する方法はありますか。 あるプログラムでメモリの指定した番地にデータを書き込み、別のプログラムで同じ番地のデータを読み込めるようにしたいと思ってます。プログラムは作ったのですが、絶対番地を指定していないようで、別のプログラム側で同じ番地を指定しても同じデータが読み込めません。

  • 正しく書けていますか?

    私が書いた(1)から(12)までの文章は、正しく書けているでしょうか?詳しい皆さんのご意見をいただきたいです。どこか誤った部分があれば、教えていただきたいです。 (1)次のプログラムを実行すると、8200H番地に40Hが格納される。 ORG 8000H LD HL,8200H LD A,08H LD B,A ADD A,A ADD A,A ADD A,B LD (HL),A HALT (2)次のプログラムを実行すると、8200H番地に55Hが格納される。 ORG 8000H LD HL,8200H LD A,AAH CPL LD (HL),A HALT (3)HLレジスタで示されるメモリ番地の内容をCレジスタに転送する命令は以下のとおりである。 LD C,HL (4)サインフラグは、ある命令を実行した結果、Aレジスタ等が負であれば1に、正であれば0に設定される。 (5)以下のプログラムを実行すると8A00Hには0AHが格納される。 ORG 8000H LD A,0D LD B,10D LOOP; ADD A,B DJNZ LOOP LD(TOTAL),A JP $ ORG 8A00H TOTAL;DEFB 0 END (6)CP/Mは6800や68000などをCPUにもつマイコンのためのD0Sである。 (7)16BIT算術演算グループではレジスタペアとしてBC,DE,HLがある。 (8)次のプログラムを実行すると、8200H番地にOFHが格納される。 ORG 8000H LD HL,8200H LD A,05H LD B,A SLA A ADD A,B LD (HL),A HALT (9)オペコードとは、命令の操作を表すコードをいう。 (10)以下のプログラムにおいて、8005Hにデータは08Hである。 ORG 8000H TABLD1;DEFB 1 DEFB 2 DEFB 0FEH DEFB4 TABLE2;DEFW 0506H TABLE3;DEFFW 8 END (11)サブルーチン内で演算などにレジスタを使用する場合、あらかじめレジスタ内のデータをPUSH命令などで退避する必要がある。 (12)ソフトウエアー上で無視できる割り込み要求と要求を無視できない割り込み要求を総称してノンマスカブルインタラプト(NMI)という

  • 一般的なプログラムの作り方

    こんにちは。 あるプログラムをVC++にて作成しようとしています。 このプログラムは、入力ファイルからテキストを読み込み、編集してから、出力ファイルを生成するというものです。出力ファイルは新規の場合と、上書きの場合があります。 そこで質問なのですが、プログラムの作り方として、以下のパターンが考えられるのですが、どちらが一般的なのでしょうか。 【パターン1】 入力ファイルからのテキスト読み込み、編集及び出力ファイルの生成を同時に行う。 ・長所として考えられる点 メモリ内で持つデータが一時的な領域なため、構造がシンプルでメモリ使用量も少ない。 ・短所として考えられる点 処理の開始から終了まで、出力ファイルを開いたままにするため、他から出力ファイルを編集できない時間が長くなる。 【パターン2】 入力ファイルからのテキスト読み込み、編集が全て完了してから、一括で出力ファイルへ書込む。 ・長所として考えられる点 出力ファイルへアクセスする時間が短くてすむ。 ・短所として考えられる点 メモリ内で全て編集するため、メモリ使用量が増大かつ構造が複雑になる。 以上です。アドバイスなどありましたら、よろしくお願いいたします。 【環境】 Windows XP Professional 入力ファイルのデータ量:10MB程度 出力ファイルのデータ量:1MB程度

  • インデックスアドレス指定方式とベースアドレス指定方式の違い

    アドレス指定方式(アドレシング)についての質問です。 タイトルの通り、インデックスアドレス指定方式とベースアドレス指定方式の違いを教えていただきたいです。 参考書などでは、 ●インデックスアドレス指定方式 ・命令の番地部とインデックスレジスタの値を加算した値を有効アドレスとする ・インデックスレジスタの内容を変えるだけで別なアドレスの内容が参照できる ●ベースアドレス指定方式 ・命令の番地部が指定するアドレスに、ベースレジスタの内容を加算した値を有効アドレスとする ・ベースレジスタの値を変えるだけでプログラムが主記憶装置のどこからでも実行できる(再配置可能) となっています。 有効アドレス=番地部のアドレス+レジスタの値 となるのが同じで、基準となる値がインデックスアドレス指定方式のほうでは命令の番地部であり、ベースアドレス指定方式のほうはベースレジスタの値、ということまではわかったのですが、この「基準」が違うことでどういう違いがあるのか、具体的にどういう場合にどちらの方式が使われるのかがわかりません。 ベースアドレス指定方式の「再配置可能」という部分もどういう仕組みなのか、よくわからないです。 ご回答、よろしくお願いいたします。

  • 大人の科学マガジンVol.24 GMC-4について

    お世話になります。TK-80世代なので懐かしさのあまり、思わず買ってしまいました。 さて、当該雑誌の付録である4ビットマイコンのプログラムについて教えてください。 テキスト(?)の53ページ「タイマー」なのですが、これはサンプルとして内蔵されているソフトですが、これを1から作ろうとチャレンジしているのですが、どうしてもわからないことがあります。 それは、最初にタイマーセットということで00番地から02番地に、最初にデータを入力するというものですが、GMC-4の命令郡にはデータメモリのリード&ライト命令はあるものの、プログラムメモリ番地の内容を直接読む命令が見当たりません。 最初に50~52番地へデータを書き込むのなら話はわかるのですが、一体プログラムはどうなっているのでしょう?

  • 命令

    lw r1,0(r4) 上記のような命令を実行したとします。レジスタ群r4には32ビット00000000000000000000000000100100が入っています。これは10進数にすると36なので0(r4)=0+36=36になります。 そしてメインメモリのアドレス36番地には10000001111111111111111111111111が入っていてこれをレジスタ群r1に移動します。 けれどもレジスタ群r1には00000000000000000000000000011000が最初から入っています。 ここで質問なんですがこの場合アドレス36番地の値と最初から入っていたレジスタ群r1の値は足さなければならないのですか? それともアドレス36番地の値をそのままレジスタ群r1につっこんでもいいのでしょうか?

  • プログラムについて

    プログラムを勉強していてわからないことが3つあります。 1ソースプログラムを編集し、次にコンパイルしてオブジェクト プログラムを作成し、さらに関数を引用した場合などには他の オブジェクトプログラムと結合し、最終的に実行形式の プログラムを得て実行します。 と教科書に書いてあるのですが、関数を引用した場合などには他のオブジェクトプログラムと結合するとはどういうことですか? 2メモリを多く費やせば処理は速くなり、処理速度を犠牲にすればメモリを節約できるとありますがなぜこうなるのですか? メモリを節約するとどんなメリットがありますか? 3プログラムの高速化では 必要な演算回数を少なくする。無駄な繰り返しを省く。 速い演算を多くし、遅い演算を少なくする。 とあるのですが具体的にどういうことですか? プログラム初心者です。 わかりやすく教えていただければ幸いです。 どうぞよろしくお願いいたします。

  • 実行中のプログラムについて

     こんにちわ。 どうしても分からない事がありまして、投稿しました。 私の使用しているPCはNECのノートPCで、OSはWindows XP SP2です。 私はPCにパスワードを設定していて、電源を入れてもパスワードを入力しないとWindowsが起動しないようになっています。 それで最近気が付いたのですが、電源を入れてパスワードを入力する画面が表示された時に「7個のプログラムを実行しています」と表示されます。 何のプログラムが実行されているのか気になって、「7個のプログラムを実行しています」をクリックして見たら 「実行しているプログラムが多すぎるためにコンピュータの処理速度が、通常より遅い場合はプログラムをいくつか終了して下さい」と表示されました。 実行されているプログラムの内2個は分かるのですが「多分、ウイルスバスター2007と日記帳」残り5個がどうしても分からないのです。 実行されている残り5個のプログラムを見つける方法を教えてください、よろしくお願い致します。

  • OSはどのようにして、CPUにメモリ上の物理アドレスを伝えるのか?

    一般的なシステムにおいて、プログラムを実行するには、コンパイラが再配置可能なオブジェクトファイルにして、そのオブジェクトファイルをローダがメモリ上にローディングして、CPUによって実行が行われると認識しています。 では、実際にCPUにより実行される時に、どのようにしてCPUは、ローディングされている物理アドレスを知ることが出来るのですか?一番初めにOSがどのようにCPUに先頭番地を伝えているのかが見当がつきません。例えば、486では、セグメントレジスタの値とオフセットアドレスを加算したアドレスを基にメモリとやり取りしていますが、OSがこのセグメントレジスタに先頭アドレスをどのように格納しているのかを教えてください。お願いします。

  • プログラムのトレース

    アスタリスクというlinuxで動作するpbxのオープンソースのC言語のソフトがあります。 アスタリスクを立ち上げたとき、関数がどういう順序で呼び出されているかを調べる必要があります。 そこで、http://www.geekpage.jp/blog/?id=2007/1/17を参考にgdbでアタッチしてみましたが、一部 しか表示されないのででうまくいきませんでした。(全関数の呼び出しを表示するにはメモリ・レジスタが不足と出ました) 実行中の複数のモジュールが絡み合うプログラムの関数の呼び出され方を調べるのに、なにか良い方法がありましたら教えて下さい。

専門家に質問してみよう