DevC++ und Inline-Assembler



  • wie ist die funktion im assembler text deklariert? bei nasm kommst du, glaube ich, nicht drumherum, den führenden unterstrich per hand einzufügen.



  • Die ASM Datei sieht wie folgt aus:

    bits 32
    
    global _test_funktion
    [noch anderes Zeug]
    
    section .data
    
    align 16
    
    [noch anderes Zeug]
    
    section .text
    
    align 16
    
    _test_funktion:
    
        push ebp
        mov ebp,esp
    
        pushad
    
        mov edi,[ebp+8]       ; destination
        mov esi,[ebp+12]      ; source
        mov ecx,[ebp+16]      ; bytes
    
        mov eax,ecx
        shr ecx,6
        mov ebx,ecx
        shl ebx,6
        sub eax,ebx
    [usw.]
    

    Müsste eigentlich stimmen, oder?



  • Ich hab mal schnell bei mir nachgeschaut, und wenn ich das richtig sehe, dass muss man die asm-Funktionen nach aussen bekannt machen, also ungefähr so

    section .text
    
    align 16
    
    global _test_funktion
    
    _test_funktion:
    ; etc.pp
    


  • Hab ich gemacht, aber der Fehler verschwindet nicht. Außerdem glaube ich nicht, dass der Fehler im Assembler-Code steckt, sondern viel eher, dass ich die Datei falsch eingefügt habe.

    Also, wie gesagt, die Prototypen sind definiert, die unkompilierte Assembler-Datei habe ich auch - nur wie geht es weiter? Wie füge ich die Assembler-Datei richtig in mein Projekt ein? Vielleicht kann mir auch jemand erklären, wie es das mit Inline-Assembler aussehen müsste.



  • Du brauchst natürlich die compilierte asm Datei, also die Objekt Datei. Diese muss in dem Format vorliegen, die dein C/C++ Compiler versteht. Bei NASM kannst du das ja mit -f beeinflussen. Für den GCC sollten das afaik coff Objektdateien sein.



  • Wie müsste der Konsolenbefehl für NASM denn aussehen?

    Ich habe es immer so versucht: nasmw -o mmx.o -f win32 mmx.asm



  • Ah, ich hätte zuerst die Hilfe von NASM besser durchlessen sollen.

    Also, win32 einfach durch coff ersetzt und kompiliert. Was jetzt? Wie soll ich die Objektdatei meinem Projekt hinzufügen?



  • Projekt Optionen -> Parameter und dann Bibliothek/Objekt hinzufügen



  • Habe ich so gemacht, aber es kommt wieder der selbe Linker Error. Gibt es nicht noch eine andere Möglichkeit?



  • Noch 'ne andere Idee. Hast du den Prototypen entsprechend eingebettet (afaik werden nur C Funktionen intern mit dem Unterstrich gehandelt), zB so

    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    void __cdecl test_funktion(void *d,void *s,int bytes);
    // alle weiteren Funktionen hier rein
    
    #ifdef __cplusplus
    }
    #endif
    

Anmelden zum Antworten