Inline-Assembler Einstieg



  • Ich möchte anfangen (unter Linux mit gcc und icc), Inline-Assembler zu verwenden.
    Ziel von mir ist es zum einen, in der Lage zu sein, bestimmte Sachen manuell zu optimieren und zum anderen vom Compiler erzeugten Quellcode besser verstehen zu können.

    Ich habe kaum Erfahrungen mit modernem x86, gleichmal vorneweg.

    Wie und wo fange ich da an?

    Sollte ich Intel- oder AT&T-Syntax verwenden? Oder spielt das keine große Rolle?

    Gibt es (extrem) einsteigerfreundliche Tutorials?



  • Moin.

    Ich vermute das die meisten x86-Assembler-Programmierer den Intel-Syntax verwenden und das dieser wegen der von Intel und AMD vorhandenen Dokumente, über ihre CPUs welche den Intel-Syntax verwenden, deswegen auch leichter zu lernen ist. Wirklich (extrem) einsteigerfreundliche Tutorials über die Assembler-Programmierung gibt es aber (so weit ich weiss) immer noch nicht. Ich meine wer es sich zutraut englisch Dokumente zu lesen, der kann alle wichtigen Informationen aus den Dokumenten von Intel und AMD erfahren. Dort wird es so präzise wie möglich und auch umfassend erklärt.

    Speziel mit Inline-Assembler habe ich selber allerdings noch gar keine Erfahrungen gesammelt, sondern für Linux den NASM-Assembler verwendet, um damit kleine Anwendungen komplett in Assembler zu schreiben. C habe ich selber auch noch nie verwendet.

    Angefangen bin ich auf dem PC mit einem Intel 80286 (16 Bit CPU) im Real Mode unter MSDOS. Und bevor ich einige DOS-Befehle lernte zu benutzen habe ich mit Debug.exe die ersten x86-Assemblerbefehle und die Adressierung des Speichers erkundet und mittels "try and error" einfach ausprobiert. Damals hatte ich noch gar kein Internet und auch keine Dokumente über die CPU, sondern nur eine grobe Thoerie darüber wie es funktionieren könnte. (Aber das soll jetzt kein Ratschlag dafür sein mit einem 80286 und DOS anzufangen.)

    Dirk



  • shisha schrieb:

    Ich möchte anfangen (unter Linux mit gcc und icc), Inline-Assembler zu verwenden.
    ...
    Ich habe kaum Erfahrungen mit modernem x86, gleichmal vorneweg.
    Wie und wo fange ich da an?
    Sollte ich Intel- oder AT&T-Syntax verwenden?

    Es ist keine gute Idee, Assembler mit dem GCC-Inline-Assembler zu lernen. Das Ding ist extrem kompliziert und extrem schlecht dokumentiert. ICC kenne ich nicht, vermute aber, dass es damit dasselbe ist.

    Verwende Intel-Syntax. AT&T-Syntax ist extrem kompliziert und extrem schlecht dokumentiert.

    Fang damit an, einfache C-Funktionen in demselben Programm als Funktion mit Inline-Assembler umzusetzen, z.B.:

    #include <stdio.h>
    
    void hallo_asm (char* hello)
    {
        char* format = "Hier ist Inline-Assembler: %s";
        __asm__
        (
            ".intel_syntax noprefix \n"
            "push %[hello]          \n"
            "push %[format]         \n"
            "call printf            \n"
            "add esp, 8             \n"
            ".att_syntax            \n"
            :
            : [hello] "r" (hello), [format] "r" (format)
        );
    }
    
    void hallo (char* hello)
    {
        printf ("Hier ist C-Funktion: %s",hello);
    }
    
    int main( void )
    {
        char* hello = "Hallo Welt!\n";
    
        hallo (hello);
        hallo_asm (hello);
    
        return 0;
    }
    

    Falls Du ein 64-Bit-Linux hast: mit 'gcc -m32 ...' kompilieren. Dazu muss man aber wohl noch einiges installieren (weiß nich mehr genau :)). Bei Assembler-Fragen musst Du unbedingt angeben, ob Du ein 32-Bit- oder ein 64-Bit-Betriebssystem fährst.

    viele grüße
    ralph



  • Ein Tipp fürs Leben.

    Inline Assembler mit dem GCC durchzuführen und das auch noch in Intel Syntax ist extrem grottig. Für die Intel Syntax wurde der GCC nämlich nie entworfen, der erwartet nämlich normalerweise AT&T Syntax, entsprechend muss man sich verrenken, wenm man ihn mit Intel Syntax füttern will.

    Stattdessen würde ich dir daher empfehlen als Compiler entweder

    A) den C++ Compiler von Visual Studio zu verwenden, dafür brauchst du dann aber Windows (was aber auch in Virtualbox funktioniert)

    oder

    😎 anstatt dem GCC Compiler unter Linux einfach den D 2.0 Compiler DMD zu verwenden, die Programmiersprache D unterstützt nämlich inline Assembler von Haus aus und das in standardisierter Form für die x86 Architektur.
    Und da du eh Assembler lernen willst, brauchst du von D nicht viel zu Wissen, ein grober Rumpf genügt, alles andere kannst du in Assembler in einem asm{} Block machen, so wie du es willst.

    Guck dir dazu auch diese Seite an:
    http://dlang.org/iasm.html

    DMD für Linux kriegst du hier:
    http://dlang.org/download.html

    oder

    C) verzichte auf Inline Assembler und nutze nasm.


Log in to reply