ASM: Position von sts erzeugt Fehler

Gast #5012665
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?
Persönliche Seite #5012671
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.
Gast #5012682
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"
#5012698
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.
#5012753
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:"
Gast #5013132
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren