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.