Forum: Mikrocontroller und Digitale Elektronik 16bit Zahl Shiften beim ATMega8 (8bit MCU)


von Jan Purrucker (Gast)


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

von Jan Purrucker (Gast)


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

von André Kronfeldt (Gast)


Lesenswert?

Hi,

schau Dir mal an wofür das Carry-Flag gut ist.

Grüße,
AK

von Matthias (Gast)


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

von Jan Purrucker (Gast)


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

von Rolf Magnus (Gast)


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

von Hannes L. (hannes)


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.

...

von Olli (Gast)


Lesenswert?

LOL

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.