Forum: Mikrocontroller und Digitale Elektronik AVR Assembler - Inhalt zweier Register tauschen


von M. S. (sadmarvin)


Lesenswert?

Ich bin grad dabei die AVR Assembler Programmierung zu lernen und habe 
mich nun gefragt, wie man den Inhalt zweier Register tauschen kann.

Im Instruction Set (ATtiny2313) habe ich keinen direkten Befehl 
gefunden.

Ich habe die Idee gehabt es über den Stack mit push und pop zu machen.

also z.B. so:
1
ldi r16,0xFF
2
ldi r17,0x00
3
4
push r16
5
push r17
6
pop r16
7
pop r17

Gibt es da noch andere / bessere Möglichkeiten?

von Achim M. (minifloat)


Lesenswert?

Mit 3 Befehlen in Pseodoassembler, meine Register heißen a und b:

exor a,b
exor b,a
exor a,b

mfg mf

von Turbo T. (turbotoni)


Lesenswert?

Ja, mit einen 3ten Register.
Register1 --> Register3
Register2 --> Register1
Register3 --> Register2

von thomas (Gast)


Lesenswert?

Mini Float schrieb:
> Mit 3 Befehlen in Pseodoassembler, meine Register heißen a und b:
>
> exor a,b
> exor b,a
> exor a,b
>
> mfg mf

Sehr elegant! Hab ich so noch nie gesehen.

von Achim M. (minifloat)


Lesenswert?

Dann hätte ich noch die additive Variante im Angebot.
Die mit Multiplikation und Division gibts auf AVRASM nicht, da kein 
hardware-Divider da druff ist.
mfg mf

PS@Toni: der andere Thread, ich vermute ein Grundlagen- bzw. 
Verständnisproblem... && Gutn8

von Mark L. (m2k10) Benutzerseite


Lesenswert?

etwas schneller (3 statt 8 Takte):
1
out GPIO1, r16
2
mov r16, r17
3
in r17, GPIO1

von M. S. (sadmarvin)


Lesenswert?

Ok, danke für die Antworten.

> Mit 3 Befehlen in Pseodoassembler, meine Register heißen a und b:
>
> exor a,b
> exor b,a
> exor a,b
>
> mfg mf

Das mit dem 3mal xor ist ja wirklich nicht schlecht.
Sind auch nur 3 Takte und kommt ohne zusätzliches Regeister aus.

von Stefan (Gast)


Lesenswert?

Mini Float schrieb:
> Mit 3 Befehlen in Pseodoassembler, meine Register heißen a und b:
>
> exor a,b
> exor b,a
> exor a,b
>
> mfg mf

Musst allerdings aufpassen, wenn beide Register gleiche Werte beinhalten 
kommt in beiden 0 raus ;)

von avrler (Gast)


Lesenswert?

Stack vorhanden?

push reg1
mov reg1,reg2
pop reg2

von Vuvuzelatus (Gast)


Lesenswert?

>wenn beide Register gleiche Werte beinhalten kommt in beiden 0 raus

Nein, dann haben sie auch nachher wieder dieselben Werte.

Erst denken, dann schreiben.

von Achim M. (minifloat)


Lesenswert?

Die Idee die dahintersteckt ist auch recht easy zu verstehen:

Erstmal den Unterschied zwischen den Registern feststellen.
Den Unterschied auf das nicht beeinflusste Register anwenden.
Und nochmal andersrum. 8)
mfg mf

PS: Mein Vater hat mir neulich von der "schnellen Multiplikation mit 
1000" erzählt. Es ist bloß schieben und Addieren/Subtrahieren erlaubt.
Klar gibt es da auch mehrere Ansätze.

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.