Forum: Mikrocontroller und Digitale Elektronik ASM: Position von sts erzeugt Fehler


von Kölner (Gast)


Lesenswert?

Ich habe ein Problem, welches ich absolut nicht nachvollziehen kann. 
Müsste es meinem Inline-Assembler nicht ziemlich egal sein, wo ich 
welchen Befehl positioniere? Ich habe folgendes Problem:

Setze ich im folgenden Code die beiden sts-Zeilen nach Repeat, dann 
funktioniert die Übersetzung. Setze ich sie irgendwo vor Repeat, dann 
kriege ich einen Fehler. "ld return 1 exit status", sehr viel aussagend.

Der Prozessor ist ein atxmega.
1
  "cpi r30, 0x07        \n\t"
2
  "brne weiter1        \n\t"
3
  "cpi r31, 0xff        \n\t"
4
  "brne weiter1        \n\t"
5
  "lds r14, %[M0S]      \n\t"
6
  "lds r15, %[M1S]      \n\t"
7
  "lds r20, %[OfS]      \n\t"
8
  "lds r21, %[OfS]+1      \n\t"
9
  "sts %[OfI],r20        \n\t"
10
  "sts %[OfI]+1,r21      \n\t"
11
  "weiter1:          \n\t"
12
  
13
  "sbiw r24, 1        \n\t"          //Schelife - 1
14
  "brne repeat        \n\t"


Wieso ist das so?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Kölner schrieb:
> ld return 1 exit status

Das ist nur die Abbruchmeldung von make, aber nicht die Meldung vom ld.

>   "cpi r30, 0x07        \n\t"
>   "brne weiter1        \n\t"
>   "cpi r31, 0xff        \n\t"
>   "brne weiter1        \n\t"
>   "lds r14, %[M0S]      \n\t"
>   "lds r15, %[M1S]      \n\t"
>   "lds r20, %[OfS]      \n\t"
>   "lds r21, %[OfS]+1      \n\t"
>   "sts %[OfI],r20        \n\t"
>   "sts %[OfI]+1,r21      \n\t"
>   "weiter1:          \n\t"
>
>   "sbiw r24, 1        \n\t"          //Schelife - 1
>   "brne repeat        \n\t"

repeat ist nicht definiert.

> Wieso ist das so?

Mehr kann man nicht sagen, da der Kontext und die Constraints 
Geheimhaltung unterliegen.

von Kölner (Gast)


Lesenswert?

Keine Geheimhaltung, es funktioniert jedoch bis auf die Positionierung 
von sts. Ich meinte mit "nach dem repeat" die letzte Zeiles meines 
gezeigten Codes.
1
  "repeat:          \n\t"
2
  [...]
3
  "cpi r30, 0x07        \n\t"
4
  "brne weiter1        \n\t"
5
  "cpi r31, 0xff        \n\t"
6
  "brne weiter1        \n\t"
7
  "lds r14, %[M0S]      \n\t"
8
  "lds r15, %[M1S]      \n\t"
9
  "lds r20, %[OfS]      \n\t"
10
  "lds r21, %[OfS]+1      \n\t"
11
  "sts %[OfI],r20        \n\t"
12
  "sts %[OfI]+1,r21      \n\t"
13
  "weiter1:          \n\t"
14
  
15
  "sbiw r24, 1        \n\t"          //Schelife - 1
16
  "brne repeat        \n\t"

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das Problem kann ich nicht nachvollziehen.

von Kai (Gast)


Lesenswert?

Brne macht einen relativen Sprung,oder?

Dann ist Dein Code zwischen Rezept und dem Brne zu lang, wenn die SMS 
noch vor dem repeat eingefügt werden...

von Kai (Gast)


Lesenswert?

Entschuldigt die Schreibkorrektur meines Handys...

Sts und Repeat...Nicht sms und Rezept :)

Ps: Relative Sprünge -127 bis +128 vom brne Befehl aus

von S. Landolt (Gast)


Lesenswert?

> Entschuldigt die Schreibkorrektur meines Handys...
Was'n Zufall, dass die aus brne nicht eine Birne gemacht hat.

von Markus F. (mfro)


Lesenswert?

Nachdem die Infos etwas knapp sind, ein Schuß ins Blaue.

"sprechende" Label-Namen in Inline-Assembler sind nicht unbedingt eine 
gute Idee. Wenn der Compiler auf die Idee kommt, den Inline-Assembler an 
mehreren Stellen zu inlinen, hast Du duplicate symbols.

Wenn's unbedingt sprechende Namen sein sollen (und eben keine 
diesbezüglich ungefährlichen "gas local labels" - Ziffern von 1-9 und 
Referenzen darauf mit "b" und "f"), dann häng' wenigstens ein "%=" an 
deine Label-Namen dran.

Dann bekommt jede "geinline-te" Inkarnation ein eigenes, eindeutiges 
Suffix.

von Kölner (Gast)


Lesenswert?

Es scheint echt die Sprunggröße zu sein. Was mach ich jetzt? Meine ca. 
30 Zeilen Inline-Assembler zerstückeln :( ?

von Markus F. (mfro)


Lesenswert?

Kölner schrieb:
> Es scheint echt die Sprunggröße zu sein. Was mach ich jetzt? Meine ca.
> 30 Zeilen Inline-Assembler zerstückeln :( ?

Die Bedingung umdrehen und abhängig davon einen absoluten 
Rücksprungbefehl vorwärts überspringen.

von Heinz V. (heinz_v)


Lesenswert?

Jump around the Jump:

Kölner schrieb:
> "repeat:          \n\t"
>   [...]
>   "cpi r30, 0x07        \n\t"
>   "brne weiter1        \n\t"
>   "cpi r31, 0xff        \n\t"
>   "brne weiter1        \n\t"
>   "lds r14, %[M0S]      \n\t"
>   "lds r15, %[M1S]      \n\t"
>   "lds r20, %[OfS]      \n\t"
>   "lds r21, %[OfS]+1      \n\t"
>   "sts %[OfI],r20        \n\t"
>   "sts %[OfI]+1,r21      \n\t"
>   "weiter1:          \n\t"
>
>   "sbiw r24, 1        \n\t"          //Schelife - 1
>   "brne repeat        \n\t"

So:

 "repeat:          \n\t"
   [...]
   "sbiw r24, 1        \n\t"          //Schelife - 1
   "breq exit"
    "jmp repeat        \n\t"

  "exit:"

von Kölner (Gast)


Lesenswert?

Das funktioniert danke, wieder ein bisschen schlauer.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Kölner schrieb:
> Meine ca.
> 30 Zeilen Inline-Assembler zerstückeln :( ?

Wie viel kann der Compiler an dem Assembler ändern/anpassen?
~30 Instruktionen und >127 Byte Abstand - was für Klopper-Befehle muß 
Der da raus machen?
Wenn es ~60 Befehle sind ... aber bei 'um die 30'?

MfG

von Kai (Gast)


Lesenswert?

Hi nochmal,

Wenn  man hier schaut:
http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_BRNE.html

sind es sogar nur 7bit... -64 bis +63

Gruß Kai

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Relativiert die 'Klopper' und bei ~30 Befehlen kommen ~60Byte zusammen 
(oder halt ~30 Wörter) - da passt's wieder und kann schon Mal eng 
werden.

Danke für den Link :)

MfG

von c-hater (Gast)


Lesenswert?

Kai schrieb:

> Wenn  man hier schaut:
> http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_BRNE.html
>
> sind es sogar nur 7bit... -64 bis +63

Ja, es sind nur 7 Bit. AAABER: wie im gesamten AVR8-Befehlssatz handelt 
es sich bei Sprüngen und Verzweigungen immer um WORTadressen. D.h.: die 
mögliche Sprundistanz ist tatsächlich -128 .. +126 BYTES (in 
Zweierschritten).

> Relativiert die 'Klopper' und bei ~30 Befehlen kommen ~60Byte zusammen
> (oder halt ~30 Wörter) - da passt's wieder und kann schon Mal eng
> werden.

Nein. Eng werden kann es bei ~30 Instruktionen nur dann, wenn das 
praktisch alles Mehrwort-Instruktionen sind. "sts" ist allerdings so 
eine, die braucht nämlich zwei Worte.

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.