乗算16bit*8bit=24bit アセンブラプログラム

icon 項目のみ表示/展開表示の切り替え

概要

PIC18には8bit*8bit=16bitのハードウェア乗算器を搭載しており加算などと同じ1命令サイクル(4クロック)で実行できます。
AD変換値など8bitに収まらないデータを扱うために16bit*8bit=24bitの乗算プログラムを作成しました。
筆算と同じ方法で16bitの上位と下位をそれぞれ256進数とみなして下位*8bit*8bitと上位8bit*8bitをそれぞれ計算し後で桁をずらして加算します。
例えば32700*255の乗算を筆算で解いてみます。
32700は16進数で表すと0X7FBCです。
上位と下位をそれぞれ10進数で表すと127,188となります。
あとは筆算をするだけです。
    127 188  (127*256+188=32700)
*       255
-----------
    187  68  (187*256+68=47940)
126 129      (126*256+129=32385)*256
-----------
126 316  68  (126*256^2+316*256+68=8338500)  316は256以上なので繰り上げ処理
127  60  68  (127*256^2+ 60*256+68=8338500)
被乗数はMUL16A、乗数はMUL8Bに格納してからmul16_8をコールします。答えはMUL16DTCに格納されます。
データの並び順はリトルエンディアンです。
答えを表示するプログラムは記載していないのでエミュレーター上で実行してください。以下に実行例を示します。

使用メモリは以下のとおりです。
プログラムサイズ 55byte
アクセスバンク 6byte
乗算サブルーチンの実行速度はcallされてからreturnが終了するまで大雑把に14命令サイクルです。(64MHz 0.875μs)
8086のMUL命令の場合、16bit*16bitは118~133クロックです。(10MHz 13.3μs)
H8 3048のMULXU命令の場合、22クロック(16MHz 1.375μs)

プログラムの説明

ソースファイル

以下のファイルで構成されている
mul16_8.asm ・・・ メインプログラム

ソースファイルのダウンロード mul16_8.zip

; 乗算 16bit*8bit サンプル Version 1.00  2017/01/08
; 慈渓博瑞テクノロジー株式会社 PIC18F46K22 マイコンキット Ver2013.12.08用
;   http://akizukidenshi.com/catalog/g/gK-07231/
; 乗算結果を表示するプログラムは含まれていないのでシミュレータで使用してください。
; MPLAB X IDE v3.45 Microchip MPASM(v5.70)

        #INCLUDE <p18f46k22.inc>
        ; 水晶発振(16MHz) クロック分周無 PLL有効(*4) プライマリクロック有効  ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
        CONFIG FOSC = HSHP,PLLCFG=ON,PRICLKEN=ON,WDTEN=OFF,LVP=OFF

multiplicand EQU d'32700' ; 被乗数
multiplier   EQU   d'255' ; 乗数
  
banka    UDATA_ACS  ; 変数の定義

MUL16A   RES    2   ;   乗算引数1
MUL8B    RES    1   ;   乗算引数2       
MUL16DTC RES    3   ;   乗算結果

        CODE
        ORG 0
        goto   start    ;   リセット時
 start
        banksel MUL16A
        movlw   LOW  multiplicand
        movwf   MUL16A
        movlw   HIGH multiplicand
        movwf   MUL16A+1
        movlw   multiplier
        movwf   MUL8B
        call    mul16_8
        bra     $
        
; 乗算サブルーチン(16bit * 8bit -> 24bit)
; MUL16DTC=MUL16A*MUL8B 
; 2017/01/08

mul16_8
        ; 下位8bit*8bit
        movf    MUL16A,W
        mulwf   MUL8B
        movff   PRODL,MUL16DTC
        movff   PRODH,MUL16DTC+1
        ; 上位8bit*8bit
        movf    MUL16A+1,W
        mulwf   MUL8B
        movf    PRODL,W
        addwf   MUL16DTC+1
        btfsc   STATUS,C
        incf    PRODH
        movf    PRODH,w
        movwf   MUL16DTC+2
        return

        END