Lokale Veriablen in Inline-Assembler ansprechen?



  • Grüssi!

    Wie kann ich denn mit MinGW in Inline-Assembler lokale Versiablen ansprechen?
    das klappt z.B. gut (jedenfalls kann ichs kompilieren):

    UINT d;
    int main(int argc, char *argv[])
    {
    __asm("mov %edx, _d");
    system("PAUSE");
    return 0;
    }

    wohingegen das nicht mehr funktioniert:

    int main(int argc, char *argv[])
    {
    UINT d;
    __asm("mov %edx, _d");
    system("PAUSE");
    return 0;
    }

    Ich habe aber leider keine andere Wahl, ich muss es so machen (ich wäre nie im leben so bescheuert freiwillig assembler zu nehmen)...

    Kennst sich da wer aus???

    Mfg Clemens



  • #include <stdio.h>
    
    int main(void) {
      int d;
      __asm__ __volatile__ ("movl %%eax,%0" : "=a"(d) );
      printf("%d\n",d);
      return 0;
    }
    

    ich hab zwar schon länger nichts mehr mit (Inline) Assembler gemacht, glaube aber, dass das so ungefähr ging.

    ganz interessant ist folgender Artikel
    http://www-106.ibm.com/developerworks/linux/library/l-ia.html?dwzone=linux



  • Erstmal danke für deine Hilfe!!

    Oh, gott, dass kapiere ich ja nie. Jaja, der Code funktioniert, mein MinGW frisst ihn ohne zu mekern, aber verstehen tu ich nur Bahnhof 😢

    Ich hätte da eine bitte, ich weiß das das hier kein Auftrag ist oder so, und es tut mir leid, dass ich dir die Zeit raube, aber könntest du mir nur diese eine Zeile so umschreieben, dass sie der GNU-Compilier futtert:

    UINT d;
    __asm("mov %edx, _d");

    Es müsste so ähnlich gehen, es funktioniert auch, so lange d nur eine globale Variable ist. Also was mus ich ändern, damit d auch eine lokale Variable sein kann?

    Ansonsten muss ich diese Project mit dem Visual machen, und ich verachte alles was von M$ ist ;-)....

    Tut mir leid dass ich so nervig bin, und danke für alles!

    Mfg Clemens

    PS: Den Code habe ich in einem File bekommen das wir eigentlich nur in unser (Schul)-Project einbinden sollten, nicht umschreiben oder verstehen 😉
    Da ich das ganze aber nicht mit Vidual machen will, bin ich aufgeschmissen. Ich hab mir schon eine DLL gebaut, aber wenn ich gcc main.o serial.dll -o serial sage, hängt sich "ld" mit einer Acess-Violation auf. Und wenn ich gegen die object-files linke, bekomme ich immer unresolved symbols.
    Mir wäre es eh lieber, wenn ich die Visual-DLLs oder objects nehmen könnte, aber anscheinend funktioniert das nicht:

    C:\Dev-Cpp\Projects\SerialChat>..\..\bin\gcc.exe main.o IOPort.obj ..\..\lib\gcc
    -lib\mingw32\3.2\libgcc.a
    IOPort.obj(.text+0x29): In function outport': d:\\serialchat\\iopo:3: undefined reference to_chkesp'
    IOPort.obj(.text+0x28): In function outportb': d:\\serialchat\\iopo:14: undefined reference to_chkesp'
    IOPort.obj(.text+0x2b): In function inportb': d:\\serialchat\\iopo:24: undefined reference to_chkesp'
    IOPort.obj(.text+0x33): In function inport': d:\\serialchat\\iopo:33: undefined reference to_chkesp'
    IOPort.obj(.text+0x3a): In function StartUpIoPorts': d:\\serialchat\\iopo:2: undefined reference to_chkesp'
    IOPort.obj(.text+0x50):d:\serialchat\iopo:3: more undefined references to `_chke
    sp' follow



  • __asm__ __volatile__ ("movl %0,%%eax" : "=a"(d) );
    

    kopiert d nach eax



  • __asm__ declfar[extOPT] >> "far_pointer <<movd>> %eax, %ebx" ( void )
    + __volatile__ int do {{ while( __asm__("test %bp", (=a=\"\dd\") }">>> _PLUS_
    

Anmelden zum Antworten