16bit Zahl Shiften beim ATMega8 (8bit MCU)

Gast #236203
Lesenswert?
• ▲
▼
Hallo allerseits,

ich habe folgendes Problem:
Ich lade eine 16bit Zahl in zwei Register (Highbyte und Lowbyte)
Diese möchte ich nun mit dem Befehl lsl (logical shift left)
verschieben. Allderdings ist die Zahl in zwei Bytes, der Befehl lsl
lässt jedoch sich nur auf ein Register anwenden.
Hat jemand zu diesem Problem eine Lösung?

Hier noch kurz der Assembler-Code Auszug:

ldi r16, LOW(10000)
ldi r17 HIGH(10000)

Das gleiche Problem stellt sich dann z.B. bei den Befehlen add
(Addieren) oder sub (Subtrahieren).
Das ganze brauche ich für eine Multiplikationsroutine von zwei 16 bit
Zahlen.
Die ApNote AVR200 oder www.avr-asm-tutorial.net behandeln
diese Themen leider nur schematisch.
Vielen Dank schon mal für Anregungen oder CodeZeilen.

Gruß
Jan Purrucker
Gast #236204
Lesenswert?
• ▲
▼
Hallo nochmal,

ich habe noch vergessen, dass der ATMEGA8, mit dem ich zwei 16bit
Zahlen multiplizieren will bereits eine Hardware-Multiplziere hat,
der sich mit dem Befehl mul rd, Rr ansprechen lässt. Allderdings nur
wieder zwei 8bit Zahlen. Wie kann man mit diesem Befehl zwei 16 bit
Zahlen multipliziern?
Wie man eine 16bit Zahl mit lsl shiftet wäre aber trotzdem nicht
schlecht zu wissen.
Danke nochmal für konstruktive Antworten.

Gruß
Jan Purrucker
Gast #236206
Lesenswert?
• ▲
▼
der mega8 besitzt doch nen multiplikationsbefehl für 8 bit und schreibt
das ergebnis als 16Bit wert in die register 0 und 1, oder irre ich da?
musste dir nur überlegen wie das früher mit dem multiplizieren in der
schule lief, das ist bei binären zahlen ähnlich:

    12 x 34
    34
     68
    =======
    408

also low byte mit dem jeweils anderen 2bytes multiplizieren
und danach das high bytegenau so.
dann ist die routine im wesentlichen noch ein addition mit carry
Gast #236207
Lesenswert?
• ▲
▼
Danke für den Tipp.
Nun bräuchte ich für andere Zwecke nur noch einen Befehl oder Routine,
mit der man eine 16bit Zahl (steht in zwei Registern) nach links oder
rechts schieben kann.

Gruß
Jan
Gast #236208
Lesenswert?
• ▲
▼
> Allderdings ist die Zahl in zwei Bytes, der Befehl lsl
> lässt jedoch sich nur auf ein Register anwenden.
> Hat jemand zu diesem Problem eine Lösung?
>
> Hier noch kurz der Assembler-Code Auszug:
>
> ldi r16, LOW(10000)
> ldi r17 HIGH(10000)

lsl r16
rol r17

> Das gleiche Problem stellt sich dann z.B. bei den Befehlen add
> (Addieren)

add r16, r20
adc r17, r21

sub r16, r20
sbc r17, r21

> oder sub (Subtrahieren).
#236209
Lesenswert?
• ▲
▼
lsl,lsr,rol,ror...

lsl unteresbyte
rol oberesbyte

Mit lsl schiebst du alle Bits des unteren Bytes nach links, das obere
Bit davon "fällt" ins Carry, mit rol "rotierst" du das obere Byte,
du schiebst dabei das Carry ins unterste Bit, alle Bits eine Stelle
nach links und das oberste Bit ins Carry.

Analog dazu:

lsr oberesbyte
ror unteresbyte

Falls das aber eine Hausaufgabe (Schule/Studium) war, dann gib bitte
auch die Quelle deiner Lösung an.

...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.