Inline-Assembler

nairolf
Erstie
Erstie
Beiträge: 18
Registriert: 31. Jul 2011 13:58

Re: Inline-Assembler

Beitrag von nairolf »

Danke, habe beides behoben, der Fehler bleibt aber trotzdem :(

Code: Alles auswählen

asm("movl $3, %%ecx;"
  ".for:;"
[...]
  "loop .for;"
  : "=a" (res)
  : "d" (mat), "b" (vek), "a" (res)
  :  "ecx"
  );
Die %xmm.. Register muss ich nicht angeben, oder?

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: Inline-Assembler

Beitrag von Ronny »

Das letzte Problem ist noch das Array res, das auf dem Sack liegt. Siehe dazu meinen vorvorletzten Post.
Du solltest das Ergebnis auch lieber so zurueckgeben wie in meinem vorletzten Post beschrieben.

Eigentlich muessen auch xmm Register in die clobbered list. Man kann die Register aber nur eintragen, wenn man mit z.B. dem Flag -msse2 kompiliert.
Denn nur dann ist die SSE-Funktionalitaet auch dem Compiler bekannt und er versucht auch selbst SSE-Code zu erzeugen.

Ohne dem Flag macht der Compiler nichts mit SSE und muss deswegen nicht wissen ob die SSE-Register im inline assembler code modifiziert wurden.
Es ist dann etwas unsauber nicht die xmm register aufzufuehren aber moeglich.
Man kann aber trotzdem SSE im inline assembler code auch ohne Flag benutzen, da der Code nur ein String ist, der in einem Compilerzwischenschritt im Grunde direkt uebernommen wird.

flofalk
Neuling
Neuling
Beiträge: 6
Registriert: 17. Nov 2011 21:43

Re: Inline-Assembler

Beitrag von flofalk »

Wir haben folgenden Code:

Code: Alles auswählen

asm ("... HIER UNSER CODE ..."
           : "=c"(res)
           : "a" (mat), "b" (vek), "c" (res)
           : "edi"
        );

Wir haben soweit auch alles nach den Regeln umgesetzt, nun wirft uns der Compiler aber auch den Fehler "impossible constraint", jedoch für die Zeile in der ");" steht. Hat jemand nen Tipp?

Zur Info: Implementiert haben wir mit Schleifen die über ein eindimensionales Array laufen und dabei %edi als Zeiger nutzen.

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: Inline-Assembler

Beitrag von Ronny »

Die Fehlermeldung ist in deinem Fall leider etwas fehlleitend.
Das eigentliche Problem ist das Array res.
Siehe dazu meinen vorvorvorletzten Post.
Du solltest das Ergebnis auch lieber so zurueckgeben wie in meinem vorvorletzten Post beschrieben.

flofalk
Neuling
Neuling
Beiträge: 6
Registriert: 17. Nov 2011 21:43

Re: Inline-Assembler

Beitrag von flofalk »

Ah super, jetzt läuft der Compiler auf jeden Fall schonmal weiter. Wirft mir jetzt aber zwölf mal den Fehler "Operand number missing after %-letter". Habe ich das richtig verstanden gehabt, dass ich bei Register z.B. "%%eax" schreiben muss und zum Zugriff auf die verschiedenen Inputs z.B. "%a"?

Was mir trotzdem noch Sorgen macht ist, dass ich in Assembler die Eingabe mit einem eindimensionalen Array mit der Länge 12 realisiert hatte. In der C Version kriege ich jetzt ja eine 3x4 Matrix, darf ich das einfach ändern auf ein 1x12 Array oder gibt es eine andere Möglichkeit den Zugriff zu regeln.

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: Inline-Assembler

Beitrag von Ronny »

Wenn du bei den Inputs z.B. "a"(x) schreibst, dann steht in %eax der Wert von x. Im Code musst du dann aber %%eax schreiben um auf %eax zuzugreifen.
Wenn von 0 zu zaehlen beginnend "a"(x) der ite Operand in der Input- und Output-Liste zusammengenommen ist, kann man auch mit %i auf %eax zugreifen.
Steht auch auf dem Aufgabenblatt :evil: .
Um Register von dieser Schreibweise zu unterscheiden haben Register das zweite % vor ihrem Namen stehen.


Die Zeilen des zweidimensionalen Arrays stehen einfach hintereinander im Speicher.

SirtobeD
Mausschubser
Mausschubser
Beiträge: 68
Registriert: 28. Okt 2010 18:56

Re: Inline-Assembler

Beitrag von SirtobeD »

Hey,
ich hab auch noch eine Frage:
Die FPU wandelt die floats für die Berechnungen in 8 byte floats um und wenn ich dann später mein Ergebnis wieder speichern möchte ist das float array (res) das von c erstellt wird natürlich nicht groß genug weil da die floats nur 4 bytes beanspruchen. Gibt es nen Befehl um von der FPU 4byte-Floats zu kriegen anstatt 8byte-Floats??
Danke,
Tobi

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: Inline-Assembler

Beitrag von Ronny »

SirtobeD hat geschrieben:Gibt es nen Befehl um von der FPU 4byte-Floats zu kriegen anstatt 8byte-Floats??
Die Befehle lauten fsts und fstps.
Das "s" steht dabei fuer single-precision.

SirtobeD
Mausschubser
Mausschubser
Beiträge: 68
Registriert: 28. Okt 2010 18:56

Re: Inline-Assembler

Beitrag von SirtobeD »

Ok danke :)

Das bringt mir aber nicht viel da printf sowieso ein 8byte-float erwartet (und zwar mit %f), richtig?

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: Inline-Assembler

Beitrag von Ronny »

SirtobeD hat geschrieben: Das bringt mir aber nicht viel da printf sowieso ein 8byte-float erwartet (und zwar mit %f), richtig?
Es bringt dann nichts, wenn du die Werte im Inline-Assembler Code ausgibst.

SirtobeD
Mausschubser
Mausschubser
Beiträge: 68
Registriert: 28. Okt 2010 18:56

Re: Inline-Assembler

Beitrag von SirtobeD »

Ok alles klar, danke.

Benutzeravatar
ut53xuco
Mausschubser
Mausschubser
Beiträge: 57
Registriert: 20. Nov 2011 18:07

Re: Inline-Assembler

Beitrag von ut53xuco »

Hi

Ich habe so ziemlich alles ausprobiert was hier im Forum steht aber nichts von dem fuktioniert. Ich bekomme immer wieder den Error: In function âint main()â:
Was bedeutet der?

Kennt jemand eine Seite, wo der Inline-Assembler etwas ausführlicher erklärt wird?

Vielen Dank im Voraus

m2c1
Windoof-User
Windoof-User
Beiträge: 41
Registriert: 20. Dez 2010 10:39

Re: Inline-Assembler

Beitrag von m2c1 »

ut53xuco hat geschrieben:Ich bekomme immer wieder den Error: In function âint main()â:
Was bedeutet der?
Es ist so gut wie unmöglich, dass jemand damit etwas anfangen kann. Die Meldung besagt ja nur, dass mindestens ein Fehler in deiner main-Funktion ist. Welche das sind, stehen in den nächsten Zeilen.
ut53xuco hat geschrieben:Kennt jemand eine Seite, wo der Inline-Assembler etwas ausführlicher erklärt wird?
z.B. http://www.ibm.com/developerworks/linux ... index.html

Benutzeravatar
ut53xuco
Mausschubser
Mausschubser
Beiträge: 57
Registriert: 20. Nov 2011 18:07

Re: Inline-Assembler

Beitrag von ut53xuco »

Ok^^ Ich dachte nur dass das etwas spezielles wäre
Danke für den Link

Aaron_H
Erstie
Erstie
Beiträge: 14
Registriert: 4. Okt 2010 16:30

Re: Inline-Assembler

Beitrag von Aaron_H »

Ein Tipp für alle, die nach stundenlanger Fehlersuche immer noch Segmentation Faults bekommen: einfach die Kommentare entfernen.
Gut, dass einem das in der Vorlesung und den ganzen tollen verlinkten Seiten gesagt wird.

Antworten

Zurück zu „Archiv“