Jste zde

Násobení word x word pro procesory rodiny 8051

Rutiny pro proces násobení dvou 16. bitových čísel patří bezesporu k běžné výbavě knihoven matematických programů, které používají všichni programátoři.

Protože instrukční soubor rodiny 8051 má pouze násobení byte x byte, běžně je použivána rutina s postupným binárním přičítaváním násobence.  Tato rutina má pro rozsah word x word celkově 16 interačních cyklů. 
Nabízim popis velmi rychlého řešení, myslím že docela nestandartní , způsobu realizace bez výše uvedené časově náročné interační smyčky. 

Mějme čísla v bin tvaru v registrech ren3 (Hi byte) a ren2 (Lo byte) pro první násobenec a v registrech ren5 (Hi byte) a ren4 (Lo byte) pro druhý násobenec. Jejich vynásobení pak můžeme zapsat ve tvaru:

(256*ren3 + ren2)*(256*ren5 + ren4) = 
65536*(ren3*ren5) + 256(ren2*ren5+ren4*ren3)+ren2*ren4

po úpravě vidíme, že potřebujeme 4-krát násobení byte x byte - "mul ab" a vhodný způsob sčítání.

Navíc, při zvolení si vhodného postupu matematických úkonů, nebudeme  potřebovat další pomocné registry (kromě dvou) pro odkládání mezivýsledků.  Další viz výpis programu. 

Z výše uvedeného plyne, že algoritmus nemá žádnou iterační smyčku , je jednoprůchodový ,tudíž exekuční doba je konstantní a nezávislá na  vstupních číslech.
 

DOWNLOAD


Download rutiny - mul_words.zip  (1 kB)
 
 

Download rutiny -   (1 kB)

Download rutiny -   (1 kB)

 

;*********************************************
            ;  násobení 16b x 16b bez znaménka - vysledek 32b
            ; superrychlá - 57 cyklů procesoru
            ;*********************************************
            ;vstup	v ren3 je bajt_H a ren2 je bajt_L nasobence
            ;vstup	v ren5 je bajt_H a ren4 je bajt_L nasobitele
            ;vystup	v ren5 je 4_byte a ren4 je 3_byte
            ;vystup	v ren3 je 2_byte a ren2 je 1_byte
            ;
            ;	mění reg.: Acc,ren2,ren3,ren4,ren5,Psw
            ;	možnost zvolit si prac. registry***** kromě r7
            ren2	equ 	r2
            ren3	equ 	r3
            ren4	equ 	r4
            ren5	equ 	r5
            ;*******
            mul16x16:
            push B
            mov b,r7
            push B
            mov a,ren5
            mov r7,a	;musi odlozit
            mov a,ren2
            mov b,ren4
            mul ab		;nasobi L bajty
            xch a,ren2	;1_bajt vysledku do r2
            xch a,b
            xch a,ren5	;soucasne ulozi Hb 1 nasobeni
            mul ab          ;Lbajt nasobence x hbajt n-itele
            add a,ren5	;pripocita predch. vysled v 2_byte
            xch a,ren4	;ulozi 2_byte mezivysled do ren4 a
            ;v ACC znovu bajt_L nasobitele
            xch a,b		;bajt_L nasobitele do b 3_B do acc
            addc a,#0	;zohladni prenos z 2_B
            mov f0,C	;zohladni prenos z 3_B
            xch a,ren3	;Hbajt n-enca v a 3_B mezivysled v ren3
            mov ren5,a	;odlozi Hbajt n-enca  do ren5
            mul ab          ;Hbajt nasobence x Lbajt n-itela
            add a,ren4	;pripocita predch. vysled v 2_byte
            xch a,ren3	;ulozi 2_byte mezivysled do ren3 a
            ;v ACC znovu 3_b mezivysled
            addc a,b	;pripocita novy mezivysled
            xch a,ren5	;v Acc  bajt_H n-ence v ren5 3_B mezivysled
            mov b,a		;bo Bbajt_H n-ence
            clr a
            addc a,#0	;prenos do 4-bajtu
            mov C,f0
            addc a,#0	;prenos do 4-bajtu
            xch a,r7	;v Acc H_b n-itela,v r7 prenosy do 4_B
            mul ab          ;Hbajt nasobence x Hbajt n-itela
            add a,ren5
            mov ren4,a	;vysledek 3_bajt
            mov a,b
            addc a,r7
            mov ren5,a	;vysledek 4_bajt
            pop b
            mov r7,b
            pop b
            ret
            


 

Rutinu napsal : Zbyhněv Brudny
Hodnocení článku: 

Komentáře