Philipp83
09.05.2006, 21:14
Hallo!
ich habe folgendes programm bekommen, allerdings gibt es bei manchen
werten falsche erbegnisse aus. woran kann es liegen?
z.b. EA60 / 1388 = 4 anstatt C wobei
EA60 / 1300 = C den richtigen wert ausgibt
ich bin auch über programme die das gleiche leisten sehr dankbar
.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
ich habe folgendes programm bekommen, allerdings gibt es bei manchen
werten falsche erbegnisse aus. woran kann es liegen?
z.b. EA60 / 1388 = 4 anstatt C wobei
EA60 / 1300 = C den richtigen wert ausgibt
ich bin auch über programme die das gleiche leisten sehr dankbar
.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