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
Gast
#810585
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
Gast
#810587
Kann zwar kein assembler, aber da gibts doch sicher auch nen right shift ? shr 1 ?
Gast
#810588
Achtung: das funktioniert so nur für unsigned 16 Bit Werte.
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)...
lsr TempH ror TempL spart das vorherige Löschen des Carry-Flags.
Gast
#810594
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
siehe oben ;-)
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 ...
Gast
#810600
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 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Gast
#810608
@ Travel Rec.
>siehe oben ;-)
Siehe Uhrzeit ;-))
Luther Blissett wrote:
>1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Gast
#810619
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?
Gast
#810621
Hmm... in der Instruktionen-Liste vom ATmega8 steht nichma drinne, dass "lsr" übers Carry geht. Wird wohln Typo sein.
Steht in der Assembler Übersicht in der AVR-Studio4 online-Hilfe.
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.
Gast
#810677
@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?
Nö, ist richtig.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.