logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

ASMnauka_ 02 Gru 2016 16:58 969 13
REKLAMA
  • #1 16100069
    ASMnauka_
    Poziom 15  
    Cześć
    Napotkałem taki oto problem.
    Kod: ARM assembler
    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 ?
  • REKLAMA
  • Pomocny post
    #2 16100258
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #4 16100486
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16101383
    ASMnauka_
    Poziom 15  
    Piotrus_999, ponownie dziękuję za przykłady.
    W tym przypadku:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

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

    Wynik dzielenia to 46,875.
    Tak więc ratuje mnie Modulo (zaokrąglenie tej liczby do 47).
  • #6 16101465
    excray
    Poziom 41  
    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.
  • REKLAMA
  • #7 16101475
    tmf
    VIP Zasłużony dla elektroda
    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?
  • REKLAMA
  • #8 16101510
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16101517
    ASMnauka_
    Poziom 15  
    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.
  • #10 16101528
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16101536
    excray
    Poziom 41  
    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.
  • #12 16101557
    ASMnauka_
    Poziom 15  
    Piotrus_999 napisał:
    nie do konca bo dana jest 16 bitowa.

    Miałem na myśli liczbę 8 bitową.
    Kod: AVR assembler
    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.
  • Pomocny post
    #13 16101564
    excray
    Poziom 41  
    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.
REKLAMA