16 Bit wert durch 2 teilen

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.