hallo, ich versuche gerade einen 16 Bit wert der in 2 Registern steht durch 2teilen. Hab das einfach so gemacht lsr templ lsr temph das scheint aber doch nicht so einfach zu sein. denn wenn temph = 1 dann wird 0 daraus
Vorsicht: wenn du das obere Register nach rechts schiebst, muss ja das niedrigste Bit desselben wieder im unteren Register auftauchen!!! Probiers mal mit [avrasm] clc ; Carry = 0 ror TEMPH ror TEMPL [/avrasm
Kann zwar kein assembler, aber da gibts doch sicher auch nen right shift ? shr 1 ?
René Schink wrote: > hallo, > > ich versuche gerade einen 16 Bit wert der in 2 Registern steht durch > 2teilen. > > Hab das einfach so gemacht > > lsr templ > lsr temph Wenn Du einen Wert nach rechts schieben willst, dann muss das Carry-Flag berücksichtigt werden. Deshalb ist lsr hier der falsche Befehl. Dafür musst Du ror verwenden, und dann erst das High-Byte und direkt danach das Low-Byte schieben > das scheint aber doch nicht so einfach zu sein. > > denn wenn temph = 1 dann wird 0 daraus Ist doch korrekt: Eins geteilt durch zwei ist nunmal Null... Das ist eine ganzzahlige Division, bei der ist das eben so. Der µC schaut, wie oft die Zwei in die Eins reinpasst, und das ist eben Null mal... Wenn Du runden willst, musst Du das "von Hand" machen (z.B. indem Du vor der Division die Hälfte des Divisors, in diesem Fall also eine 1, hinzuaddierst)...
Ich kenne die genauen Assembler-Befehle jetzt nicht (AVR?) Aber Du musst letztendlich das High-Byte nach rechts schieben, dabei das LSB ins Carry übertragen lassen und beim Low-Byte dasselbe, jedoch muss das Carry-Bit beim rechts schieben ins MSB reingeschoben werden. Schau Dir mal die instruction set für Deinen µC an
Travel Rec. wrote: > lsr TempH > ror TempL > > spart das vorherige Löschen des Carry-Flags. Richtig. Das ist die sinnvollste Methode. Wichtig ist eben, dass das, weas beim Rechts-Schieben hinten aus dem High-Byte rausfällt vorne ins Low-Byte reingeschoben wird. Und das macht ror ...
Nochmal zur Zusammenfassung: unsigned 16 Bit: LSR temp_hi ROR temp_lo signed 16 bit: ASR temp_hi ROR temp_lo
... wrote: > Nochmal zur Zusammenfassung: > [...] So steht es auch als Beispiel in der Befehlssatzdokumentation vom AVR-Assembler (z.B. in der AVRStudio-Hilfe)
René Schink wrote: > hallo, > > ich versuche gerade einen 16 Bit wert der in 2 Registern steht durch > 2teilen. > > Hab das einfach so gemacht > > lsr templ > lsr temph > > das scheint aber doch nicht so einfach zu sein. > > denn wenn temph = 1 dann wird 0 daraus
1 | | *2 /2 |
2 | ----+------------------- |
3 | mit | lsl l asr h |
4 | VZ | rol h ror l |
5 | | |
6 | ohne| lsl l lsr h |
7 | VZ | rol l ror l |
Luther Blissett wrote:
>
1 | > | *2 /2 |
2 | > ----+------------------- |
3 | > mit | lsl l asr h |
4 | > VZ | rol h ror l |
5 | > | |
6 | > ohne| lsl l lsr h |
7 | > VZ | rol l ror l |
8 | ^^^^^ |
9 | rol h natürlich |
10 | > |
Reicht es nicht, wenn einer die richte Antwort postet? Ich kenne auch die Lösung und das sogar für 32Bit. Soll ich das hier auch noch posten?
Hmm... in der Instruktionen-Liste vom ATmega8 steht nichma drinne, dass "lsr" übers Carry geht. Wird wohln Typo sein.
Gast wrote:
> Reicht es nicht, wenn einer die richte Antwort postet?
Das kommt nunmal vor, daß während man noch schreibt, andere die Frage
schon beantworten.
Sven Pauli wrote: > Hmm... in der Instruktionen-Liste vom ATmega8 steht nichma drinne, dass > "lsr" übers Carry geht. Wird wohln Typo sein. Was für ne Datenblattversion haste denn? Bei mir steht das "C" unter "Flags" korrekt drin...
Gast wrote: > Ich kenne auch die Lösung und das sogar für 32Bit. Soll ich das hier > auch noch posten? Nein, kannste Dir echt sparen. Dein Posting an sich ist schon überflüssig wie ein Kropf.
@Johannes: Ja, das "C" steht auch unter Flags. Aber bei "ror" steht in der Vorschrift z.B. genau drin: "C <- Rd(0)"
Sven Pauli wrote: > @Johannes: Ja, das "C" steht auch unter Flags. Aber bei "ror" steht in > der Vorschrift z.B. genau drin: "C <- Rd(0)" Ach, so meinstest Du das... Stimmt natürlich, hätte man entweder bei beiden weglassen oder bei beiden hinschreiben können...
... und durch 4 ist dann lsr TempH ror TempL ;/2 lsr TempH ror TempL ;/4 oder sehe ich das verkehrt?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.