-
-
RN-Premium User
Begeisterter Techniker
Hallo Philipp,
das ist beim AVR nur mit guter Handarbeit zu erledigen. Hab mal eben ein Muster zusammengeschusselt, ich denke es sollte funktioneren - aber vorher unbedingt testen - ich will nicht schuld sein, wenn deine Bombe zufrüh hochgeht weil die Rechnung nicht stimmt :-D
.def rd1hh=r16
.def rd1h=r17
.def rd1l=r18
.def rd2h=r19
.def rd2l=r20
.def rd1ul=r21
.def rd1uh=r22
.def rehh=r23
.def reh=r24
.def rel=r25
div:
ldi rd1hh, 0x4c
ldi rd1h, 0x4b
ldi rd1l, 0x40
ldi rd2h, 0x8e
ldi rd2l, 0x94
clr rd1ul ;Hilfsregister
clr rd1uh
clr rehh ; Ergebnis rehh:reh:rel
clr reh ;
clr rel ; (Ergebnisregister dient auch als
inc rel ; Zähler bis 24! Bit 1 auf 1 setzen) diese 1 wird immer weiter nach links geschoben, wenn sie
; rauskommt sind wir fertig
;
; Hier beginnt die Divisionsschleife
;
div1:
clc ; Carry-Bit leeren
rol rd1l ; nächsthöheres Bit des Dividenten
rol rd1h ; in das Hilfsregister rotieren
rol rd1hh ;
rol rd1ul ;
rol rd1uh ;
brcs div2 ; Eine 1 ist herausgerollt, ziehe ab
cp rd1uh, rd2h
brcs div3
cp rd1ul,rd2l ; Divisionsergebnis 1 oder 0?
brcs div3 ; Überspringe Subtraktion, wenn kleiner
div2:
sub rd1ul,rd2l ; Subtrahiere Divisor
sbc rd1uh,rd2h
sec ; Setze carry-bit, Ergebnis ist eine 1
rjmp div4 ; zum Schieben des Ergebnisses
div3:
clc ; Lösche carry-bit, Ergebnis ist eine 0
div4:
rol rel ; Rotiere carry-bit in das Ergebnis
rol reh
rol rehh
brcc div1 ; solange Nullen aus dem Ergebnis
; rotieren: weitermachen
Zum erklären: am besten AVR Studio runterladen (vielleicht hast dus ja schon) und simulieren und beobachten - dann verstehen versuchen.
Im Prinzip schiebt man die 5000000 nach links raus in 2 Hilfsregister und schaut, ob man davon schon die 36500 abziehen kann. Wenn ja, ins Ergebnis eine 1 schieben sonst eine 0. Ein Sonderfall kann eintreten, nämlich das beim Hilfsregister auch eine 1 rauskommt. Die kannst du dann gleich ins Ergebnis schieben.
Wie gesagt, simulieren und studieren, dann klappts auch mit dem Assembler
.
Das ganze oben ist natürlich jetzt ziemlich roh, in eine Unterroutine verpackt kannst du da noch einige Register einsparen (push / pop) werte aus dem Ram holen etc. Mußt dir halt eine gute Schnittstelle überlegen je nach Anwendung.
Was wirds wenns fertig ist?
lg
Alex
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen