• 締切済み

アセンブラ言語

以下の言語が何を計算しているかを知りたいです。 宜しくお願い致します LD A, m (A<=m) LD E, n (E<=n) LD D, 0 (D<=0) LD HL, 0 (HL<=0) LD B, 8 (B<=8) loop; SRL A (Aを右シフト、最下位はキャリーへ) JR NC,Shift (桁上がりが無ければShiftへ) ADD HL,DE (HL<=HL+DE) shift; SLA E (Eを左シフト、最上位はキャリーへ) RL D (Dを左シフト、キャリーが最下位へ) DJNZ Loop (B<=B-1して、ゼロでなければLoopへ)

みんなの回答

回答No.3

この件まだ解決していないようですね(スレッドが開いている) もし、なんでしたら、 8回ループにして、高速化してもいいですが。 いまザイログを使う人もなかなか、珍しいので。 躊躇していますが、いかがでしょうか?

回答No.2

>なので、0x100は、n*4が返る。。 ここミス! 0b100の間違いです。 ひとまず・・・ LD B,A loop; ADD HL,DE DJNZ Loop と、最終HLの値は同じだと思いますよ。 速度的に256回ループすると速度が遅いから!って概念でしょうが。 本気で速度を考えるなら、このロジックは「絶対に8回」にしかならないので。 DJNZをベタ展開する方がましかと。(DJNZって遅い命令なので)

回答No.1

Z80ですか。。 reg_a=m; reg_de=n; reg_hl=0; for (i=0;i<8;i++) { if (reg_a&1) { reg_hl+=reg_de; } reg_a>>=1; reg_de<<=1; } なのかな。。 mの値をもとに、nの値を加算した値を返す関数のようですが nの値をビットの位置を掛け算したものを返り値に加算。 なので、0x100は、n*4が返る。。 って事は、「hl=n*m」に見える。 Z80には掛け算はないので それの「ひっ算」ルーチンな気がします。