Forum: Mikrocontroller und Digitale Elektronik Symbolnamen in gnu assembler


von Christian (dragony)


Lesenswert?

Hallo zusammen,

da man bei mov r15,r12 und co. schnell die Übersicht verliert, verwende 
ich natürlich Aliasnamen. Die heissen bei gas wohl Symbole. Allerdings 
habe ich da ein Problem. Folgendes funktioniert nicht:

real = 16
inc real

jedoch

eal = 16
inc eal

geht ohne Probleme. Anscheinend mag gas es nicht, wenn ein Symbol mit r 
anfängt???? Welchen Hebel muss ich umlegen, damit mein Alphabet wieder 
26 Buchstaben hat? Danke.

: Bearbeitet durch User
von Heinz V. (heinz_v)


Lesenswert?

ist 'real' evtl. ein reserviertes Keyword? Teste mal mit _ davor.

von Christian (dragony)


Lesenswert?

es ist egal, was danach kommt. rotfuchs geht auch nicht.

von Heinz V. (heinz_v)


Lesenswert?

vermutlich ist r* als Variablenname unzulässig da der Assembler nach dem 
r die Nummer eines Register erwartet, versuch doch einfach den 
Unterstrich vorm r.

von Christian (dragony)


Lesenswert?

es wäre wirklich absurd, wenn r* als variablenname unzulässig wäre. ich 
kann mir nicht vorstellen, dass die leute so einen müll verzapft haben.

von Christian (dragony)


Lesenswert?

Weiss sonst keiner Rat?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die 'R's als Registerargumente sind tatsächlich reserviert, auch wenn
keine Nummer danach folgt.

Abhilfen:
- keine 'R's als Anfangsbuchstaben verwenden ;-)
- Underscore von dem 'R' (wie von Heinz vorgeschlagen)
- Die Ersetzung der Symbole nicht durch den Assembler selbst, sondern
  durch den Präprozessor vornehmen lassen, also bspw. mit
1
  #define real 16
- avr-as patchen (die Änderung sollte nicht allzu schwer fallen)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Alles Quatsch in meinem letzten Beitrag :)

Dieser bezog sich auf die bis heute auf meinem Rechner installierte
veraltete Binutils-Version.

In den aktuellen Binutils (2.25) dürfen symbolische Registerargumente
auch mit 'R' beginnen. Außerdem kann man nun auch X, XL, XH, Y, YL, YH,
Z, ZL und ZH als Registerargumente verwenden, ohne diese Namen vorher
explizit definieren zu müssen.

Folgendes ist also legaler Code:
1
real = 16
2
inc real
3
inc zl
4
adiw x,23

Hier ist der zugehörige disassemblierte Binärcode:
1
   0:   03 95           inc     r16
2
   2:   e3 95           inc     r30
3
   4:   57 96           adiw    r26, 0x17       ; 23

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.