Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Dzielenie ASM Atmega32 (lub inna Atmega)
SP5FCS Offline
Adam
*****

Liczba postów: 1,071
Dołączył: 02-02-2009
Post: #3
RE: Dzielenie ASM Atmega32 (lub inna Atmega)
Przykładowy kod procedury dzielenia na liczbach 16 bitowych z komentarzami. Pełny program testowy do symulacji w AVR Studio w pliku załącznika. Przed analizą kodu warto zapoznać się z opisem poszczególnych rozkazów procesora oraz metodyką dzielenia w oparciu o przesuwanie i odejmowanie dzielnika.
W przypadku programowania w asseblerze musimy opanować trzy dziedziny wiedzy:
- dokładnie poznać zasoby programowanego procesora;
- poznać listę rozkazów procesora;
- poznać techniki realizacji różnych algorytmów, funkcji

Jak widać kod jest dość złożony (w Bacomie czy C to jedna linijka), wymaga znajomości kilkunastu rozkazów procesora oraz algorytmu dzielenia. Jest to oczywiście koszt jednostkowy, raz napisana i przetestowana procedura będzie do wykorzystania w wielu innych projektach. W zamian za większy nakład pracy dostajemy pełną swobodę tworzenia kodu bez ograniczeń wynikających np. ze składni języka wysokopoziomowego.

Kod:
;---------------------------------------------------------------------
;dzielenie uint16 / uint16
;---------------------------------------------------------------------
;[r27,r26] - dzielna
;[r31,r30] - dzielnik
;[r27,r26]=[r27,r26] / [r31,r30],   reszta z dzielenia w [r1,r0]

DIV_U16:
    CLR  R0                ;zerowanie reszty
    CLR  R1
    LDI  R25,16            ;ile bitow ma zmienna (licznik petli)

DIV_U16_1:                ;glowna petla obliczen
    LSL  R26            ;przesuwanie dzielnej z resztą (32bity) w lewo
    ROL  R27
    ROL  R0
    ROL  R1
    SUB  R0,R30            ;odejmowanie dzielnika od reszty
    SBC  R1,R31
    BRCC DIV_U16_2        ;czy reszta >= dzielnik

    ADD  R0,R30            ;nie możemy odjac, reszta jest mniejsza od dzielnika
    ADC  R1,R31            ;przywroc wartosc reszty przez dodanie
    RJMP DIV_U16_3

DIV_U16_2:                
    SBR  R26,1            ;poprawne odejmowanie, ustaw 1 w wyniku dzilenia

DIV_U16_3:
    DEC  R25            ;zmniejsz licznik petli
    BRNE DIV_U16_1        ;czy to ostatnia petla obliczen?, nie na poczatek petli

    ;koniec obliczen, wynik w [r27,r26] reszta w [r1,r0]
    RET                    ;powrot z procedury


Załączone pliki
.zip  test_div16.zip (Rozmiar: 6.86 KB / Pobrań: 872)

73 Adam
05-04-2012 21:55
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Dzielenie ASM Atmega32 (lub inna Atmega) - SP5FCS - 05-04-2012 21:55

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości