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