私はPIC18アセンブリでかなり基本的なプログラムを書いています。2 つの 16 ビット数を乗算するサブルーチンを作成する必要があります。これは私が今持っているものです:
;***********************************************************************
; mul_16bit: subroutine that multiplies two 16 bit numbers stored in
; addresses mul_16ptr1, mul_16ptr1+1 and mul_16ptr2,mul_16ptr2+1 and
; returns the 32-bit result in addresses mul_16res1 to mul_16res1+3
;***********************************************************************
mul_16bit:
movf mul_16ptr2, W ;multiply the lower bytes
mulwf mul_16ptr1, W
movff PRODH, mul_16res+1
movff PRODL, mul_16res
movf mul_16ptr2+1, W ;multiply upper bytes
mulwf mul_16ptr1+1, W
movff PRODH, mul_16res+3
movff PRODL, mul_16res+2
movf mul_16ptr2, W ;multiply lower byte of num2
mulwf mul_16ptr1+1, W ; and upper byte of num1
movf PRODL, W
addwf mul_16res+1, F
movf PRODH, W
addwfc mul_16res+2, F
movlw 0 ; add carry
addwfc mul_16res+3, F
movf mul_16ptr2+1, W ;multiply upper byte
;of num1 and lower
mulwf mul_16ptr1, W ; byte of num2
movf PRODL, W ;add the result to mul_16res
addwf mul_16res+1, F ;...
movf PRODH, W ;...
addwfc mul_16res+2, F ;...
movlw 0 ; add carry
addwfc mul_16res+3, F
return
私が今書いている方法は、最初のコメントで言及されているレジスタに格納されている数値を乗算し、コメントの4つのレジスタに格納するというものです。これは、この乗算を 1 回か 2 回実行するだけでよい場合にうまく機能します。つまり、次のように言えます。
mul_16ptr1 set 0x45
mul_16ptr2 set 0x47
mul_16res set 0x50
call mul_16bit
乗算0x45
し0x47
て に格納し0x50
ます。問題は、異なるデータに対してこれを複数回呼び出す必要がある場合です。これは、アセンブラーがポインターを 2 回「設定」できないためです。間接アクセス (つまり、被乗数と結果を格納するために LFSR1、LFSR2、および LFSR0 を使用) を使用しようとしましたが、POSTINC0 などの巨大な混乱が発生します。この関数呼び出しをより適切にする方法はありますか?