• ベストアンサー

8085系プログラミングについて

ついこの前、同じを質問したのですが、私の理解不足と説明不足により質問の仕方が悪いと回答され、自分なりにアセンブラ言語について学習してみました。学習してみるとたしかに私は何も理解しておらず、8085系のプログラミングということも書き忘れていました。ここでのスレでまずお詫びしたいと思います。誠に申し訳ありませんでした、こんな私ですが、もしよければアセンブリ言語での8085系のプログラミングでこの質問に対する回答と解説のご教授お願いします。 9000H番地の1バイトデータをa、9001H番地の1バイトデータをbとしたとき、axbを16ビットで求め、下位1バイトを9002H番地、上位1バイトを9003H番地に格納するプログラムを作りなさい。またこのプログラムの実行時間をデータがA=65H、B=0AEHのときに計算しなさい。実行時間の計算では各命令の実行回数を示し、計算式を詳しく書くこと。 8085系のプログラミングでは、掛け算の関数がないので、掛け算についての表わし方だけでもいいので教えてください、お願いします

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

私が駆け出しの頃は、下っ端仕事でよくやらされました。 30年くらい前の経験なので、ニモニックが違ってたらゴメン。     LXI H,9000H ;HL←9000H     MOV E,M   ;E←a     MVI D,0   ;D←0 要するにDEレジスタにaをセット     INX H    ;次のアドレス(9001H)     MOV A,M   ;A←b     LXI H,0   ;HL←0 これが積になる LABEL1:     CMC      ;Cyをクリア     RRC      ;CyとAを右にローテイトする     JNC LABEL2  ;Cyが出なければ加算しない     DAD D    ;積に加算     PUSH H    ;積を退避     PUSH D    ;HL←DEとするための処理     POP H    ;ここでHL=DEとなる     DAD D    ;HLを2倍する(HL←HL+DE)     XCHG     ;DEとHLを交換     POP H    ;積を復帰 LABEL2:     ORA A    ;A(乗数)が0かどうかを確認する     JNZ LABEL1  ;乗数が0でなければ繰り返す LABEL3:     SHLD 9002H  ;積を格納 例えば、b=0AEH=174を2進値で表すと、10101110です。 これを掛けるということは(a×128)+(a×32)+(a×8)+(a×4)+(a×2)ということです。 aの値を1倍、2倍、4倍、8倍・・・とし、上記bのビットが1の時だけ加算してゆけば答えが得られます。 処理時間は (1)LABEL1までと、LABEL3以降は1回しか実行されないので、各命令のクロックを加算します。 (2)LABEL1直後のCMCとRRCは8回実行されますので、クロック数合計×8を加算します。 (3)次の条件分岐は2回分岐し、6回は分岐しません。分岐時と非分岐時のクロックをそれぞれ加算します。 (4)DAD~POP H(LABEL2の直前)は6回実行されます。各命令のクロック数合計×6を加算します。 (5)LABEL2以下はORAが8回、JNZは分岐が7回、非分岐が1回です。各クロック数、分岐時と非分岐時のクロックをそれぞれ加算します。 クロック数が求められたらクロックレートから時間を計算できます。 但し、割り込みが無いとしての理論値ですが・・・ P.S. aとbの値は符号なし(0AEH=174)ですよね?符号付だと、符号の判断、2の補数化という操作が入ります。

yui01
質問者

お礼

すごく丁寧に教えてくださってありがとうございます。自分なりにやったものとは少し違いましたけど、すごく参考になりました。本当にありがとうございます。

その他の回答 (1)

noname#65902
noname#65902
回答No.1

前の質問も拝見しました。 課題ということですよね。丸投げは禁止されてます、 さっぱりわからないということでしょうか。 大まかなフローチャートくらいは考えて提示し、 こう考えたんだけど ここをどうやって表現するのかわからないので教えて、 ということなら質問内容に問題ないと思いますが。 因みに、8085 のニーモニックは知っているので (忘れかけてますが) お力になれるかも知れません。 > 掛け算についての表わし方 プログラミングの方が経験殆どないのできれいな回答は 出来ないかもしれませんが... 単純に「被乗数を[乗数の値]回だけ加算する」という方法があります。 これはプログラムとしては「美しくない」ですが、方法はとても解りやすいと思いますが。 さっぱり解らないならこの辺から着手してみたらいかがでしょう。 8085 のレジスタ構成、ニーモニック、出来る演算、条件分岐は 一通り勉強したんですよね? 他にも方法はありますが、とりあえず今は省略します。

関連するQ&A