1

先生は、8 ビット長の 2 つの数を乗算するプログラムを作成する課題を私たちに与えました。当社のマイクロ コントローラは 8 ビット レジスタのみをサポートするため、結果を 2 つのレジスタに配置する必要があります。これは私が立ち往生しているところです。

2 つの数値を乗算するには、そのうちの 1 つを左にシフトする必要があります。左にシフトするとき、数字を貼り付けることができるキャリービットが残っているため、これを行う方法がわかりませんが、1ビット以上シフトする必要がある場合は、キャリー-ビットが足りない。

また、これらの数値を追加する方法がわかりません。例:

Number1:    Number2:
0000'0111 * 1111'1111
---------------------
            1111'1111
          1'1111'111<  The 1 number on the left would be outside the register.
         11'1111'11<<  The 2 numbers on the left would be outside the register.
         ------------
        110'1111'1001

紙に書いてある方法です。しかし、どうすればそれを実装できますか?

4

3 に答える 3

1

私はそれを何とか解決しました、そしてそれはうまくいきます。私はまだ初心者であり、あなたが書いていることの多くを理解していません.

私の解決策:

Main:   

IN      Number1, SWITCH
IN      Number2_L, SWITCH2
CLR     Number2_H
CLR     Product_L
CLR     Product_H
Loop:   TST     Number1  ; Number1 > 0 ?
        BREQ    JEnd     ; If not, jump to JEnd
        LSR     Number1  ; Logical Shift Right to Carry
        BRCC    JNoC     ; If Carry not set, then jump to JNoC
        ADD     Product_L, Number2_L
        ADC     Product_H, Number2_H
JNoC:   LSL     Number2_L   ;Logical Shift Left to Carry
        ROL     Number2_H   ;Rotate Left through/from Carry
        RJMP    Loop        
JEnd:   OUT     LED, Product_L
        OUT     LED2, Product_H
        RJMP    Main      ; Infinite loop

ノート:

ADD は Rd <- Rd + Rr

ADC は Rd <- Rd + Rr + C

于 2013-11-10T20:08:56.363 に答える
1

徒歩で行く場合は以下のようになります。2 つのレジスタ R_h と R_l を呼び出し、0 に初期化します。マスク M_l := 0x01 を作成します。被乗数レジスタ x、乗数レジスタ y を呼び出します。レジスタ R_t. も使用します。 次に、擬似コードで:  

(0) i = 0、j =8 に設定 

(1) 8 回繰り返す (i)

(2) (and x, M_l) == 0 の場合、(8) へ

(3)(a) sll y, i, R_t に保存

(3)(b) R_l、R_tを追加し、R_lに保存

(4) キャリービットがセットされていない場合は (6) へ

(5) R_h、1 を追加

(6) srl y、j、および R_t に格納します。これは、位置を調整するだけで R_h にプッシュするものです (y の値はそのままにしておきます)。 

(7) R_h、R_t を追加し、R_h に格納します (中間結果が正しくなりました)。

(8) i++、j--

(9) sll M_l, 1

(10) jmp (1)

オフバイワンエラーが簡単に発生する可能性があります。しかし、原則として、これは機能するはずです。おそらくこれには標準的なアルゴリズムがありますが、それが思い浮かびました。 

于 2013-11-10T18:07:35.787 に答える