Assembler Code einbinden



  • Hallo Zusammen 🙂

    Gibt es die Möglichkeit Assemblercode über eine externe Datei in ein Programm einzubinden? Ich möchte keinen Inline Assembler, da ich keine Interrupts nutzen kann. Ich habe eine compilierte *.obj Datei von meinem Assemblerquellcode. Nun möchte ich diesen Assemblercode aus meinem C++ Code beliebig aufrufen können.
    Ich benutze MVS 2005 (falls das informativ ist).

    Wäre super, wenn jemand Hilfe geben könnte!

    Viele Grüße...



  • Wenn du eine obj Datei hast -> einfach linken. In den Projekt Einstellungen kannst du ja dem Linker sagen welche extra libraries er noch nehmen soll...



  • Was für Interrupts willst du denn nutzen?
    Unter Windows?!?
    Viel Erfolg...



  • Möchte den int 10h nutzen. Ich setze mit dem Interrupt den cursor auf der Konsole an eine bestimmt Position. Habe das ganze unser NASM getestet und kompliliert --> *.obj Jetzt würde ich dies gerne als externe Funktion einbinden und beliebig aufrufen können! Ist das möglich, meine Eingebundene Datei nach belieben aufzurufen, und sie zu behandeln, wie eine Funktion?



  • 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