Wieso geht das da nicht?



  • Ich hab das für den Inlineassembler von gcc gemacht und das will ums verrecken nicht hinhaun. Was hab ich falsch gemacht?

    #include<stdio.h>

    main()
    {
    unsigned long long int dtrate=666,enderg;
    asm(" rdtsc
    movl %%eax,%%ebx
    addl %0,%%ebx
    subl %%ebx, %%eax
    movl %%eax,%1"
    : "=g"(enderg)
    : "g"(dtrate)
    : "%eax","%ebx","%edx");
    printf("enderg = %d = %X\n",enderg,enderg);
    }



  • Ich kenn zwar die gcc-inline-asm-Syntax net wirklich, aber ich denke es hilft, wenn du "Warum funktioniert das nicht" Mal ein bisschen ausführst, ergo WAS funktioniert denn nicht



  • Ich krieg immer das gleiche ergebnis, egal was ich für dtrate eingebe. irgendwas mit -1,7 Mrd.



  • die syntax is irgendwie krank...



  • sag mal was dein prog machen soll



  • @Mr n: Die Syntax ist nicht krank, soweit ich durchblicke. Das ist AT&T-Sytax und die vielen %% braucht der Inlineassembler, dass er nicht durcheinander kommt.

    @doof: Das programm soll erst eax durch rdtsc mit einem Wert füllen. Dann wird eax nach ebx kopiert und dort dtrate hinzugezählt. dann zieht er ebx von eax ab, wobei das ergebnis in eax bleibt. dann wird eax nach enderg kopirt, dass dann ausgeben wird. meiner meinung nach dürfte da dann - dtrate rauskommen, also hier -666.



  • Original erstellt von James:
    Ich krieg immer das gleiche ergebnis, egal was ich für dtrate eingebe. irgendwas mit -1,7 Mrd.

    Hast du auch den exakten Wert? 🙂 Könnte ja irgendein Muster haben



  • Es kommt immer -1073743396 = 804C340 hex raus.

    [ Dieser Beitrag wurde am 26.08.2002 um 11:12 Uhr von James editiert. ]



  • Also ... Wenn Du schon C99 Variablen erstellst, solltest Du vielleicht auch den passenden Formatstring bei printf wählen ... 🙂

    printf("enderg = %llu ...",enderg);
    

    Hast Du Dir schon mal mit gcc -S den ASM-Output Deines Programms angesehn? Vielleicht kommst Du dann auf den Fehler ...



  • Du hast %0 und %1 vertauscht 🙂

    Wenn man das richtig macht, kommt -666 raus.

    P.S.
    Der gcc 3.0.4 hat auch einen Fehler gemeldet, da %0 ja ein Zuweisungs Operand ist, du ihn aber als Wert Operand benutzt 🙂

    P.P.S
    das heisst int main() und nicht main() 🙂



  • So ein blöder Fehler 😞 Bin gerade selber drauf gekommen.

    Soll ich dann nicht mit %0 anfangen, sondern erst mit %1? geht das dann?

    Und noch was: Wenn ich jetzt ein auf ein eindimensionales Feld zugreifen will, wie mach ich das? Wa schreibe ich erst mal die Variable rein? nach dem ersten : oder erst nach dem zweiten? Und was für einen Buchstaben muss ich dann in Anführungszeichen schreiben? r, q oder g oder ganz was anderes? Und wie kann ich dann auf eine bestimmte Speicherstelle vom Feld zugreifen? So in etwa: "%1(%%ecx)"?


Anmelden zum Antworten