• ベストアンサー

MP-Z80(10進数の加算)

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

  • Fromv
  • お礼率78% (15/19)

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

  • ベストアンサー
  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.1

EX AF,A'F'   ; AF←→A'F' でFレジスタの内容を保存 EXX       ; BC←→B'C',DE←→D'E', HL←→H'L' でB,C,D,E,H,Lレジスタの内容を一括保存 ; ここは PUSH BC でもいいが EXX の方がステート数が少なくて済む。 XOR A ; Aレジスタの内容をリセット。 LD A,0 でもいいが XOR A の方がプログラム・バイト数とステート数が少なくて済む。 LD B,0Ah ; Bレジスタに10進10を入力。 10進表記で LD B,10 としてもよい。 LOOP: ADD A,B ; A←A+B の加算 DEC B ; B←B-1 の減算。 演算の結果Bレジスタが0になればZフラグ=1。それ以外は Zフラグ=0 JR NZ,LOOP ; Zフラグが0(NZ=1)ならLOOPに戻る(相対ジャンプ)。 Zフラグが1(NZ=0)ならスルー。 EXX ; BC←→B'C',DE←→D'E', HL←→H'L' でB,C,D,E,H,Lレジスタの内容を一括保存 ; 2行目の EXX をPUSH BC としたときは POP BC に置き換える。  ※ 文字がずれて読みづらいときは 「テキスト・ドキュメント」などにコピー&ペースとして読み直してください。  使用している命令は若干異なりますが、このサイトが役に立つかもしれません。 http://www.infonet.co.jp/ueyama/ip/software/assembler.html

Fromv
質問者

お礼

ありがとうございます

関連するQ&A

  • マイクロプロセッサの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 このプログラムコードの最適化(命令数の削減)を行え。 という課題がでました。どうすればよいかわかりません。どなたかおしえてください。

  • 非常に限定された条件での8バイト加算

    アセンブリプログラム上で16ビット同士を加算したいと考えています。 ただ、非常に条件が限定されていて、 【簡単な構成について】 ・レジスタは8ビットAレジスタ一つのみ ・8ビット演算器(ALU)は一つのみ ・条件コードはZフラグのみ(ただし、書き換わるのは命令7.、8.でのみ) 【使える命令】 1.Aレジスタに即値をロード 2.Aレジスタに指定アドレスのデータをロード 3.Aレジスタから指定アドレスにストア 4.無条件分岐 5.Aレジスタand即値=0ならば分岐 6.Aレジスタor即値=0ならば分岐 7.Aレジスタと即値のandをとって書き戻し 8.Aレジスタと即値のorをとって書き戻し 9.Aレジスタと即値を加算して書き戻し a.Aレジスタと指定アドレスのEORをとって書き戻し b.Aレジスタと指定アドレスのデータを加算して書き戻し c.間接アドレスのデータをAレジスタにロード d.Aレジスタの内容を間接アドレスにストア e.Aレジスタから即値を減算して書き戻し f.Aレジスタから指定アドレスデータを減算して書き戻し 普通に考えるならば、下位8ビット同士の加算、上位8ビット同士と下位8ビットのキャリーを加算すれば出来ます。 しかしながら、この限定された条件に於いてはなんらかの自由に使えるフラグ、もう少し汎用的に使える分岐命令が無ければ無理だと個人的には考えています。 出来るか、出来ないか、だけでも結構ですので、ご教授お願いします。

  • MP-Z80の問題について

    ワンボードマイコンMP-Z80のプログラムを勉強しているのですが、 次の問題がわかりません。 (1)NHKの時報の様な音を出すプログラムを作成する。但し音の周波数は、440Hzの音が鳴ったり鳴らなかったりを0.5秒間隔で3回繰り返して880Hzで1秒間鳴らすプログラムを作成する。プログラムは8900H番地以降に作成すること。周波数の誤差は+-0.5以下に、時間の誤差は+-1ms以下にすること。 お願いします、だれか教えてください。

  • 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 ↑のようにすればよいのですが、なぜなのかいまいちわかりません。異なるコードで実装せよ。とのことなので理解したいです。おしえてください。

  • 桁上げ保存加算器(2進数計算)

    2進数の積で桁上げ保存加算器で求めよと出てきました。 たとえばA=15、B=23(もちろん10進数表記です)のとき 2進数で表すと、A=(1111)、B=(10111)となります。 桁上げ保存加算器で求めよというのは 10進数の積の方法と同様に下の方法で1111*10111を解けばいいのでしょうか?     1111    10111    ―――     1111    1111   1111  1111  ―――――  101011001=345

  • 2進数の加算の繰り上がり

    2進数の四則演算のプログラムを作りたいと思い、2進数を表示するところまではできたのですが、加算になると繰り上がりという壁にぶつかってしまいました。繰り上がりや桁上げなどがよく分からないので、お教えください。(下のソースコードが繰り上がりのない加算をするまでのものです) #include <stdio.h> int main(void) { int a,b,i,j,x[8],y[8],z[8]; do{ puts("二つの符号なし整数を入力してください。(ただしa>bとし、bはのべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if(a < = b) puts("入力した値がa>bになっていません。\a"); }while(a < = b); for( i = 0; i < = 7; i + +){ x[i] = a % 2; a = a / 2; y[i] = b % 2; b = b / 2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for( i = 7; i > = 0; i - -){ printf("%d",x[i]); } puts(""); printf("b="); for( i = 7; i > = 0; i - -){ printf("%d",y[i]); } printf("となります。\n\n"); printf("<加算>\n"); printf("c=a+b="); for( j = 7; j > = 0; j - -){ z[j]=x[j]^y[j]; printf("%d",z[j]); } return(0); }

  • ワンボードマイコンMP-Z80を用いたプログラミング

    今、ワンボードマイコンMP-Z80でプログラミングの勉強をしています。 まだ、基本的なところなんですが、次の問題がわかりません。 1)8100H番地から81FFH番地までの100Hバイト分のRAM領域を0とする プログラムを作成せよ。 2)1から10までの整数の和を求め、8100H番地に格納せよ。 3)8100H番地から810FH番地に格納されているデータを8ビットの符号付 絶対値表現とみなしたとき、各データを2の補数表現に変換し、8200H番地から格納せよ。 この三つの問題なんですが、1)は全部に0を入れるということでしょうか? これらの問題は繰り返し命令の範囲の問題なので、繰り返し命令を 使うそうです。ヒントだけでも教えてください。

  • 素数の積に1を加算すると素数ですか?

    誰か素数を順番に掛け算したものに対して1を加算すると素数になる理由を教えてください。 素数1*素数2*素数3*素数4*素数5,,,*素数n +1 = 素数と聞きました。 (2*3*5*7*11,,,,+1=素数) 別に素数a*素数b+ 1 =素数って訳でもないのに。。。 (3*5+1=16) なぜ素数の1番目から順に掛け算を行ったものに対して1を加算すると素数になるのでしょうか?

  • 2進数の加算回路について

    こんばんわ。 2進数の加算回路を行う回路は、1ビット目(LSB)の加算に半加算器を使って、2ビット目以降の加算に全加算回路を用いることで実現できますよね?でもこの方法の場合、下位の桁から毛か上げが順次確定していくことによってビット数が大きくなればなるほど結果が算出されるまでの応答速度が遅くなってしまいます。それを克服するために、何か別の方法はないでしょうか?別の方法で回路を作ることは可能でしょうか。 ご指導お願いします。

  • Z80について

    Z80のアセンブリ言語の命令でAレジスタの値を反転させるにはCPL命令を使えばいいんですが、その命令以外の命令を使ってAの値を反転させるにはどうすればいいでしょうか? どんな命令を使えばよろしいでしょうか?