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.

XMega 128A1 - mnożenie i dzielenie liczb ośmiobitowych a asm

ASMnauka_ 02 Gru 2016 16:58 675 13
  • #1 02 Gru 2016 16:58
    ASMnauka_
    Poziom 14  

    Cześć
    Napotkałem taki oto problem.

    Kod: armasm
    Zaloguj się, aby zobaczyć kod

    W przypadku, gdy mnożna jest nie parzysta wynik jest zaniżany.
    Natomiast jeśli mnożna jest parzysta wynik jest prawidłowy.
    Co może być przyczyną tego problemu ?

    0 13
  • Pomocny post
    #2 02 Gru 2016 18:24
    2675900
    Użytkownik usunął konto  
  • #3 02 Gru 2016 19:56
    ASMnauka_
    Poziom 14  

    Piotrus_999, dziękuję za przykłady.
    Okazało się , że problemem w tym przypadku jest dzielenie.

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    15 * 25 = 375
    375 : 8 = 46,875
    Prawdopodobnie trzeba użyć MODULO.
    Nie wiem, jak to napisać w asm :(

    0
  • Pomocny post
    #4 02 Gru 2016 20:41
    2675900
    Użytkownik usunął konto  
  • #5 03 Gru 2016 09:41
    ASMnauka_
    Poziom 14  

    Piotrus_999, ponownie dziękuję za przykłady.
    W tym przypadku:

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    mnożę liczbę 16 * 25
    Wynik to 375
    następnie dzielę wynik przez 8:
    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    Wynik dzielenia to 46,875.
    Tak więc ratuje mnie Modulo (zaokrąglenie tej liczby do 47).

    0
  • #6 03 Gru 2016 10:42
    excray
    Poziom 39  

    Dzielenie przez 8 to nic innego jak przesunięcie o 8 bitów w prawo, czyli w przypadku 8-bitowych procesorów wywalenie najmłodszego bajta wyniku. Jeśli chcesz jednocześnie zaokrąglić wszystko powyżej x,5 w górę to 7 razy przesuń w prawo a następnie dodaj 0b1 do otrzymanej wartości po czym jeszcze raz przesuń w prawo. W praktyce lepiej wykonać to przesuwając wynik raz w lewo (uwaga na najstarszy bit), wywalić najmłodszy bajt, dodać 0b1 do wyniku i przesunąć go raz w prawo.

    0
  • #7 03 Gru 2016 10:46
    tmf
    Moderator Mikrokontrolery Projektowanie

    excray napisał:
    Dzielenie przez 8 to nic innego jak przesunięcie o 8 bitów w prawo, czyli w przypadku 8-bitowych procesorów wywalenie najmłodszego bajta wyniku.


    Dzielenie prze 8 to nie przesunięcie o 8 bitów w prawo, tylko o 3 bity.

    Do autora: dzielnie wlaczysz, tracisz czas, a na końcu koledzy podsyłają ci funkcje arytmetyczne zaimplementowane w C. Jaki jest więc sens pisać w asemblerze?

    0
  • #8 03 Gru 2016 11:13
    2675900
    Użytkownik usunął konto  
  • #9 03 Gru 2016 11:15
    ASMnauka_
    Poziom 14  

    tmf napisał:
    Dzielenie prze 8 to nie przesunięcie o 8 bitów w prawo, tylko o 3 bity.
    Tak jest !!!
    Trzy razy LSR
    tmf napisał:
    Do autora: dzielnie wlaczysz, tracisz czas, a na końcu koledzy podsyłają ci funkcje arytmetyczne zaimplementowane w C. Jaki jest więc sens pisać w asemblerze?
    Już kiedyś napisałem.
    Nie potrafię iść na gotowe.
    W tym przypadku pomoże mi modulo.

    0
  • #10 03 Gru 2016 11:21
    2675900
    Użytkownik usunął konto  
  • #11 03 Gru 2016 11:24
    excray
    Poziom 39  

    Sobota to trochę ciężki dzień na myślenie, ze względu na poprzedzający ją piątek. Jak słusznie zauważyliście trzy razy w prawo. Niemniej idea niewiele się zmienia. Przesuwasz 2 razy w prawo, dodajesz 1 i uzyskany wynik jeszcze raz przesuwasz w prawo. W ten sposób uzyskujesz zaokrąglenie przy dzieleniu przez 8.

    0
  • #12 03 Gru 2016 11:36
    ASMnauka_
    Poziom 14  

    Piotrus_999 napisał:
    nie do konca bo dana jest 16 bitowa.

    Miałem na myśli liczbę 8 bitową.
    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    80 : 8 = 10
    Piotrus_999 napisał:
    Nie można iść na gotowe.

    Przed chwila napisałem, że nie chcę iść na gotowe,
    Wystarczy mi, jeśli ktoś przedstawi mi wskazówki jak rozwiązać problem.

    0
  • Pomocny post
    #13 03 Gru 2016 11:41
    excray
    Poziom 39  

    Piotrus_999 napisał:
    Była impreza rozumiem

    I to w najbardziej nieludzkim formacie - wyjście firmowe :-)
    ASMnauka_ napisał:
    Przed chwila napisałem, że nie chcę iść na gotowe,
    Wystarczy mi, jeśli ktoś przedstawi mi wskazówki jak rozwiązać problem.

    excray napisał:
    Przesuwasz 2 razy w prawo, dodajesz 1 i uzyskany wynik jeszcze raz przesuwasz w prawo. W ten sposób uzyskujesz zaokrąglenie przy dzieleniu przez 8.

    0