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)
;********************************************* ; 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 |
Komentáře
Super něco takového jsem
Super něco takového jsem zrovna potřeboval.
Dik.