Forum: Mikrocontroller und Digitale Elektronik 16 Bit wert durch 2 teilen


von R--- S. (rene66)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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

von Michael K. (Gast)


Lesenswert?

Kann zwar kein assembler, aber da gibts doch sicher auch nen right shift 
?

shr 1 ?

von ... (Gast)


Lesenswert?

Achtung: das funktioniert so nur für unsigned 16 Bit Werte.

von Johannes M. (johnny-m)


Lesenswert?

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)...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

lsr TempH
ror TempL

spart das vorherige Löschen des Carry-Flags.

von Stefan (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

siehe oben ;-)

von Johannes M. (johnny-m)


Lesenswert?

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 ...

von ... (Gast)


Lesenswert?

Nochmal zur Zusammenfassung:

unsigned 16 Bit:

LSR temp_hi
ROR temp_lo

signed 16 bit:

ASR temp_hi
ROR temp_lo

von Johannes M. (johnny-m)


Lesenswert?

... wrote:
> Nochmal zur Zusammenfassung:
> [...]
So steht es auch als Beispiel in der Befehlssatzdokumentation vom 
AVR-Assembler (z.B. in der AVRStudio-Hilfe)

von Luther B. (luther-blissett)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

@ Travel Rec.
>siehe oben ;-)

Siehe Uhrzeit ;-))

von Luther B. (luther-blissett)


Lesenswert?

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
>

von Gast (Gast)


Lesenswert?

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?

von Sven P. (Gast)


Lesenswert?

Hmm... in der Instruktionen-Liste vom ATmega8 steht nichma drinne, dass 
"lsr" übers Carry geht. Wird wohln Typo sein.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Steht in der Assembler Übersicht in der AVR-Studio4 online-Hilfe.

von Luther B. (luther-blissett)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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...

von Johannes M. (johnny-m)


Lesenswert?

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.

von Sven P. (Gast)


Lesenswert?

@Johannes: Ja, das "C" steht auch unter Flags. Aber bei "ror" steht in 
der Vorschrift z.B. genau drin: "C <- Rd(0)"

von Johannes M. (johnny-m)


Lesenswert?

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...

von R--- S. (rene66)


Lesenswert?

...

und durch 4 ist dann
  lsr TempH
  ror TempL ;/2

  lsr TempH
  ror TempL ;/4

oder sehe ich das verkehrt?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Nö, ist richtig.

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
Noch kein Account? Hier anmelden.