mikrocontroller.net

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


Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht 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:
ldi r16,0xFF
ldi r17,0x00

push r16
push r17
pop r16
pop r17

Gibt es da noch andere / bessere Möglichkeiten?

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit 3 Befehlen in Pseodoassembler, meine Register heißen a und b:

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

mfg mf

Autor: Turbo Toni (turbotoni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, mit einen 3ten Register.
Register1 --> Register3
Register2 --> Register1
Register3 --> Register2

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark Leyer (m2k10) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
etwas schneller (3 statt 8 Takte):
out GPIO1, r16
mov r16, r17
in r17, GPIO1

Autor: M. S. (sadmarvin)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: avrler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stack vorhanden?

push reg1
mov reg1,reg2
pop reg2

Autor: Vuvuzelatus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.