www.mikrocontroller.net

Forum: Compiler & IDEs variable Registeradressierung (Assembler, ATmega8)


Autor: JayJay (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Hoffe der Titel ist wenigstens ansatzweise aussagefähig...

Mich quält gerade folgendes Problem für das ich keine Lösung ersinnen 
kann:

ich möchte eine Opertation (z.B. ADD) mit einem Register durchführen, 
welches von einem anderen definiert wird.

Konkretes Beispiel:
ldi r16, 20    ; Register definieren, mit dem gerechnet werden soll

ADD r17, rX    ; Anstelle von X soll aber die Zahl aus r16 stehen (also 20) 


Das es auf diese Wiese nicht funktioniert hab ich schon bemerkt...

Ich möchte das für Schleifen nutzen um die gleiche Operation mehrmals 
hintereinander mit diversen Registern ausführen zu können.

Wie geht das?

Bin euch dankbar für die Antworten...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem der drei Zeigerregister und LD dürfte das gehen, auch im Ram.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. wrote:
> Mit einem der drei Zeigerregister und LD dürfte das gehen, auch im Ram.

Nein, da der AVR indirekt nur Transportoperationen durchführen kann,
keine Rechenoperationen.

Auch wenn's natürlich nicht dasselbe ist: mit einem Makro kann man
sowas machen.

Autor: JayJay (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey...

ich bin noch ein ziemlicher Neuling was AVR angeht und wäre froh, wenn 
ihr so grob erklären könntet, was ihr euch unter einem Makro o.ä. 
vorstellt.

Nachvollziehbarer Sourcecode wäre natürlich grandios! :-D

Trotzdem danke für die schnellen Antworten!

so long...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JayJay wrote:

> ich bin noch ein ziemlicher Neuling was AVR angeht und wäre froh, wenn
> ihr so grob erklären könntet, was ihr euch unter einem Makro o.ä.
> vorstellt.

Da frage ich mich allerdings, warum du dann überhaupt die Dinger
in Assembler programmieren willst...
.macro  addX r
        add     \r, r24
.endm

.global foo
foo:
        addX r16
        addX r17
        ret

(Da du in der GCC-Gruppe fragst, ist das Ganze in der Syntax des
GNU-Assemblers namens "gas" geschrieben.)

Das Ergebnis ist dann:
Disassembly of section .text:

00000000 <foo>:
   0:   08 0f           add     r16, r24
   2:   18 0f           add     r17, r24
   4:   08 95           ret

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> Sven P. wrote:
>> Mit einem der drei Zeigerregister und LD dürfte das gehen, auch im Ram.
>
> Nein, da der AVR indirekt nur Transportoperationen durchführen kann,
> keine Rechenoperationen.
Ja das schon, aber ich hab mal vorausgesetzt, dass ihm das klar ist. 
Muss er halt nochn Akku dazunehmen.

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.