マイクロプロセッサZ80の最適化方法とは?

このQ&Aのポイント
  • マイクロプロセッサZ80に関する課題として、アセンブラプログラムの最適化があります。
  • 具体的な課題として、命令数の削減をする必要があります。
  • 最適化を行うためには、プログラムコードを見直し、冗長な命令を省略するなどの方法を取ることが重要です。
回答を見る
  • ベストアンサー

マイクロプロセッサのZ80について学校で課題がでたのですが、

マイクロプロセッサのZ80について学校で課題がでたのですが、 5100H番地に50H、5101H番地に10Hをキー入力であらかじめ書き込む。 4200H番地に以下のプログラムを書く。   (1)5100H番地、5101H番地の内容をそれぞれB、Cレジスタに取り込んだ。   (2)AレジスタにBレジスタの内容を転送し、AレジスタとCレジスタを加算し、その結果を5200H番地に格納した。   (3)AレジスタにBレジスタの内容を転送し、AレジスタからCレジスタを減算し、その結果を5201H番地に格納した。   (4)モニタに戻した。  JP  2006H  C30620 アセンブラプログラムーーーーー機械語 (1) LD A , (5100H)ーーーーー 3A0051 LD B , Aーーーーー 47 LD A , (5101H)ーーーーー 3A0151 LD C , A ーーーーー 4F (2)LD A , B ーーーーー 78 ADD A , C ーーーーー 81 LD (5200H) , A ーーーーー 320052 (3)LD A , Bーーーーー 78 SUB A , C ーーーーー 91 LD (5201H) , Aーーーーー 320132 (4)JP 2006H ーーーーー C30620 このプログラムコードの最適化(命令数の削減)を行え。 という課題がでました。どうすればよいかわかりません。どなたかおしえてください。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.1

「命令数の削減」であれば、たぶん1命令しか削減できない。 LD A , (5100H)ーーーーー 3A0051 LD B , Aーーーーー 47 LD A , (5101H)ーーーーー 3A0151 LD C , A ーーーーー 4F ADD A , B ーーーーー 80 LD (5200H) , A ーーーーー 320052 LD A , Bーーーーー 78 SUB A , C ーーーーー 91 LD (5201H) , Aーーーーー 320132 JP 2006H ーーーーー C30620 「バイト数の削減」であれば、他にも手はあるが、逆に命令数が増えてしまい題意に沿わない。

kkeennttaa09
質問者

お礼

こんなに早くお答えいただき、とても感謝しています。ありがとうございました。

その他の回答 (2)

  • 86tarou
  • ベストアンサー率40% (5094/12701)
回答No.3

先ず、5100H番地と5101H番地の和と差を、5200H番地と5201H番地それぞれに格納するということでよろしいでしょうか? 命令数の削減というのがニーモニック行数の削減なのか、マシン語数なのか、それとも所要クロック数なのかで変わってきます。例えば… ld hl,5101h ld a,(hl) dec hl add a,(hl) ld (5200h),a ld a,(hl) inc hl sub a,(hl) ld (5201h),a jp 2006h とすれば、所要クロック数は変わりませんが、行数は1行、マシン語数は3バイト減ります(計算間違いがあればすみません)。なので、何を目的とするかで変わってくるかと思います。単に命令の行数を減らしたいのか、メモリ上の命令の占める割合を減らしたいのか、処理スピードを上げたいのかということです。

kkeennttaa09
質問者

お礼

たぶんニーモニック行数のことだと思います。質問に書いた命令の種類の範囲でニーモニック行数を減らすことは可能ですか?

noname#210617
noname#210617
回答No.2

フローチャートを描いて、その流れを事業仕分けして無駄を省きなさい

関連するQ&A

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

    私が書いた(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)という

  • ワンボードマイコン Z80

    ワンボードマイコンMP-Z80のプログラムを勉強しているのですが、 次の二つの問題がわかりません。 1)8100(H)番地~813F(H)番地に格納されているデータを 8200(H)番地以降にコピーせよ。 2)8100(H)番地から810F(H)番地に格納されているデータを8ビットの 符号付絶対値表現とみなしたとき、各データを2の補数表現に変換し、 8200(H)番地から格納せよ。 1)は LD HL,8100 LD DE,8200 LD A,40H LD BC,A LDI LDIR HALT でいいのでしょうか。2)はまったくわかりません。 お願いします。

  • Z80に関しての宿題なのですが、

    Z80に関しての宿題なのですが、 「コール命令を使った電子オルガン」 キーを入力したら対応する音が鳴るようにプログラミングする。(入力を 常に監視し、FFHでなかったらサウンド出力をする。)プログラムは4400H番地から書く。  キー入力:CALL 2018Hと呼ぶとAレジスタに押されたキーの内容が入ってくる。 押されないとFFHが入っている。(いずれかのキーが押されるとAレジスタには00Hから17Hまでの対応する値が格納される。)  サウンド出力:Aレジスタに00Hから17Hを入力してCALL 201BHと呼ぶと対応する音が鳴る。    (1)キー入力を行った.Aレジスタにキーの内容が入る。    (2)AレジスタがFFHの場合は(1)に戻る。そうでないときは(3)へ行く。    (3)Aレジスタの内容により、サウンド出力を行った。    (4)(1)に戻る。      ニーモニック                        CALL , 2018H SUB FFH JP Z , (4400H) ・・・・(ゼロフラグZが1の時、4400番地にジャンプする。) ADD FFH CALL , 201BH JP 4400H ↑のようにすればよいのですが、なぜなのかいまいちわかりません。異なるコードで実装せよ。とのことなので理解したいです。おしえてください。

  • MP-Z80(10進数の加算)

    助けてください!全く分かりません MP-Z80で10進数1から10まで加算し、その結果をAレジスタに格納し、A以外のレジスタの内容は保存されるようにするプログラムの作成を教えてください

  • CPU、Z80からステート数から命令時間を求める

    マイコンボードACTーZIIを用いて実験を行ったのですがステート数を用いて命令時間の求め方がわかりません。 CPUはZ-80、クロック周期4MHzを用いて以下のプログラムの実行回数とステート数を求めたのですがあっているのでしょうか? だれか、教えてください。 まちがっていた場合、詳しく説明していただけるとうれしいです。 ラベル ニーモニック  ステート数 実行回数 小計(命令時間) LD A, 0FFH 7 1 7 OUT (00H), A 10 1 10 LD B, 0EH 7 1 7 L1: LD C, 0B1H 7 1 7 L2: DEC C       4 3 12 JP NZ, L2 10 3 30 DEC B       4 3 12 JP NZ, L1 10 10 100 LD A, 00H 4 1 4 OUT (00H), A 10 1 10 LD B, 0EH 4 1 4 L3: LD C, 0B1H 4 1 4 L4: DEC C       4 3 12 JP NZ, L4 10 3 30 DEC B       4 3 12 JP NZ, L3 10 10 100 JP 8000H 10 46 460 合計      119 92 821

  • アドレス指定方式での、命令語が参照する番地

    16進数で”C13B0206”という32ビットの命令語があります。 <命令語の仕様> 0~7ビット:命令指示部 8~10ビット:レジスタ 11~15ビット:アドレス修飾部 16~31ビット:番地 <アドレス修飾と参照番地の関係> 00 0固定 直接アドレス (11,12の値が00、13~15の値が0固定のとき、直接アドレス。) 01 0固定 間接アドレス 10 インデックスレジスタ インデックスレジスタ+番地の値 11 インデックスレジスタ インデックスレジスタ+番地が示す内容の値 <主記憶、レジスタの状態> ●主記憶に格納されている値(16進数) 番地(16進数)が  202,203,204,205,206,208,209,20A...の順に、それぞれの格納値は、 203,204,205,206,208,209,20A,20B...。 ●インデックスレジスタに格納されている値(16進数) インデックスレジスタ番号(16進数)が1,2,3,4,5… の順に、それぞれの格納値は、 0,1,2,3,4…。 (1) アドレス修飾部のインデックスレジスタ番号。 命令語の”C13B0206”で、アドレス修飾部にあたるのが”3B”。00111011(2進数)。8~10ビットの001がレジスタになるから、3。 (2)命令の番地部の番地の値(16進数) 命令の番地部の番地の値。命令部では、”0206”。ちょうど16進数なので、206。 (3) 命令が最終的に参照する番地。 上の、<主記憶、レジスタの状態>より、11~15ビットが”1011”。 インデックス番号が11(2進数)なので、3(16進数)。インデックスレジスタ番号が3のとき、格納されているのは2。番地の値である206と3を合わせ、209。 最終的に参照される番地は209。 (1)(2)(3)、自分の解き方が正しいのかどうか自信がありません。どなたか補足、訂正などありましたら、よろしくお願いいたします。

  • CASLとフラグレジスタ

     私は今CASLの勉強をしています。  今はLD命令や分岐命令を使ってプログラムを作っているのですが、LD命令のフラグレジスタの設定の説明がよくわからないところがあるのです。  それは、LD命令は転送する値によってFRが決まるということですよね。それは、転送を命令された番地の数字(すなわち番地名)なのか、それともその番地に入っている値そのものなのかがなかなか調べても出てきません。  初心者な質問ですが、どなたか回答よろしくお願いします。

  • MP-Z80の周辺IC8255

    AB10-EXE上の8255(1)、8255(2)を正常に動作させられるように初期化しました。 LD___A, 90H ____ 3E 90___ : 8255(1) モード 0 OUT__(23H), A____D3 23___:Aポート入力に、B、Cポート出力に初期化 LD___A, 80H_____3E 80___:8255(2) モード 0 OUT___(27H), A____D3 27___:A、B、Cポート出力に初期化 HALT___________76 しかし8255の初期化プログラムの内容はよくわかりませんので知っている方説明でもヒントでもしてください 宜しくお願いします

  • 学校の課題でプログラミングが…(BASIC)

    学校でプログラミング課題が出てしまいました(汗) 普段プログラムなどとは縁がないので正直全く分かりません。 どなたか、ヒント・・・・・・というよりも答えを教えていただけたらと思います。 《N(m+1)=b・N(m) b=A-cN(m+1) A=1.5 c=0.001 N(100)を求める》 というものです。N88互換BASIC を使っています。よろしくお願いします。

  • プログラミングの課題で困っています。助けて下さい。

    プログラミングの課題で困っています。助けて下さい。 課題1-1: 実数 a と実数 b を入力すると、一次方程式ax + b = 0 の解を求めるプログラムを作る 課題1-2: 1-1 で作成したプログラムについて、さらにa として1が入力されたとき、方程式の表示部      分が1x + 3 = 0ではなくx + 3 = 0となるようにせよ 課題1-3: 1-2 で作成したプログラムについて、さらにb として0 や負の数が入力されたとき、方程式     の表示部分が2x = 0 や2x – 3 = 0となるようにせよ 課題1-4: 1-3 で作ったプログラムについて、さらにa の値として0が入力された場合、「解けません」     と表示するようにせよ 課題1-5: 係数 a, b, c を入力すると、 2次方程式ax2 + bx + c =0の解を表示するプログラムを作     れ ※ 1-2 ~ 1-4 のような機能を盛り込む ※ a が0の場合には、先に作った1次方程式のプログラムが動く という課題です。最終的にこれらを一つのプログラムにしてください。判別式や解の公式、ルート√などを使ってよろしくお願いします。  

専門家に質問してみよう