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
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
Hi, schau Dir mal an wofür das Carry-Flag gut ist. Grüße, AK
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
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
> 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).
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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.