山本ワールド
乗算16bit*16bit=32bit アセンブラプログラム
概要
PIC18には8bit*8bit=16bitのハードウェア乗算器を搭載しており加算などと同じ1命令サイクル(4クロック)で実行できます。
AD変換値など8bitに収まらないデータを扱うために16bit*16bit=32bitの乗算プログラムを作成しました。
筆算と同じ方法で16bitの上位と下位をそれぞれ256進数とみなして下位*8bit*8bitと上位8bit*8bitをそれぞれ計算し後で桁をずらして加算します。
以下に筆算の例を示します。
データの並び順はリトルエンディアンです。
答えを表示するプログラムは記載していないのでエミュレーター上で実行してください。以下に実行例を示します。
使用メモリは以下のとおりです。
プログラムサイズ 87byte
アクセスバンク 8byte
乗算サブルーチンの実行速度はcallされてからreturnが終了するまで大雑把に30命令サイクルです。(64MHz 1.875μs)
8086のMUL命令の場合、16bit*16bitは118~133クロックです。(10MHz 13.3μs)
H8 3048のMULXU命令の場合、22クロック(16MHz 1.375μs)
68000のMULU.W D0,D1 最大70クロック(16MH 4.375μs)
AD変換値など8bitに収まらないデータを扱うために16bit*16bit=32bitの乗算プログラムを作成しました。
筆算と同じ方法で16bitの上位と下位をそれぞれ256進数とみなして下位*8bit*8bitと上位8bit*8bitをそれぞれ計算し後で桁をずらして加算します。
以下に筆算の例を示します。
A B * C D --------------- AD BD AC BC -------------- AC AD+BC BD被乗数はMUL16A、乗数はMUL16Bに格納してからmul16_16をコールします。答えはMUL32DTCに格納されます。
データの並び順はリトルエンディアンです。
答えを表示するプログラムは記載していないのでエミュレーター上で実行してください。以下に実行例を示します。
使用メモリは以下のとおりです。
プログラムサイズ 87byte
アクセスバンク 8byte
乗算サブルーチンの実行速度はcallされてからreturnが終了するまで大雑把に30命令サイクルです。(64MHz 1.875μs)
8086のMUL命令の場合、16bit*16bitは118~133クロックです。(10MHz 13.3μs)
H8 3048のMULXU命令の場合、22クロック(16MHz 1.375μs)
68000のMULU.W D0,D1 最大70クロック(16MH 4.375μs)
プログラムの説明
ソースファイル
以下のファイルで構成されているmul16_16a.asm ・・・ メインプログラム
ソースファイルのダウンロード mul16_16a.zip
; 乗算 16bit*16bit サンプル Version 1.00 2017/01/09
; 慈渓博瑞テクノロジー株式会社 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'23456' ; 被乗数
multiplier EQU d'65432' ; 乗数
banka UDATA_ACS ; 変数の定義
MUL16A RES 2 ; 乗算引数1
MUL16B RES 2 ; 乗算引数2
MUL32DTC RES 4 ; 乗算結果
CODE
ORG 0
goto start ; リセット時
start
banksel MUL16A
movlw LOW multiplicand
movwf MUL16A
movlw HIGH multiplicand
movwf MUL16A+1
movlw LOW multiplier
movwf MUL16B
movlw HIGH multiplier
movwf MUL16B+1
call mul16_16
bra $
; 乗算サブルーチン(16bit * 16bit -> 32bit)
; MUL32DTC=MUL16A*MUL16B
; 2017/01/09
mul16_16
; 下位8bit*8bit
movf MUL16A,W
mulwf MUL16B
movff PRODL,MUL32DTC
movff PRODH,MUL32DTC+1
; 上位8bit*8bit
movf MUL16A+1,W
mulwf MUL16B
movf PRODL,W
addwf MUL32DTC+1
btfsc STATUS,C
incf PRODH
movf PRODH,w
movwf MUL32DTC+2
; 下位8bit*8bitH
movf MUL16A,w
mulwf MUL16B+1
movf PRODL,w
addwf MUL32DTC+1
movf PRODH,w
addwfc MUL32DTC+2
; 上位8bit*8bitH
movf MUL16A+1,w
mulwf MUL16B+1
movf PRODL,w
addwf MUL32DTC+2
btfsc STATUS,C
incf PRODH
movf PRODH,w
movwf MUL32DTC+3
return
END
Copyright (C) 2012 山本ワールド All Rights Reserved.