Forum: Mikrocontroller und Digitale Elektronik AVR Variable C und Assembler Zugriff


von Fire Eagle (Gast)


Lesenswert?

Hallo!

In der avr-libc steht ja, wie man eine Variable permanent an ein 
Register bindet.
Ist das unbedingt nötig, wenn man auf die Variable in einem Programm 
zugreifen will, das aus C- und Assembler Code besteht?
Oder könnt man der Varibale einen Speicherplatz im SRAM zuweisen?

Danke

von Karl H. (kbuchegg)


Lesenswert?

Fire Eagle schrieb:
> Hallo!
>
> In der avr-libc steht ja, wie man eine Variable permanent an ein
> Register bindet.
> Ist das unbedingt nötig, wenn man auf die Variable in einem Programm
> zugreifen will, das aus C- und Assembler Code besteht?

Das eine hat nicht unbedingt etwas mit dem anderen zu tun. Und wenn man 
eine Registerbindung macht, sollte man schon sehr genau wissen was man 
tut. Da gibts nämlich einige Stolpersteine.

> Oder könnt man der Varibale einen Speicherplatz im SRAM zuweisen?

Das ist der normale Weg. Du legst deine Variablen in C an wie sonst 
auch. Im Assembler gibt es dann direktiven, wie man wieder an diese 
herankommt.

von Fire Eagle (Gast)


Lesenswert?

Danke für deine Antwort.

Und wie funktioniert der Zugriff dann in Assembler?

von Stefan E. (sternst)


Lesenswert?

Fire Eagle schrieb:
> Und wie funktioniert der Zugriff dann in Assembler?
1
lds  REG, C_Name_of_Variable

von Fire Eagle (Gast)


Lesenswert?

Also gar nicht mit Adressoperator "&variable"?

von Stefan E. (sternst)


Lesenswert?

Fire Eagle schrieb:
> Also gar nicht mit Adressoperator "&variable"?

Wovon reden wir denn jetzt eigentlich genau? Eine separate 
Assembler-Datei, oder Inline-Assembler?

von Fire Eagle (Gast)


Lesenswert?

seperate Assembler Datei

von Stefan E. (sternst)


Lesenswert?

Fire Eagle schrieb:
> seperate Assembler Datei

Was willst du dann dort mit dem C-Adress-Operator?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan Ernst schrieb:
> Fire Eagle schrieb:
>> Also gar nicht mit Adressoperator "&variable"?
>
> Wovon reden wir denn jetzt eigentlich genau? Eine separate
> Assembler-Datei, oder Inline-Assembler?

Ist egal; sie Syntax ist die gleiche.
1
; 16-Bit Variable laden:
2
lds r0, var
3
lds r1, var+1
1
;; Adresse nach Z laden und indirekter 16-Bit Zugriff
2
ldi r30, lo8(var)
3
ldi r31, hi8(var)
4
ld  r0, z
5
ldd r1, z+1

von Stefan E. (sternst)


Lesenswert?

Johann L. schrieb:
> Stefan Ernst schrieb:
>> Fire Eagle schrieb:
>>> Also gar nicht mit Adressoperator "&variable"?
>>
>> Wovon reden wir denn jetzt eigentlich genau? Eine separate
>> Assembler-Datei, oder Inline-Assembler?
>
> Ist egal; sie Syntax ist die gleiche.

Worauf ich mit der Frage hinaus wollte ist, dass der Adress-Operator bei 
Inline-Assembler für den Zugriff auf C-Variablen zur Anwendung kommen 
könnte. Natürlich nicht direkt im Assembler-Code, aber in den 
Constraints.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan Ernst schrieb:
> Worauf ich mit der Frage hinaus wollte ist, dass der Adress-Operator bei
> Inline-Assembler für den Zugriff auf C-Variablen zur Anwendung kommen
> könnte. Natürlich nicht direkt im Assembler-Code, aber in den
> Constraints.

Ein "&" in einer Constraint hat nix mit Adressoperator oder -berechnung 
zu tun; es ist ein early-clobber.

von Stefan E. (sternst)


Lesenswert?

Johann L. schrieb:
> Ein "&" in einer Constraint hat nix mit Adressoperator oder -berechnung
> zu tun; es ist ein early-clobber.

Ja, schon klar, das was ich meine gehört wohl nicht zum "Constraint", 
sondern ist der "Operand", oder was auch immer.
1
"z" (&var)

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.