Forum: Mikrocontroller und Digitale Elektronik Inline Assembler


von Assembler Anfänger (Gast)


Lesenswert?

Ich verwende Code Vision und würde gerne alle Register durchlaufen und 
einen beliebigen Wert in das Register schreiben.
Kann ich im Assembler den ldi Befehl mit der Registeradresse anstatt r16 
verwenden und dann die Adresse des Registers incrementieren?

//While Schleife
//{
#asm
ldi r16, 0xFF ; beliebiger Wert
#endasm
//}

Wäre nett wenn mir wer helfen könnte,
danke

von P. M. (o-o)


Lesenswert?

Assembler Anfänger schrieb:
> Kann ich im Assembler den ldi Befehl mit der Registeradresse anstatt r16
> verwenden und dann die Adresse des Registers incrementieren?

Du willst sozusagen den Registername bzw. die Registeradresse in der 
Schleife durchzählen? Nur mit C und Inline-Assembler geht das nicht. Die 
C-Variable wäre ja dann auch ein auf dem Prozessor gespeicherter Wert, 
und die kann man bekanntlich nicht verwenden, um ein Register zu 
adressieren. Registeradressen stehen immer fest im Code, jedenfalls bei 
AVR-Assembler. Du müssest das also per Präprozessor lösen.

von Assembler Anfänger (Gast)


Lesenswert?

Danke für die rasche Antwort. Wie würde das funktionieren?

von P. M. (o-o)


Lesenswert?

Assembler Anfänger schrieb:
> Danke für die rasche Antwort. Wie würde das funktionieren?

C-Präprozessoranweisungen kennst du wohl? #define, #include z.B. Man 
kann damit noch viel mehr machen. Allerdings kenne ich auch nicht viel 
mehr als die genannten beiden Anweisungen. In einem Tutorial zum 
C-Präprozessor sollte man aber fündig werden.

von Assembler Anfänger (Gast)


Lesenswert?

Danke trotzdem für deine Hilfe. Ich werde mich einmal über den 
Präprozessor schlau machen, dann sehe ich weiter. Ansonsten muss ich 
halt ein jedes einzelne Register beschreiben, würde für meine Anwendung 
auch funktionieren nur gefällt mir das nicht.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

das geht schon, da im AVR die Register auch im Adressbereich des SRAM 
liegen. Mit indirekter Adressierung kannst du das gewünschte erreichen.
Die Adresse des Registers (r0 ... r31 == 0x0000 ... 0x0031) kommt in 
eins der 16Bit-Register X,Y o. Z. Per st  X+,rx kannst du den Wert von 
rx in das Register schreiben, die Adresse, die dann das Register 
darstellt, wird danach um eins erhöht. Die Reg. für X und rx kannst du 
natürlich nicht beschreiben.
Nur was soll das ganze? In einem C-Prog. sollte man nicht einfach 
irgendwelche Register überschreiben, da viele davon schon intern 
verwendet werden.

Sascha

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.