assembler unter gcc



  • moin
    Ich hab da mal eine Frage zum GCC oder besser gesagt der DJGPP variante aber das dürfte für diesen Fall egal sein.
    Den Borland Compilern lässt sich ja im Stiel
    ASM {mov ax,0x10
    blabla...}
    sagen, dass sie dieser Abschnitt des Progs schon in ASM geschrieben is und nich mehr übersetzt werden muss. Unter gcc funzt das ganze leider nicht mit asm. Wie geht das da?



  • __asm__(instruction-string, inputs, outputs, clobbers);

    cya
    liquid



  • hm hab hier noch ein Problem
    __asm__("mov %al,0xed");
    __asm__("mov %dx,0x60");
    __asm__("out %dx, %al");
    diese Zeile funzen nich. Helft mir



  • Link

    cya
    liquid



  • ich hab das mit dem inline asm aufgegeben.

    ich verwende einfach nasm und assembliere den asm code einfach zu *.o dateien und linke die dann.

    funktioniert recht gut. ist dann aber halt leider kein inline asm mehr. aber meistens kann man den asm code eh in funktionen auslagern...



  • Das werd ich auch tun.



  • Der extended inline ASM des GCC ist halt eine der mächtigsten Sprachkonstrukte die es gibt und damit auch sehr kompliziert. Aber das sollte einen nicht abschrecken, da man (einmal begriffen) damit sehr viel machen kann.

    cya
    liquid



  • LiquidAcid schrieb:

    Der extended inline ASM des GCC ist halt eine der mächtigsten Sprachkonstrukte die es gibt und damit auch sehr kompliziert. Aber das sollte einen nicht abschrecken, da man (einmal begriffen) damit sehr viel machen kann.

    Was kann ich denn damit machen, was ich bei einem leichteren inline asm nicht kann?



  • Du hast wesentlich mehr Kontrolle was der Compiler mit dem inline Assembler anstellt. Wenn du den Assembler extern übersetzt (wie mit NASM) dann raubste dem Compiler meistens die Möglichkeit diesen Code effektiv zu integrieren. Damit meine ich im besonderen Sachen wie Inlining oder reg reloading Operationen.
    Ich denke wenn man schon Assembler schreibt dann will man es ja auch so effektiv wie möglich haben und alle Schikanen des Compilers ausnutzen.

    cya
    liquid



  • LiquidAcid schrieb:

    Du hast wesentlich mehr Kontrolle was der Compiler mit dem inline Assembler anstellt.[...]
    Ich denke wenn man schon Assembler schreibt dann will man es ja auch so effektiv wie möglich haben und alle Schikanen des Compilers ausnutzen.

    Full ACK

    Aber warum kann der GCC nicht genauso ein schönen inline ASM anbieten wie VC++, Borland, DMC, etc. ?

    Ich dachte du hättest argumente warum die GCC Variante besser ist.



  • Die GCC Variante ist insofern besser, da man mehr "Daten" an den Compiler weiterleiten kann. Guck dir mal die Doku des GCC an (hier) - die Kapitel beschäftigen sich nur mit dem erweiterten AT&T Syntax. Afaik gibt es beim VC++ sowas wie Inputs, Output und Clobbers gar nicht. Dort gibt man wirklich nur die Instruktionen an und den Rest erledigt dann der Compiler.

    Man kann dort afaik auch nicht "generisch" arbeiten, muss also immer mit bestimmten Registern arbeiten. Mit dem GCC Syntax kann man zB sagen, dass der Compiler eine bestimtme Speichervariable in ein Register laden soll. Man weiß aber nicht in welches Register, sondern spricht das Register dann nur mit einem Alias (%0 oder auch %[_VAR_NAME]) and. Das macht die Sache insofern leichter, da man sich nicht auf ein spezielles Register festlegen muss und der Compiler eventuell das Register weiternutzen kann in dem die Speichervariable sowieso schon existiert (wegen früherer Berechnungen). Das wäre nur einer der Vorzüge des GCC Syntax, aber es gibt da noch wesentlich mehr. Es ist auf jeden Fall schweres damit zu arbeiten, aber die Ergebnisse können dafür auch besser sein (sie müssen nicht betone ich dabei ganz deutlich).

    cya
    liquid



  • Shade Of Mine schrieb:

    Aber warum kann der GCC nicht genauso ein schönen inline ASM anbieten wie VC++, Borland, DMC, etc. ?

    Der GCC unterstützt auch die Intel Syntax. Hast du schon mal versucht damit was zu machen ?


Anmelden zum Antworten