Assembler Code einbinden



  • asm:

    funcentry:
    _funcentry:
    mov ......
    

    ob mit oder ohne unterstrich musst du testen, beides kann nicht schaden

    typedef int (*asmfunc)(int);
    
    asmfunc = (asmfunc)funcentry;
    
    int ret = asmfunc(42);
    

    wenn die obj dazugelinkt wurde, sollte er das label finden



  • ich bezweifle, dass das funktionieren wird, und du den interupt so in dein Programm bekommst.
    wenns keine Dosanwendung ist, wird windows auch keine interrupts emulieren und echte wird es nicht gestatten.



  • was du außerdem nicht machen kannst ist, eine objektdatei des einen assemblers mit einer objektdatei eines anderen vermischen.
    Das geht meistens schief, erst recht, wenn das eine, ein realmode-objekt ist und das andere eine win32 anwendung.



  • vlad_tepesch schrieb:

    was du außerdem nicht machen kannst ist, eine objektdatei des einen assemblers mit einer objektdatei eines anderen vermischen

    Auch nicht, wenn ich den MASM nutze? Ich meine gelesen zu haben, dass den MVS 20005 auch nutzt.

    vlad_tepesch schrieb:

    windows auch keine interrupts emulieren und echte wird es nicht gestatten

    Gibt es trotzdem eine Möglichkeit?

    ungetestet schrieb:

    asm:

    funcentry:
    _funcentry:
    mov ......
    

    ob mit oder ohne unterstrich musst du testen, beides kann nicht schaden

    typedef int (*asmfunc)(int);
    
    asmfunc = (asmfunc)funcentry;
    
    int ret = asmfunc(42);
    

    Werde das mal testen... Was bewirken die drei Zeilen im C++ Code genau?

    Danke für eure Hilfe 👍



  • in der ersten zeile sag ich dem compiler:
    asmfunc ist ein zeiger auf eine funktion vom typ int mit einem int-parameter.

    das musst du natürlich anpassen, je nachdem welche parameter deine funktion hat.
    ein googeln nach calling-convention sollte da was bringen.

    zeile 2 sagt dem compiler dass er in dem zeiger die addresse von funcentry
    speichern soll. vllt musst du funcentry noch einmal als "extern void *funcentry"
    deklarieren. der linker findet dann den verweis auf "funcentry" oder "_funcentry"
    in der einen obj datei und sucht dann in deiner asm-obj-datei danach.

    wenn er fündig wird. wird die addresse deines assemblercodes in den
    funktionszeiger geschrieben.

    in zeile 3 rufen wir das teil dann auf in der hoffnung das alles geklappt hat.

    kannst auch versuchen direkt als "int funcentry(int);" zu deklarieren



  • edit:

    vergessen den zeiger anzulegen.... 🙄

    extern void *funcentry;
    
    typedef int (*asmfunc)(int);
    
    asmfunc func = (asmfunc)funcentry;
    
    int ret = func(42); 
    
    // oder
    
    int funcentry(int);
    


  • Kronos_m schrieb:

    vlad_tepesch schrieb:

    was du außerdem nicht machen kannst ist, eine objektdatei des einen assemblers mit einer objektdatei eines anderen vermischen

    Auch nicht, wenn ich den MASM nutze? Ich meine gelesen zu haben, dass den MVS 20005 auch nutzt.

    das mag gehen, du schriebst vorhin aber was von nasm

    vlad_tepesch schrieb:

    windows auch keine interrupts emulieren und echte wird es nicht gestatten

    Gibt es trotzdem eine Möglichkeit?

    benutze eine bibliothek.
    es gab da mal einen header/lib "conio.h", weiß aber nicht, ob der unter xp und win32 au h noch funktioniert.



  • vlad_tepesch schrieb:

    windows auch keine interrupts emulieren und echte wird es nicht gestatten

    kronos_m schrieb:

    Gibt es trotzdem eine Möglichkeit?

    benutze eine bibliothek.
    es gab da mal einen header/lib "conio.h", weiß aber nicht, ob der unter xp und win32 au h noch funktioniert.

    Hat leider nicht funktioniert.

    Mal was anderes dazu:

    int iTest;
    
    	__asm {[asm]
    		mov eax, [0x41A];
    		mov iTest, eax;[/asm]
    	}
    

    Warum bekomme ich den Inhalt der Speicheradresse nicht in die Variable rein? Hinterher steht da 1050 drin, was einfach nur der Dezimalwert von 41Ah ist :-|



  • x86 Assembler ist bei mir schon recht lange her, aber versuchs mal mit "mov eax, dword ptr[0x1234]"



  • ja, achte darauf, dass der MASM syntax benutzte, nicht die von nasm


Anmelden zum Antworten