Hallo.
Manchmal, insbesondere wenn man eine Zahl in Dezimalstellen zerhacken will, benötigt man sowohl den Quotienten als auch den Rest einer ganzzahligen Division.
In der Praxis sieht man dann oft solche Code-Stücke:
Jetzt erinnern wir uns an die Schriftliche Division aus der Grundschule:
BASCOM macht quasi dasselbe, nur eben binär. Das ganzzahlige Ergebnis hier wäre also die "149".
Der Rest "4" ist auch vorhanden - wo läßt BASCOM den?
Das kommt darauf an:
Indem man das/die Register sofort nach der Division in die entsprechende Variable schreiben läßt.
Bei Bytes also:
CodeBox BascomAVR
Bei Words/Integern:
CodeBox BascomAVR
Bei Long zusätzlich noch R18 und R19 "Storen"
Somit sollte sich der Code von oben, den @Thorsten_Sch uns freundlicherweise bereitgestellt hatte, wie folgt vereinfachen lassen:
CodeBox BascomAVR
Nur noch drei Divisionen.
P.S. @dino03 : Kannst Du diesen Beitrag bitte in die FAQ-Übersicht aufnehmen?
Manchmal, insbesondere wenn man eine Zahl in Dezimalstellen zerhacken will, benötigt man sowohl den Quotienten als auch den Rest einer ganzzahligen Division.
In der Praxis sieht man dann oft solche Code-Stücke:
Man erkennt also: bei n-Stellen sind es n Modulo-Divisionen und n-1 Divisionen (die n-1 Subtraktionen sind hier unnötig).
CodeBox BascomAVR'Zahl zerlegen in Zehner und Einer: Beispiel Zahl_temp = Zahl '1234 Einer = Zahl_temp Mod 10 '4 Zahl_temp = Zahl_temp - Einer '1230 Zahl_temp = Zahl_temp / 10 '123 Zehner = Zahl_temp Mod 10 '3 Zahl_temp = Zahl_temp - Zehner '120 Zahl_temp = Zahl_temp / 10 '12 Hunderter = Zahl_temp Mod 10 '2 Zahl_temp = Zahl_temp - Hunderter '10 Zahl_temp = Zahl_temp / 10 '1 Tausender = Zahl_temp Mod 10 '1
Jetzt erinnern wir uns an die Schriftliche Division aus der Grundschule:
Code:
2537 : 17 =
Code:
2537 : 17 = 1
Code:
2537 : 17 = 1
17
--
08
Code:
2537 : 17 = 1
17
--
083
Code:
2537 : 17 = 14
17
--
083
68
--
15
Code:
2537 : 17 = 149
17
--
083
68
--
157
153
---
4
Der Rest "4" ist auch vorhanden - wo läßt BASCOM den?
Das kommt darauf an:
- werden Bytes dividiert, läßt BASCOM den Rest in Register 24 liegen (den Quotienten in Register 16)
- bei Words und Integern verbleibt der Rest in den Registern 17..16 (MSB..LSB) (der Quotient in R21..R20)
- bei Long verbleibt der Rest in den Registern 19..16 (MSB..LSB) (der Quotient in R23..R20)
Indem man das/die Register sofort nach der Division in die entsprechende Variable schreiben läßt.
Bei Bytes also:
CodeBox BascomAVR
Quotient=Divident\Divisor STS {Rest}, R24
Bei Words/Integern:
CodeBox BascomAVR
Quotient = Divident \ Divisor STS {rest}, r16 STS {rest+1}, r17
Bei Long zusätzlich noch R18 und R19 "Storen"
Somit sollte sich der Code von oben, den @Thorsten_Sch uns freundlicherweise bereitgestellt hatte, wie folgt vereinfachen lassen:
CodeBox BascomAVR
Tausender=Zahl_temp\10 STS {Einer}, R16 STS {Einer+1}, R17 Tausender=Tausender\10 STS {Zehner}, R16 STS {Zehner+1}, R17 Tausender=Tausender\10 STS {Hunderter}, R16 STS {Hunderter+1}, R17
Nur noch drei Divisionen.
P.S. @dino03 : Kannst Du diesen Beitrag bitte in die FAQ-Übersicht aufnehmen?
Zuletzt bearbeitet: