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

AVR: Jak wykonać dzielenie w assemblerze bez instrukcji DIV?

leoha 18 Sie 2004 22:29 3055 15
REKLAMA
  • #1 801199
    leoha
    Poziom 17  
    Posty: 173
    Pomógł: 18
    Ocena: 8
    Witam !!

    Przejde od razu do rzeczy (btw: programuje w assemblerze):
    ADD - dodaje
    SUB - odejmuje
    MUL - mnozy
    ale nie potrafie znalezc instrukcji dzielenia.. w zwiazku z powyzszym prosba o pomoc ... jak wykonac dzielenie (np dwoch rejestrow)?? ... cos jak DIV w rodzinie '51....

    Z gory dzieki za pomoc
    Pozdrawiam
  • REKLAMA
  • #2 801260
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Może dlatego że nie ma takiej instrukcji? MUL jest chyba tylko w ATmega. Dzielić trzeba tak jak w szkole uczyli (słupkami), można też dzilić odejmująć (wolne ale proste do wymyślenia), oraz przesuwając (tylko dzielić przez potęgi 2).
  • #3 801328
    leoha
    Poziom 17  
    Posty: 173
    Pomógł: 18
    Ocena: 8
    No wlasnie nigdzie nie znalazlem azeby w atmega bylo MUL .... czy jest ktos kto potwierdzi lub zaprzeczy ??
  • REKLAMA
  • #4 801378
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    MUL a ATMega jest, potwierdza to Atmel
  • #5 801402
    leoha
    Poziom 17  
    Posty: 173
    Pomógł: 18
    Ocena: 8
    xitami napisał:
    MUL a ATMega jest, potwierdza to Atmel


    A mozesz podac dokladne "źródło" bo ja jakos tego nie potrafie znalezc ...
  • #6 801494
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    www.atmel.com
    products
    microcontrolers
    avr
    devices
    tu dowolny ATMega
    i .PDF z summary

    no i koniecznie sprawdź "application notes"
    znajdziesz gotowe procedury arytmetyczne
  • REKLAMA
  • #7 801523
    leoha
    Poziom 17  
    Posty: 173
    Pomógł: 18
    Ocena: 8
    A na pewno w każdym ??
    Otwarłem summary w ATmega8 i ........ nie ma albo oślepłem..

    W pdf'ie
    rozdział: Instruction Set Summary
    tabelka: ARITHMETIC AND LOGIC INSTRUCTIONS
    nie ma żadnego dzielenia (DIV)...

    reszte pdf'a przerzałem i milczy na ten temat ....
  • #8 801552
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    czekałem na to że to powiesz ;-)
    zaczołeś od DIV a później napisałeś MUL
    nie potrafi dzielić jedną instrukcją, nie wielu to potrafi, nawet ja bez kalkulatora,
    ale w notach aplikacyjnych znajdziesz procedurki
  • #9 801685
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Przerzuc sie na C.Problemy takie i wiele innych rozwiaza sie same :wink:
  • REKLAMA
  • #10 802051
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    między innymi po to są języki wyższego poziomu.
    ale czasem niema innej możliwości niż assembler
  • #11 802109
    leoha
    Poziom 17  
    Posty: 173
    Pomógł: 18
    Ocena: 8
    Z tym MUL to sie pomylilem powinno byc DIV (ktorych jak juz wiem nie ma w zadnych AVR-ach. Jezeli znowu sie myle to krzyczec)
    Co do jednej z poprzednich wypowiedzi:
    Znam rowniez C i to w nim glownie programuje (naprzemiennie z asm) i tam to jest bez problemu.
    Mnie wlasnie zastanawialo czemu w instrukcjach proca 8051 JEST div a w AVR nie - ale to juz temat na inna dyskusje ( .. myslalem ze cos przeoczylem...)
    Dziekuje tym ktorzy wzieli udzial w dyskusji i Pozdrawiam
    Temat mozna uznac za wyczerpany/zamkniety!
  • #12 802289
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    Cytat:
    Mnie wlasnie zastanawialo czemu w instrukcjach proca 8051 JEST div a w AVR nie - ale to juz temat na inna dyskusje ( .. myslalem ze cos przeoczylem...)


    Moze na inny temat, ale odpowiem... ;)

    AVR to jesr RISC, a 8051 CISC
    i jak sama nazwa RISC (Reduced Instruction Set Computers) ma mala ilosc instrukcji, zato wiekszosc znakow jest wykonywana w jednym cyklu
    CISC (Complex Instruction Set Computers), ma wieksza ilosc instrukcji, za to instrukcej wykonywane sa wolniej

    http://pl.wikipedia.org/wiki/CISC
    http://pl.wikipedia.org/wiki/RISC

    ps: mam nadzieje ze nic nie pokrecilem ;)
  • #15 803133
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    .. jesli szukasz funkcji dzielacych/mnazacych... to najlepiej sciagnij sobie je ze strony atmela...
    Products-->Microcontrollers-->AVR-->Documentation-->Application Notes-->AVR200

    Dostepne sa nastepne dzialania:
    ;* 8x8 bit unsigned
    ;* 8x8 bit signed
    ;* 16x16 bit unsigned
    ;* 16x16 bit signed
    ;* 8/8 bit unsigned
    ;* 8/8 bit signed
    ;* 16/16 bit unsigned
    ;* 16/16 bit signed
  • #16 803368
    sepher
    Poziom 19  
    Posty: 301
    Pomógł: 21
    Ocena: 4
    Pewną pomocą może być instrukcja FMUL -> fractional multiply (o ile jest zaimplementowana w procku, z którego korzystasz). Jeden z czynników mnożenia jest wtedy traktowany jako liczba ułamkowa przedstawiona w następujący sposób (od najstarszego bitu): 2^0+2^(-1) +.... + 2^(-7). Ja używałem tej instrukcji do mnożenia przez zdefiniowany współczynnik skalowania amplitudy do przetwarzania D/A i działało :) Szczegóły znajdziesz choćby w helpie w AVRStudio. Mam nadzieję, że ta informacja będzie przydatna.

Podsumowanie tematu

✨ W architekturze AVR nie istnieje instrukcja dzielenia (DIV), w przeciwieństwie do rodziny 8051, która ją posiada. Mnożenie (MUL) jest dostępne w niektórych modelach AVR, np. w rodzinie ATmega, co potwierdza dokumentacja Atmela. Dzielenie należy realizować programowo, stosując metody takie jak odejmowanie wielokrotne, przesuwanie bitów (dzielenie przez potęgi dwójki) lub algorytmy przypominające dzielenie pisemne. W dokumentacji Atmela, zwłaszcza w Application Notes (np. AVR200), dostępne są gotowe procedury arytmetyczne implementujące dzielenie i mnożenie dla różnych rozmiarów operandów (8x8, 16x16 bit, signed i unsigned). Przykłady i opisy implementacji dzielenia w assemblerze AVR można znaleźć także na stronach takich jak avr-asm-tutorial.net. Architektura AVR jest typu RISC, co oznacza ograniczony zestaw instrukcji, ale szybsze wykonywanie pojedynczych operacji w porównaniu do CISC, jak 8051. W przypadku potrzeby dzielenia w assemblerze AVR, zaleca się korzystanie z gotowych procedur lub przejście na języki wyższego poziomu, np. C, które oferują wbudowane operacje dzielenia.
Wygenerowane przez model językowy.
REKLAMA