gcc inline Assembler



  • Ich lerne gerade inline Assembler mit gcc und frage mich warum folgendes nicht funktioniert:

    #include <stdio.h>
    int main(void)
    {
    char hello[256]="Hello World!\n";
    int eingabe[256];
    __asm__("mov $4, %eax ");
    __asm__("mov $1, %ebx");
    __asm__("mov $hello, %ecx");
    __asm__("mov $13, %edx");
    __asm__("int $0x80");
    __asm__("mov $3, %eax");
    __asm__("mov $0, %ebx");
    __asm__("mov $eingabe, %ecx");
    __asm__("mov $13, %edx"); 
    __asm__("int $0x80");
    __asm__("mov $4, %eax"); 
    __asm__("mov $1, %ebx");
    __asm__("mov $eingabe, %ecx");
    __asm__("mov $13, %edx");
    __asm__("int $0x80");
    __asm__("mov $1, %eax");
    __asm__("mov $0, %ebx");
    __asm__("int $0x80");
    
    return 0;
    }
    

    Hoffe jemand kann mir sagen warum es nicht funktioniert,denn es erscheint
    folgende fehlermeldung:

    gcc assembler.c -o assemb
    assembler.c:27:2: warning: no newline at end of file
    /tmp/ccugobmw.o(.text+0x59): In function main': : undefined reference tohello'
    /tmp/ccugobmw.o(.text+0x6f): In function main': : undefined reference toeingabe'
    /tmp/ccugobmw.o(.text+0x85): In function main': : undefined reference toeingabe'
    collect2: ld returned 1 exit status

    PS:Wer ein gutest tutorial inline Assembler mit gcc kennt bitte posten..
    Danke



  • Ein gutes Inline HowTo findest du hier. Inline ASM mit dem gcc funktioniert nach dem folgenden Prinzip:

    __asm__("asm code" : output : input : registers);
    

    Variablen und Funktionen müssen entsprechend bei Input/Output angegeben werden. Wenn du z.B. die Adresse von hello nach ecx kopieren möchtest, müsste das so lauten:

    __asm__("movl %0, %%ecx"::"m"(*hello));
    

    Erklärung: %0 steht für den ersten optionalen Parameter ("m"(*hello)), vor dem ecx müssen zwei %% stehen, da durch ein % die Parameter angesprochen werden. Nach dem ersten : müssten die Output-Parameter kommen, die es hier aber nicht gibt. Nach dem zweiten : kommen die Input Parameter, in unserem Fall nur "m"(*hello). Das "m" zeigt an, dass es sich um einen Wert aus dem Speicher handelt. Und *hello gibt eben die entsprechende Adresse an. Bei der Variable eingabe funktioniert das analog.


Anmelden zum Antworten