Assembler Code aus externer asm-Datei in c++ einbinden



  • Wieso kann ich mein Assemblerprogramm nich einbinden bei folgendem Code? Was hab ich übersehen?

    Assembler.h

    #ifndef Assembler_h
    #define Assembler_h
    
    extern "C" {
    	unsigned summe (unsigned x, unsigned y);
    }
    
    class Assembler {
    public:
    
    	unsigned summieren (unsigned zahl1, unsigned zahl2) const
    	{
    		return ::summe (zahl1, zahl2);
    	}
    };
    
    #endif
    

    CAssembler.h

    #include <iostream>
    #include "Assembler.h"
    
    using namespace std;
    
    int main () 
    {
    	Assembler assem;
    
    	unsigned x = 15;
    	unsigned y = 10;
    
    	unsigned z =  assem.summieren(x, y);
    
    	cout << x << " + " << y << " = " << z << endl;
    
    return 0;
    }
    

    Assembler.asm

    [GLOBAL summe]
    
    ; IMPLEMENTIERUNG DER FUNKTIONEN
    
    [SECTION .text]
    
    summe:
    	push	ebp
    	mov		ebp,esp
    	mov		edx,[8+ebp]
    	mov		eax,[12+ebp]
    	add		eax, [eax + edx] 
    	pop		ebp
    	ret
    

    Wieso gibt mir der Compiler immer folgendes aus:

    error LNK2001: Nichtaufgelöstes externes Symbol "unsigned int __cdecl summe(unsigned int,unsigned int)" (?summe@@$$J0YAIII@Z)
    C:\C++\Projekte\AssemblerTest\Debug\AssemblerTest.exe : fatal error LNK1120: 1 unaufgelöste externe Verweise
    

    Ich hab wohl irgendwas übersehen....nur komm ich nicht drauf!
    Oder ist meine Implementierung schon falsch?



  • benutze inline assembler



  • das mit inline-assembler is mir schon klar, aber genau das will ich ja nicht.
    es muss doch ne möglichkeit geben das aus ner externen asm einzubinden die
    ich bei funktionsaufruf durchlaufe....



  • IIRC müssen externe C Symbole mit einem Unterstrich beginnen. Versuchs also mal mit _summe in deinem Assembler Modul.



  • Danke für den Vorschlag aber hat leider dennoch nicht funktioniert. 😞

    Ich hab auch weiter geforscht...der Compiler meckert nicht...der Fehler
    muss also beim Linker auftreten. Muss man da noch irgendwelche
    zusätlichen Dateien anlegen die "wissen" wo die summe-methode ist???



  • Basti aus Cottbus schrieb:

    error LNK2001: Nichtaufgelöstes externes Symbol "unsigned int __cdecl summe(unsigned int,unsigned int)" ([b]?summe@@$$J0YAIII@Z[/b])
    C:\C++\Projekte\AssemblerTest\Debug\AssemblerTest.exe : fatal error LNK1120: 1 unaufgelöste externe Verweise
    

    Das sieht aus, als ob dein Compiler trotz extern "C" Name-Mangling auf die Funktion anwendet. Kann ich mir allerdings nicht erklären...



  • audacia schrieb:

    Das sieht aus, als ob dein Compiler trotz extern "C" Name-Mangling auf die Funktion anwendet. Kann ich mir allerdings nicht erklären...

    Die :: vor dem Aufruf müssen weg



  • Das hatte ich auch schon probiert...das hilft auch nicht.
    Es ist zum Verzweifeln...
    😞



  • Basti aus Cottbus schrieb:

    Danke für den Vorschlag aber hat leider dennoch nicht funktioniert. 😞

    Dann machst du definitiv was falsch. Habs jetzt gerade mal probiert und funktioniert problemlos. Da ich leider deinen Assembler nicht kenne, hab ich's einfach mal mit meinem probiert (nasm) und den Code entsprechend angepasst.

    assembler.h

    #ifndef Assembler_h
    #define Assembler_h
    
    extern "C" {
        unsigned summe (unsigned x, unsigned y);
    }
    
    class Assembler {
    public:
    
        unsigned summieren (unsigned zahl1, unsigned zahl2) const
        {
            return ::summe (zahl1, zahl2);
        }
    };
    
    #endif
    

    assembler.cpp

    #include <iostream>
    #include "assembler.h"
    
    using namespace std;
    
    int main ()
    {
        Assembler assem;
    
        unsigned x = 15;
        unsigned y = 10;
    
        unsigned z =  assem.summieren(x, y);
    
        cout << x << " + " << y << " = " << z << endl;
    
        return 0;
    }
    

    assembler1.asm

    ;[GLOBAL summe]
    global _summe
    
    ; IMPLEMENTIERUNG DER FUNKTIONEN
    
    ;[SECTION .text]
    section .text
    
    _summe:
        push    ebp
        mov        ebp,esp
        mov        edx,[8+ebp]
        mov        eax,[12+ebp]
    ;    add        eax, [eax + edx] ; ?
        add        eax, edx
        pop        ebp
        ret
    

    Und die Erstellung mit nasm und msc über die Kommandozeile

    nasm -f win32 assembler1.asm
    cl /EHsc assembler.cpp assembler1.obj
    

    Wie gesagt, der Unterstrich bei summe ist wichtig. Ansonsten funktioniert es nicht.


Anmelden zum Antworten