Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Mnożenie ułamkowe w asemblerze.

piheevo 07 Lip 2006 10:07 813 3
  • #1 07 Lip 2006 10:07
    piheevo
    Poziom 10  

    Witam wszystkich bardzo serdecznie. Jestem dość nowy i mam nadzieje, że nie urażę niczyich ambicji tym tematem.
    Podobny był wprawdzie już poruszony ale nieco jednak "z innej beczki"
    Przeszukałem zasoby internetu i nie znalazłem jednoznacznej odpowiedzi na temat mnożenia ułamków.
    Oto mój problem:
    Chcę obliczyć funkcję typu:

    y = -0,5513x2 + 10,1564x1 + 10,0109x0

    i wyświetlić wynik na wyświetlaczu LCD (2x16-klasyka) w odstępie 1 sekundy - znam podstawowe procedury obsługi wyświetlacza.
    x - czas , x=(0...255), Więcej nie potrzebuję.

    Nie chodzi o to, by ktoś to zrobił za mnie. Wiem, że w notach katalogowych są funkcje mnożące, ale mam kilka pytań:

    1. Człon pierwszy - x2.
    Wynik mnożenia "mul" zapisany zostaje na 2 bajtach. Jak wymnożyć to przez liczbę ułamkową? W ilu rejestrach zostanie zapisany wynik? I czy jest to wogóle możliwe?
    2. Skąd procesor wie, że kombinacja bitów reprezentuje liczbę ułamkową?
    3. Z tego, co zauważyłem po wymnożeniu stałej przez ułamek
    poprzez "fmul" wynik zapisany zostaje na 2 bajtach, z których starszy to liczba calkowita, a młodszy - ułamkowa. Działa.
    Przypuszczam, że po wymnożeniu dwubajtowej liczby przez ułamek wynik nie zostanie zapisany w 3 rejestrach, gdzie najmłodszy to cz. ułamkowa?
    Mam rację?
    4. Jak do tego wszystkiego ma się "fmuls"?
    Dziekuje bardzo serdecznie za zaangażowanie w problem

    0 3
  • #2 07 Lip 2006 13:16
    Zaquadnik
    Poziom 27  

    Rozumiem, że korzystasz z jakiegoś AVRka (po rozkazach wnioskuję). Proponowałbym Tobie zapisać liczbę w postaci zmiennoprzecinkowej, czyli bit znaku + mantysa + wykładnik. Wówczas mantysy mnożysz normalnie, a wykładniki dodajesz (zapomniałem dodać, że wykładnik zapisujesz jako liczbę w kodzie U2) :) No a bity znaku zwyczajnie XORujesz ze sobą, aby otrzymać znak wyniku ;)
    Pozdrawiam :)

    0
  • #3 07 Lip 2006 14:25
    piheevo
    Poziom 10  

    Faktycznie zapomniałem dodać, że pracuję na ATMega 16, piszę w asemblerze. Zapoznam sie z problemem i na pewno wrócę z pytaniami, chyba, że ktoś podrzuci inny (bardziej przyswajalny) problem :)
    Czy "to" można zrobić w ATMegach, bo gdzieś obiło mi sie o uszy, że l. zmiennoprzecinkowe, to raczej trudno zaimplementować.
    Dzieki. We'll be in touch.

    0
  • #4 07 Lip 2006 14:45
    Zaquadnik
    Poziom 27  

    Nie ma najmniejszego problemu, choć oczywiście to wydłuży obliczenia. W sumie to Ty decydujesz o tym, co chowasz w rejestrach :] Moim zdaniem, mimo, że to strasznie wygląda, jest to rozwiązanie dość proste i skuteczne. Mantysę bowiem zapisujesz jako liczbę całkowitą.
    Pozdrawiam :)

    0