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


von JayJay (Gast)


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:
1
ldi r16, 20    ; Register definieren, mit dem gerechnet werden soll
2
3
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...

von Sven P. (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von JayJay (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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...
1
.macro  addX r
2
        add     \r, r24
3
.endm
4
5
.global foo
6
foo:
7
        addX r16
8
        addX r17
9
        ret

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

Das Ergebnis ist dann:
1
Disassembly of section .text:
2
3
00000000 <foo>:
4
   0:   08 0f           add     r16, r24
5
   2:   18 0f           add     r17, r24
6
   4:   08 95           ret

von Sven P. (Gast)


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.

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.