Zwei Dinge solltest du überprüfen:
1. Welche Flags können durch INC verändert werden und welche werden
durch BRMI geprüft?
2. Was steht in deinem Rest? Der wird kein einziges mal verändert.
Ansgar K. schrieb:> Zwei Dinge solltest du überprüfen:>> 1. Welche Flags können durch INC verändert werden und welche werden> durch BRMI geprüft?
Ah, ja das INC das N Flag verändert hatte ich nicht berücksichtigt.
>> 2. Was steht in deinem Rest? Der wird kein einziges mal verändert.
Hm, eigentlich doch jedesmal am Anfang von div10:
mov rest, divident
EDIT:
so müsste es doch dann klappen, oder?
Stimmt, da hatte ich einen kleinen Denkfehler was den Rest angeht - das
funktioniert tatsächlich so, ist aber umständlich.
Dein neuer Code sollte so gut funktionieren, falls es dir nicht um
maximale Geschwindigkeit geht. Falls doch, solltest du dir einmal den
Vorschlag von Spess angucken, er braucht in seiner Schleife nur 4 statt
deiner 7 Zyklen.
Noch schneller wäre eine Multiplikation mit 0.1, falls ein
Hardwaremultiplizierer zur Verfügung steht. In 99% der Fälle dürfte
deine Lösung aber gute Dienste leisten.
Spess53 schrieb:> Hi>> Korrektur:>> add rest,10 -> subi rest, -10>> MfG Spess
Ich habe mir den Spess Code mal angeguckt und auch verstanden.
Aber warum kein add ?
Weil man das nur auf zwei Register anwenden kann?
wenn ich jetzt noch ein Register als divident definieren und mit 10
laden würde, könnte ich doch auch add nehmen, oder?
und dann halt SUB statt SUBI
Hi
>Weil man das nur auf zwei Register anwenden kann?
Richtig.
>wenn ich jetzt noch ein Register als divident definieren und mit 10>laden würde, könnte ich doch auch add nehmen, oder?
Wozu? Das 'subi' erfüllt seinen Zweck.
>wenn ich jetzt noch ein Register als divident definieren und mit 10>laden würde, könnte ich doch auch add nehmen, oder?>und dann halt SUB statt SUBI
Was hast du davon?
MfG Spess
nochmal ich ;)
bin grad doch etwas verwirrt
In der Beschreibung von SUBI und SUB steht ja
"Das C-Flag wird gesetzt, wenn der absolute Wert der Konstante größer
als der absolute Wert von Rd ist, andernfalls wird es gelöscht."
müsste man dann bei verwendung von BRCC nicht die Addition nach der
Schleife weglassen? (ergbnis am Anfang = 0)
EDIT:
oder bezieht sich die Beschreibung auf die Registerinhalte vor der
Subtraktion?
Hi
>(ergbnis am Anfang = 0)
Ergebnis am Anfang ist -1 -> ldi ergebnis,-1
Dann folgt ein inc ergebnis -> ergebnis=0
Danach die Subtraktion. Wenn Rest<10 ist wird das Carry-Flag gesetzt und
nicht wieder nach 'div10' gesprungen. Ergebnis hat damit den richtigen
Wert und mit 'subi rest, -10' wird die letzte Subtraktion rückgängig
gemacht.
MfG Spess
ich glaube mein Denkfehler war, dass ich dachte der Vergleich zwichen
rest und 10 zum setzen des Carry Flags wird mit dem Inhalt den reset
NACH der Subtraktion hat gemacht, kann das sein?
also:
z.B. rest = 12
12 - 10 = 2 --> 2 < 10 --> C-Flag = 1
aber es ist
12 > 10 -- > C-Flag = 0
Hi
>ok, hab ich wohl zu kompliziert gedacht ;)
Kommt vor. Wenn du breq/ne/cc/cs richtig verstanden hast, kannst du
damit 99,... aller Fälle erschlagen.
MfG Spess