www.mikrocontroller.net

Forum: Compiler & IDEs inline-asm: output-/input-Operandenliste


Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mit der Inline-ASM Geschichte bin ich noch nicht so richtig durch, 
nährere mich aber dem Ziel. Nachdem ich nun festgestellt habe, daß die 
gesamte (3-teilige) Operandenliste ans Ende einer Anweisungsliste kommt 
und erst die Ausgabe-Operanden, angeführt durch ein ':' und getrennt mit 
Komma, dann die Eingabe-Operanden und als drittes die Clobber-Liste. 
Passend zu den einzelnen Operanden müssen die Constraints sein, sonst 
gips Mecker vom gcc und das wird alles nix. So weit, so gut --- denkt 
man....

Konkret habe ich mir wieder eine Spielwiesendatei gebaut, worin ich 
einzelne Inline-Assembler Funktionen aufbaue und dran rumschraube. Bis 
auf 2 Fehlermeldungen vom gcc habe ich m. W. alles soweit stehen, aber 
es gibt Motze vom gcc:

qq.c: In function 'assemble':
qq.c:18: error: output operand constraint lacks '='
qq.c:9: error: output operand constraint lacks '='
qq.c:9: error: invalid lvalue in asm output 0

Dazu der gesamte Code
#include <avr/io.h>
#include <stdint.h>

unsigned char x, y, z;

//static inline assemble(uchar8_t var_x, uchar8_t var_y, uchar8_t var_z)
static inline void assemble(void)
{
  asm volatile
  (                   // Zeile 10
    "add r29,%0\n\t"
    "add r30,%1\n\t"
    "add r31,%2\n\t"
    "lpm \n\t"
    "out %3,r0\n\t"
    : "I" (PORTB)               // Zeile 16
    : "r" (x), "r" (y), "r" (z) // Zeile 17
  );                  // Zeile 18
}

int main(void)
{
  x = 42;
  y = 50;
  z = 84;

  //assemble(x, y, z);
  assemble();
}

Zwei Möglichkeiten wären da, einmal die Parameter an die 
assemble()-Funktion per Parameterübergabe zu übergeben oder als globale 
Variablen, so wie es jetzt oben steht.

Was ich nicht verstehe ist
ersma, was sollen mir die Fehlermeldungen bzgl. "output operand 
constraint lacks '='" und "invalid lvalue in asm output 0" sagen?

Zweitma verstehe ich nicht, warum in diversen Dokus geschrieben steht, 
daß es heißen muß
: "I" _SFR_IO_ADDR(PORTB)"
 in einer anderen, fast genau der gleichen Doku heißt
: "I" (PORTB)"
 also ohne "_SFR_IO_ADDR(...)". Lass ich das Makro weg, habe ich eine 
Fehlermeldung weniger (mit: qq.c:18: error: invalid lvalue in asm 
statement).

Und dann noch, warum die constraints der Eingabeoperanden "r" sein 
müssen, und nicht wie in anderen Beispielen zu sehen war, einfach nur 
"0" z.b.

Wie wäre die Parameterübergabe von 3 nur-lesen-Zeichen (uchar8) richtig?

Alternativ habe ich auch selbiges wie oben mit einer separaten 
Assembler-Datei versucht (qq.S), allerdings bekomme ich hier keine 
Parameter in die Assemblerfunktion rein. In irgendeiner Doku stand, das 
das bei globalen Variablen, die in einem C-File stehen, so gemacht wird:
#include <avr/io.h>
#define __ASEMBLER__

.extern x
.extern y
.extern z


.section .text

.global schrauben
.func schrauben

... blabla das zeugs von oben

.endfunc
.end

Die Fehlermeldungen hierzu lautet, daß die Variablen x, y und z nicht 
bekannt sind, obwohl die im C-File global und aus meiner C-Erfahrung 
raus auch für externe Funktionen sichtbar sind. Definiert sind die als 
'static volatile unsigned char'.

So, hoffe auf hilfreiche Reaktoren und geh schonmal ins Bett, is ja 
schon wieder sooooo spät und muß morgen auch wieder "anne Schippe".

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatten wir erst vor drei Tagen hier: die Portadresse eines OUT-
Befehls ist ein input operand, da sie in das inline asm hinein
gegeben wird.

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank für den Tip, ich habe den Code geändert und so wie es 
aussieht, wird es anstandslos genommen (lt. generierter Datei namens 
qq.s). Ich hoffe damit dann den Rest auch noch auf die Reihe zu 
bekommen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.