Propozycja metody mnoŜenia liczb ze znakiem Sławomir Gryś Politechnika Częstochowska, Wydział Elektryczny Abstract: An efficient technique of signed binary multiplication using unsigned multiply instruction was presented in this paper. A performance of the proposed technique was compared to the software emulated versions of classical techniques such as: radix-2 Booth method, reversal of sign method (negative to positive conversion) and sign extension method. Numerous examples were provided to show the efficiency of the technique in the context of practical software implementation. The proposed algorithm is suitable for embedded systems based on the widespread microprocessors/microcontrollers which have an unsigned multiplication in their instruction set but they lack signed multiply instruction. The samples of code presenting the solution of signed multiplication problem using various techniques were prepared in an assembly language for MCS 8051 compatible microcontroller. The comparison of the performance of algorithms was carried out also for 8051 core treated as reference microcontroller architecture but the obtained conclusions are potentially general and not only limited to this microcontroller. Keywords: arithmetic algorithms, signed multiplication, embedded systems, assembly language 1. Wprowadzenie Istnieją zastosowania soystemów wbudowanych (ang. embedded systems), w których zdolność do wykonywania działań arytmetycznych przez mikrprocesor, będący „sercem” systemu wbudowanego, lub specjalizowany układ arytmetyczny, odgrywa kluczową rolę w zapewnieniu wymaganej funkcjonalności i wydajności urządzenia. Do tego obszaru zastosowań naleŜy zaliczyć, m.in.: systemy pomiarowo-sterujące, urządzenia medyczne, inteligentne sterowniki silników, systemy bezpieczeństwa, układy elektroniki komercyjnej, itp. Jednym z elementarnych działań arytmetycznych jest mnoŜenie liczb ze znakiem, zapisanych w powszechnie stosowanym kodzie uzupełnień do dwóch (ang. two’s complement). Rozwiązania czysto sprzętowe w formie układów mnoŜących wykonanych w technologii VLSI, przedyskutowano w wielu publikacjach, m.in. [1-6]. Przykładowo do najszybszych zalicza się układ mnoŜący Wallace [7-9], czy rozwiązanie zaproponowane przez Baugh’a i Wooley’a w pracy [10]. Niniejszy artykuł poświęcono programowym rozwiązaniom operacji mnoŜenia, przeznaczonym do implementacji w relatywnie prostych systemach wbudowanych wyposaŜonych w 8/16 bitowe mikroprocesory, które nie posiadają w liście rozkazów mnoŜenia liczb ze znakiem. Reprezentantami tej grupy mikroprocesorów są m.in.: 8051, Freescale 68HC08 i HCS12, Atmel ATtiny, Zilog eZ8core!, STMicroelectronics ST7, Microchip PIC16/18, Texas Instruments MSP430, NEC 78K0S/0R i in. Zadanie mnoŜenia liczb ze znakiem, przykładowo c=a*b, przy spełnieniu poniŜszych załoŜeń: - mnoŜna, mnoŜnik i wynik mnoŜenia są przechowywane za pomocą k bitów, - szerokość rejestru (sprzętowa długość słowa) jest równa k bitów, - wynik mieści się w zakresie liczbowym wynikającym z ilości przyjętych k bitów, jest realizowalne bezpośrednio za pomocą rozkazu mnoŜenia liczb bez znaku. Ten przypadek obrazuje poniŜszy fragment programu napisany w języku C – podpunkt a. a) b) void main() void main() { { int a; int a; int b; int b; int c; long c; c=a*b; c=a*b; } } W wielu praktycznych sytuacjach trudno jednak przyjąć tak optymistyczne załoŜenia. Nie mogąc przewidzieć zakresu zmienności argumentów wejściowych, powstaje ryzyko przekroczenia przyjętego zakresu liczbowego przez wynik mnoŜenia i w konsekwencji utratę danych. Sposobem na uniknięcie takiej sytuacji jest zarezerwowanie dla wyniku większej liczby bitów niŜ dla argumentów wejściowych. Oznacza to przyjęcie róŜnych typów dla danych numerycznych – podpunkt b, co komplikuje niestety kwestię realizacji mnoŜenia na poziomie listy rozkazów procesora. Języki wysokiego poziomu uŜywają róŜnych, klasycznych technik emulacji programowej brakującego rozkazu mnoŜenia liczb ze znakiem. Są to m.in.: kodowanie Bootha, rozszerzenie znaku, konwersja liczb ujemnych do dodatnich. Artykuł w dalszej części jest zorganizowany wg następującego planu. Rozdział 2 prezentuje podstawę matematyczną proponowanego algorytmu zakładając, Ŝe argumenty wejściowe jak i wynik mnoŜenia jest zapisany w kodzie uzupełnienia do dwóch. RównieŜ w tym rozdziale opisano moŜliwe uproszczenia złoŜoności algorytmu. W celu porównania właściwości proponowanej metody z innymi, powszechnie stosowanymi, rozwiązaniami stworzono w języku asemblerowym podprogramy, realizujące zadanie mnoŜenia dwóch 8 bitowych liczb ze znakiem. Krótki opis trzech referencyjnych metod wraz z podprogramami i wynikami porównania opisano w rozdziale 3. Rozdział 4 zawiera wnioski z badań. RozwaŜania teoretyczne zostały zilustrowane licznymi przykładami liczbowymi w celu ułatwienia ewentualnej analizy zamieszczonych listingów podprogramów. 2. Propozycja metody mnoŜenia liczb ze znakiem 2.1. Wyprowadzenie metody Niech A i B oznaczają liczby ze znakiem w kodzie uzupełnienia do dwóch, oznaczanych dalej U2, składających się z n bitów w części całkowitej i m w części ułamkowej. Ilość bitów A i B w ogólnym przypadku moŜe się róŜnić, stąd A(n1, m1) i B(n2, m2). Wartości liczb są określone następująco: n1−2 ~ AU2 = −a n1-1 ⋅ 2 n1−1 + ∑ ai ⋅ 2 i = − a n1-1 ⋅ 2 n1−1 + A B U2 = −bn 2-1 ⋅ 2 n 2 −1 i = − m1 n 2− 2 (1) ~ + ∑ bi ⋅ 2 i = −bn2-1 ⋅ 2 n2−1 + B i =−m2 ~ ~ Symbole A i B reprezentują składową dodatnią liczb A i B. UŜywając oznaczeń jak w (1) iloczyn A i B moŜe być zapisany: ~ ~ AU2 ⋅ BU2 = − an1-1 ⋅ 2n1−1 + A ⋅ − bn2-1 ⋅ 2n2−1 + B = ~ ~ = an1-1 ⋅ 2n1−1 ⋅ bn2-1 ⋅ 2n2−1 + an1-1 ⋅ 2n1−1 ⋅ B + bn2-1 ⋅ 2n2−1 ⋅ A + (2) ~ ~ ~ ~ + A ⋅ B − 2 ⋅ bn2-1 ⋅ 2n2−1 ⋅ A − 2 ⋅ an1-1 ⋅ 2n1−1 ⋅ B = ~ ~ = ABIN ⋅ BBIN − bn2-1 ⋅ 2n2 ⋅ A − an1-1 ⋅ 2n1 ⋅ B = = pseudoiloczyn − (korekcja_ A + korekcja_ B) MoŜna zauwaŜyć, Ŝe wyznaczanie wyniku mnoŜenia odbywa się dwuetapowo. W pierwszym kroku mnoŜone liczby A i B są traktowane jak liczby bez znaku wyraŜone w naturalnym kodzie dwójkowym. Taki wstępny wynik mnoŜenia ABIN·BBIN nazwano “pseudoiloczynem”. Jeśli obie liczby A i B są dodatnich znaków, wówczas “pseudoiloczyn” staje się wynikiem mnoŜenia. W najgorszym przypadku dwie dodatkowe operacje odejmowania są konieczne, nazwane “korekcja_A” i “korekcja_B” w celu otrzymania prawidłowego wyniku. Wspomniane korekcje obliczane są jako iloczyn trzech składników: ( )( ) ~ korekcja _ A = bn 2-1 ⋅ 2 n 2 ⋅ A n1 ~ korekcja _ B = a n1-1 ⋅ 2 ⋅ B (3) Działanie metody zobrazowano przykładem liczbowym. Przykład 1. Wyznaczyć iloczyn liczb A i B wyraŜonych za pomocą najmniejszej ilości bitów. a) A=-8DEC B=-3DEC b) A =-3.5DEC B=+1.5DEC Rozwiązanie A =1000U2 n1=4 m1=0 Rozwiązanie A =100.1U2 n1=3 m1=1 B=101U2 n2=3 m2=0 B=01.10U2 n2=2 m2=2 1 1 0 0 0 = AU2 * 1 0 1 = BU2 * 0 0 0 0 0 0 1 1 0. 1 − 0 0 0 0. 0 1 0 − 1 1 0 0. 0 1 0 1 0. 1 0 1 0 = pseudoiloc zyn 0 = korekcja_A 0 = korekcja_B + 1 0 1 0 0 0 = pseudoiloc zyn − 0 0 0 0 0 0 = korekcja_A − 0 1 0 0 0 0 = korekcja_B 0 1 1 0 0 0 U2 0. 1 = AU2 1 0 = BU2 0 1 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 1. 0 0 0 0 0 1 1 1 0 0 U2 gdzie gdzie korekcja_ A = 1 ⋅ 2 3 ⋅ 000 = 000000 korekcja_ B = 1 ⋅ 2 4 ⋅ 01 = 010000 A _ correction = 0 ⋅ 2 2 ⋅ 00 .1 = 0000 .000 B _ correction = 1 ⋅ 2 3 ⋅ 1.10 = 1100 .000 AU2·B U2=011000U2=+24DEC AU2·B U2=1010.110U2=-5.25DEC 2.2. Implementacja metody W praktycznych zastosowaniach mnoŜone liczby są zwykle przechowywane w pamięci procesora jako stałe lub liczby tego samego formatu, zatem n1=n2=n i m1=m2=m. Równanie (2) przybiera wówczas uproszczoną postać: ~ ~ ~ ~ (4) AU2 ⋅ BU2 = − an-1 ⋅ 2 n −1 + A ⋅ (− bn-1 ⋅ 2 n −1 + B ) = ABIN ⋅ BBIN − 2 n ⋅ bn-1 ⋅ A + a n -1 ⋅ B ( ) ( ) Wymagana liczba bitów wyniku mnoŜenia jest równa 2⋅(n+m), jeśli kaŜda z mnoŜonych liczb jest rozmiaru n+m. Korekcje “pseudoiloczynu” (warunkowe odejmowania, zaleŜne od znaków A i B) są wykonywane wyłącznie na starszej ~ ~ części “pseudoiloczynu”, zgodnie ze wzorem (4), w którym człon bn-1 ⋅ A + an -1 ⋅ B n jest skalowany przez współczynnik 2 . Kolejna moŜliwa redukcja złoŜoności algorytmu wymaga rozwaŜenia kombinacji znaków liczb. Jak zostało zaznaczone wcześniej, jeśli A i B są liczbami dodatnimi korekcje pseudoiloczynu stają się zbyteczne. Natomiast, jeśli liczby są róŜnych znaków, wtedy naleŜy wykonać jedną z dwóch korekcji. Następujące cechy rzeczywistego procesora: stała, określona długość rejestrów, automatyczne wypełnianie zerami bitów o większych wagach od najstarszego bitu, określonego argumentem wejściowym rozkazu procesora pozwalają na dalszą redukcję złoŜoności metody, w kontekście jej implementacji. Jeśli zauwaŜyć dodatkowo, Ŝe najstarszy bit dodatniej liczby w kodzie uzupełnień ~ ~ do dwóch jest równy zero, wtedy A i B w wyraŜeniach na „korekcję_A” i „korekcję_B” mogą być zastąpione przez A i B: (5) AU2 ⋅ BU2 = ABIN ⋅ BBIN − 2 n ⋅ (bn-1 ⋅ A + a n-1 ⋅ B )przy pewnych załoŜeniach Ta sytuacja została pokazana w przykładzie 2, w którym podkreślono bity automatycznie ustawiane przez procesor na zero (zerowane). Przykład 2. Wyznaczyć iloczyn liczb A i B przyjmując n=3 oraz m=1 do wyraŜania wartości liczb. Niech A = -3.5DEC i B = 3.0DEC Rozwiązanie A =100.1U2 B =011.0U2 a) według wzoru (4) + 0 − 0 − 0 1 0 0 0 1 1 1 0 1 0 1 0 1 * 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1. 0. 0. 1. b) według wzoru (5) 0. 1 = AU2 1. 0 = BU2 0 0 1 1 0 0 1 0 = pseudoprod uct 0 = A_correctio n 0 = B_correctio n 0 U2 + 0 − 0 − 0 1 0 0 0 1 1 1 0 1 0 1 0 1 * 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0. 1 = AU2 1. 0 = BU2 0 0 1 1. 0. 0. 1. 1 0 0 1 0 = pseudoprod uct 0 = A_correctio n 0 = B_correctio n 0 U2 gdzie gdzie A _ correction = 0 ⋅ 2 3 ⋅ 00 .1 = 00000 .00 B _ correction = 1 ⋅ 2 3 ⋅ 11 .0 = 11000 .00 A _ correction = 0 ⋅ 2 3 ⋅100.1 = 000000.00 B _ correction = 1 ⋅ 2 3 ⋅ 011.0 = 011000.00 AU2·B U2=110101.10U2=-10.5DEC AU2·B U2=110101.10U2=-10.5DEC Wykonując obliczenia zarówno wg zaleŜności (4) i (5) otrzymano identyczny wynik, zgodnie z oczekiwaniami. Niewielka modyfikacja uczyniona w (4) i pokazana w (5) jest słuszna równieŜ w przypadku, gdy obie liczby są ujemne. PowyŜsze stwierdzenie moŜna udowodnić na podstawie następującej obserwacji. Mianowicie, jeśli bit poŜyczki z najstarszej pozycji wyniku zostanie odrzucony to prawdą jest, Ŝe bit-0-0=bit-1-1=bit (6) Przykład 3 pokazuje zasadę działania proponowanej metody właśnie dla przypadku obu liczb ujemnych. Jak i poprzednio, równieŜ otrzymano prawidłowy wynik zarówno obliczając iloczyn wg wzoru (4) jak i (5). Przykład 3. Wyznaczyć iloczyn liczb A i B przyjmując n=4 i m=0 do wyraŜania wartości liczb. Niech A =-6DEC i B =-3DEC. Rozwiązanie A =1010U2 B =1101U2 a) według wzoru (4) * + 1 − 0 − 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 b) według wzoru (5) 1 0 = AU2 0 1 = B U2 1 0 0 1 0 0 1 0 = pseudoprod uct 0 = A_correctio n 0 = B _correctio n 0 U2 + 1 − 1 − 1 0 1 0 0 1 0 1 0 0 1 0 0 1 * 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 = AU2 0 1 = B U2 1 0 0 0 0 0 0 1 0 0 1 0 = pseudoprod uct 0 = A _correctio n 0 = B_correctio n 0 U2 gdzie gdzie A _ correction = 1 ⋅ 2 4 ⋅ 010 = 0100000 B _ correction = 1 ⋅ 2 4 ⋅ 101 = 0100000 A _ correction = 1 ⋅ 2 4 ⋅ 1010 = 10100000 B _ correction = 1 ⋅ 2 4 ⋅ 1101 = 11010000 AU2·BU2=00010010U2=+18DEC AU2·BU2=00010010U2=+18DEC 3. Porównanie właściwości róŜnych metod 3.1. Metody klasyczne W literaturze znane jest wiele sposobów mnoŜenia liczb ze znakiem realizowanych w technice programowalnych układów cyfrowych [1-10] jak i programowo [11-15]. Z grupy rozwiązań programowych, trzy z wielu moŜliwych zostało wybranych jako metody względem, których zostaną przedyskutowane właściwości metody proponowanej. Są to: • klasyczna metoda Bootha, • metoda rozszerzenia znaku, • metoda konwersji liczb ujemnych na dodatnie. UwaŜna analiza kodu maszynowego wygenerowanego przez kompilatory języków wysokiego poziomu, takie jak: C, BASIC, pokazuje, Ŝe powyŜsze metody są powszechnie uŜywane. Przykładowo, metoda Bootha jest zalecana przez firmę Atmel dla niektórych z jej 8/16 bitowych mikrokontrolerów [16]. Zasada działania wybranych do testowania metod zostanie zaprezentowana skrótowo, gdyŜ zdaniem autora niniejszego artykułu, są one wystarczająco scharakteryzowane w literaturze. Generalnie, oryginalna metoda Bootha [17], jej modyfikacje, np. algorytm McSorley’a [18] i uogólnienie dla kodowania wielobitowego [19] i wiele innych [20-24], są oparte na analizie grupy bitów. Podstawowa metoda Bootha oblicza iloczyn liczb przez cykliczne przesuwanie mnoŜnika i dodawanie lub odejmowanie mnoŜnej, zaleŜnie od kombinacji dwóch sąsiednich bitów mnoŜnika (patrz punkt nr 3 i 4 algorytmu przedstawionego poniŜej). Jedną z moŜliwych implementacji, wyraŜonej w stylu zbliŜonym do języka niskiego poziomu, zaproponowano w [14]: 1. zeruj starszą część wyniku i bit pomocniczy; 2. za młodszą część wyniku przyjmij mnoŜnik; 3. jeśli poprzedni najmłodszy bit mnoŜnika (bit pomocniczy) jest ustawiony, dodaj mnoŜną do starszej części wyniku; 4. jeśli bieŜący najmłodszy bit mnoŜnika jest ustawiony, odejmij mnoŜną od starszej części wyniku; 5. przesuń w prawo młodszą część wyniku, wychodzący bit jest wpisywany do bitu pomocniczego; 6. przesuń w prawo starszą część wyniku z powieleniem bitu znaku (najstarszy bit), wychodzący bit jest wpisywany na pozycję najstarszego bitu młodszej części wyniku; 7. powtarzaj czynności od punktu 3 dla wszystkich bitów mnoŜnika. Działanie powyŜszego algorytmu zobrazowano w przykładzie 4, w którym pomocniczy bit został wyróŜniony podkreśleniem. Co więcej, najmłodszy bit młodszej części wyniku oraz bit pomocniczy są ujęte w nawias klamrowy a ich k wartości są brane pod uwagę w punktach 3 i 4 algorytmu. Symbolem ‘ → ’ oznaczono operację przesunięcia w prawo iloczynu zgodnie z punktem 4, gdzie k jest numerem porządkowym przesunięcia. Przykład 4. Wyznaczyć iloczyn A i B oraz B i A stosując metodę Bootha. Niech A =-3DEC i B =+3DEC Rozwiązanie A =1101U2 a) A·B B =0011U2 b) B·A 0011 = B U2 1101 = AU2 * 0011 = BU2 0000001{10} − 1101 1 0011001{10} → 2 0001100{11} → 0000110{01} + 1101 3 1101110{01} → * 1101 = AU2 0000110 {10} − 0011 1 → 1101110 {10} 1110111 {01} 0011 2 0001111 {01} → 0000111 {10} + − 4 1110111{00} → 11110111U2 0011 3 1101111 {10} → 4 1110111 {11} → 11110111 U2 AU2·B U2= BU2·A U2=11110111U2=-9DEC Metoda rozszerzania znaku polega na zapisaniu mnoŜnej i mnoŜnika za pomocą podwójnej ilości bitów. Dodatkowe bity przyjmują wartość najbardziej znaczącego bitu, czyli dla U2 bitu znaku. Nie powoduje to zmiany wartości liczb. Tak przygotowane liczby, są mnoŜone jak liczby dodatnie bez znaku. Tylko mniej znacząca część wyniku niesie uŜyteczną informację i stanowi prawidłowy wynik mnoŜenia. Starsza część musi być odrzucona. PowyŜszą zasadę ilustruje przykład 5, w którym dodatkowe bity (bity rozszerzenia) zostały podkreślone ‘_’ a nadmiarowe bity wyniku przekreślono ‘/’. Przykład 5. Wyznaczyć iloczyn liczb A i B metodą rozszerzania znaku. Niech A =-4DEC i B =+5DEC. Rozwiązanie A =1100U2 B =0101U2 1 ∗ 0 1 0 0 + 1 1 1 0 0 0 0 1/ 0/ 0/ 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 0 = AU2 0 1 = BU2 0 0 0 0 0 U2 AU2·B U2=11101100U2=-20DEC Metoda zmiany znaku wykorzystuje zasadę konwersji kaŜdej liczby ujemnej do dodatniej. Następnie są one mnoŜone jak liczby dodatnie bez znaku. Jeśli oryginalne znaki mnoŜnej i mnoŜnika były róŜne, naleŜy dodatkowo zmienić znak otrzymanego wyniku tak, aby otrzymać wartość liczby w kodzie uzupełnień do dwóch. Metoda jest intuicyjna i nie wymaga dodatkowego ilustrowania przykładem. 3.2. Przyjęte załoŜenia do analizy porównawczej Porównanie właściwości testowanych algorytmów wymaga przyjęcia załoŜeń, co do architektury procesora, najlepiej abstrakcyjnej maszyny referencyjnej. Z praktycznego punktu widzenia, dobrze byłoby, aby cechy tej maszyny, występowały w wielu rzeczywistych procesorach z wymienionej w rozdziale pierwszym grupy procesorów. W artykule zdecydowano dokonać oceny algorytmów dla architektury zgodnej z listą rozkazów 8051. Podstawową przesłanką, która zdecydowała o wyborze 8051 jako maszyny referencyjnej była jej duŜa popularność i silna pozycja na rynku systemów wbudowanych, przy czym pod pojęciem 8051 naleŜy rozumieć klasyczną architkturę MCS 8051. Analiza działania algorytmów została wykonana przy następujących załoŜeniach: • argumenty wejściowe A i B to liczby 8 bitowe przechowywane w rejestrach A i B; • iloczyn jest przechowywany w parze rejestrów B i A, gdzie B – bardziej znaczący bajt (MSB), A – mniej znaczący bajt (LSB). Podprogramy zostały starannie przygotowane w języku asemblerowym procesora 8051 dla czterech metod, nazwanych: “m_proponowana”, “m_rozszerzania_znaku”, “m_zmiany_znaku” i “m_Bootha”. Zostały one umieszczone w Tabeli 1 wraz ze wspólnym fragmentem kodu, odpowiedzialnym za przygotowanie danych wejściowych w rejestrach A i B. Tabela 1. Listingi podprogramów mnoŜenia liczb ze znakiem w języku asemblerowym mikroprocesora 8051 3.3. Wyniki porównania Obszerność programu musi być brana pod uwagę szczególnie w systemach z niewielką ilością pamięci, stąd rozmiar kodu otrzymanego w wyniku asemblacji kodu źródłowego jest jednym z istotnych ilościowych wskaźników oceny algorytmu. Rozmiar kaŜdego z podprogramów wyraŜony w bajtach został przedstawiony na rys. 1. Metoda proponowana charakteryzuje się najmniejszą zajętością pamięci programu. Rysunek 1. Rozmiar kodu maszynowego, bajty Innym, istotnym wskaźnikiem jest czas wykonania, który jest skorelowany z liczbą cykli mikroprocesora. Ilość cykli została wyznaczona dla zadanych wartości A i B, biorąc pod uwagę moŜliwe kombinacje znaków. Rysunek 2 przedstawia wyniki analizy. Bardzo widoczna róŜnica pomiędzy wynikiem dla metody Bootha a pozostałymi wynika z jej w pełni programowej emulacji. Postałe trzy metody korzystają z rozkazu mnoŜenia liczb bez znaku, realizowanego sprzętowo przez wbudowany w procesor układ mnoŜący. Rysunek 2. Względny czas wykonania (cykle procesora) dla róŜnych kombinacji znaków mnoŜnej i mnoŜnika, gdzie “w.c.” znaczy “worst case (mnoŜnik=-1DEC)” i “b.c.” znaczy “best case (mnoŜnik=0)” Brak wyników „słupków” na rysunku 2, dla niektórych kombinacji znaków mnoŜnej i mnoznika odnośnie metody Bootha, jest spowodowany niemoŜnością wyraŜenia liczby o zadanym znaku dla przyjętego przypadku „w.c.” lub „b.c.”. PoniewaŜ w pewnych przypadkach czas wykonania algorytmu zaleŜy od konkretnych wartości A i B, dodatkowo na rys. 2 przedstawiono wartość przeciętną, liczoną jako średnia arytmetyczna czterech przypadków kombinacji znaków. Jest to wyjątkowo istotne dla metody Bootha, w której niektóre partie kodu maszynowego są wykonywane warunkowo, zaleŜnie od wartości bieŜącego i poprzedniego bitu mnoŜnika. Punkty 3 i 4 metody Bootha (opisanej w podrozdziale 3.1), w kaŜdym obiegu pętli, są pomijane, jeśli mnoŜnik wynosi 0 i są wykonane, jeśli aktualny bit mnoŜnika jest równy 1. Podobnie jak poprzednio, proponowana metoda charakteryzowała się najkrótszym czasem wykonania. Dla niektórych kombinacji znaków czasy były porównywalne jak dla „metody zmiany znaku”. Dodatkowo, na rys. 3 przedstawiono zapotrzebowanie na rejestry mikroprocesora, czy w ogólnym przypadku komórki pamięci wewnętrznej. Jak moŜna zauwaŜyć z rysunku otrzymany wynik dla “metody proponowanej” był nieznacznie gorszy niŜ dla “metody zmiany znaku” a porównywalny z „metodą Bootha”. Rysunek 3. Liczba uŜytych rejestrów (komórek pamięci) procesora 4. Wnioski Na podstawie otrzymanych wartości przyjętych wskaźników oraz właściwości metod mnoŜenia scharakteryzowanych w poprzednim rozdziale moŜna wyciągnąć pewne wnioski. Zaproponowana w artykule metoda charakteryzuje się pewnymi zaletami w porównaniu do innych metod (przy załoŜeniach przyjętych w podrozdziale 3.2.) Oto one: • najmniejszy rozmiar kodu (najmniejsza zajętość pamięci programu); • najkrótszy czas wykonania (najszybsza metoda); • prawidłowy wynik mnoŜenia dla dowolnej kombinacji liczb w przeciwieństwie do metody Bootha, która nie działa prawidłowo dla mnoŜnej postaci 10...0U2; • brak konstrukcji typu „pętla” w przeciwieństwie do metody Bootha; • mniejsza zajętość rejestrów (pamięci w ogólnym przypadku) w porównaniu do metody rozszerzonego znaku. Do wad metody proponowanej naleŜy zaliczyć: • konieczność wykonania dwóch lub mniej korekcji wyniku (odejmowań) “pseudoiloczynu”, będącego wynikiem iloczynu liczb potraktowanych jak liczby bez znaku; • lista rozkazów procesora musi obejmować operację mnoŜenia bez znaku (w przeciwnym razie niezbędna jest jej programowa emulacja); • zmienny czas wykonania (cykle procesora) zaleŜny od kombinacji znaków liczb, przeciwnie niŜ w metodzie rozszerzonego znaku. Z powyŜej wymienionych cech nasuwa się zasadniczy wniosek: Implementacja programowa proponowanej metody mnoŜenia liczb ze znakiem w języku asemblerowym lub pośrednio w językach wysokiego poziomu, np. C, moŜe znacząco zwiększyć wydajność oprogramowania systemów wbudowanych przez zmniejszenie czasu wykonania oraz zajętości pamięci. Metoda nie ma istotnych wad i ograniczeń, stąd moŜe być zastosowana w kaŜdym systemie pod warunkiem, Ŝe procesor posiada w zestawie instrukcji rozkaz mnoŜenia liczb bez znaku. Potencjalny zakres zastosowań metody to systemy wbudowane, w których mnoŜenie arytmetyczne liczb ze znakiem stanowi istotny element oprogramowania, a ryzyko wystąpienia nadmiaru arytmetycznego jest nieakceptowane i w rezultacie wynik mnoŜenia musi być wyraŜony w formacie stałopozycyjnym podwójnej szerokości w stosunku do rozmiaru argumentów wejściowych. Bibliografia [1] Wallace C. S. A suggestion for a fast multiplier. IEEE Trans. Comput. No 13 (2)/1964, 1964, s. 14-17. [2] Dadda L. Some schemes for parallel multiplier. Alta Frequenza, Vol. 34, 1992, s. 349-356. [3] Millar B., Madrid P., Swartzlander E. A fast hybrid multiplier combining booth and Wallace/ DADDA algorithms. The 35th Midwest Symposium on Circuits and Systems, 1992, s. 158-165. [4] Ercegovac M. D., et al. Fast multiplication without carry-propagate addition. IEEE Trans. Comput. Vol. 39, No 11/1990, 1990, s. 1385-1390. [5] Dae Won Kim, Jun Rim Choi. Variable radix-2 multibit coding for 400 Mpixel/s DCT/IDCT of HDTV video decoder. Integration, the VLSI journal, Vol. 35, 2003, s. 47-67. [6] Li C. W., Wah B. W. Optimal bit-level processor arrays for matrix multiplication. Proc. of the 11th International Conference on Systems Engineering, 1996, s. 596-601. [7] Smith S. C., et al. NULL convention multiply and accumulate unit with conditional rounding, scaling, and saturation. Journal of Systems Architecture, Vol. 47, 2002, s. 977-998. [8] da Costa E., Monteiro J., Bampi S. A new array architecture for signed multiplication using Gray encoded radix-2m operands. Integration the VLSI journal, Vol. 40, 2007, s. 118-132. [9] Yu Z., Wasserman L., Willson A. A painless way to reduce power by over 18% in booth-encoded carry-save array multipliers for DSP. Workshop on Signal Processing Systems, 2000, s. 571–580. [10] Baugh C. R., Wooley B. A. A two’s complement parallel array multiplication algorithm. IEEE Transactions on Computers. C-22, December 1973, p. 10451047. [11] Omondi A. R. Computer Arithmetic Systems, Algorithms, Architecture and implementations. Series in Computer Science Prentice-Hall International, Englewood Cliffs, New York, 1994. [12] Parhami B. Computer Arithmetic. Algorithms and Hardware Designs. Oxford University Press, New York, 2000. [13] Koren I. Computer Arithmetic Algorithms. A. K. Peters, Natick, MA, 2002. [14] Gryś S. Arytmetyka komputerów – w praktyce. Wyd. Naukowe PWN, Warszawa, 2007. [15] Biernat J. Metody i układy arytmetyki komputerowej. Wyd. Politechniki Wrocławskiej, Wrocław, 2001. [16] Booth A. D. A signed binary multiplication technique. Journal of Applied Mathematics, Vol. 4, No 2/1951, 1951, s. 236–240. [17] McSorley O.L. High speed arithmetic in binary computers. Proceedings of IRE, January 1961, s. 67-91. [18] Sam H., Gupta A. A generalized multibit coding of two’s complement binary numbers and its proof with application in multiplier implementation. IEEE Trans. Comput., Vol. 39, No 8/1990, 1990, s. 1006-1015. [19] Efstathiou C., Vergos H. Modified booth 1’s complement and modulo 2n-1 multipliers. The 7th IEEE International Conference on Electronics Circuits and Systems, 2000, s. 637-640. [20] Gallagher W., Swartzlander E. High radix booth multipliers using reduced area adder trees. The 28th Asilomar Conference on Signals, Systems and Computers, 1994, s. 545-549. [21] Goldovsky A., et al. Design and implementation of a 16 by 16 lowpower two’s complement multiplier. IEEE Int. Symp. Circuits Syst., 2000, s. 345-348. [22] Seidel P., McFearin L., Matula D. Binary multiplication radix-32 and radix256. 15th Symposium on Computer Arithmetic, 2001, s. 23-32. [23] Cherkauer B., Friedman E. A hybrid radix-4/radix-8 low power, high speed multiplier architecture for wide bit widths. IEEE Int. Symp. Circuits Syst., 1996, s. 53-56. [24] Wang Y., Jiang Y., Sha E. On area-efficient low power array multipliers. The 8th IEEE International Conference on Electronics, Circuits and Systems, 2001, s. 1429-1432.