NASM in das Visual Studio 2005 einbinden ??
-
naja, ich hab jetzt halt den nasm-syntax gelernt. aber es würde mir auch reichen, nur die die unterschiede erklärt zu bekommen, so lange es nicht zuu viele sind. mein eigentliches ziel ist es nur zB an die mmx ran zu kommen.
ich hab hier mal ein beispiel-code, der zum beispeil vom GCC (Gnu C Compiler) ohnee probleme kompiliert wird: (ein rekursives fakultätsprogl); Konvention : ; eax, ecx, edx sind "caller save" Register (kann ich beliebig veraendern) ;ebp, ebx, esi, edi sind "caller save" Register (die darf ich nicht veraendern) GLOBAL fak_rekasm code ;****************************************************** ; Rekursive Berechnung der Fakultaet ;****************************************************** ; Aufrufparameter in eax ablegen und fak_rek aufrufen fak_rekasm: push ebp mov ebp, esp mov eax, [ebp + 8] call fak_rekursive pop ebp ret ; Eigentlich Funktion fak_rekursive: cmp eax, 1 jg groesser_1 mov eax, 1 ret groesser_1: push eax dec eax call fak_rekursive pop ecx mul ecx ret end
naja und der masm meckert schon über das "GLOBAL" am anfang.
heimschmiede
-
NASM kenne ich nicht, arbeite mit MASM - aber wie ich sehe, wird in NASM auch die Intel-Syntax benutzt - es gibt folglich nur wenige Unterschiede.
Dein Quelltext in MASM :; Konvention : ; eax, ecx, edx sind "caller save" Register (kann ich beliebig veraendern) ;ebp, ebx, esi, edi sind "caller save" Register (die darf ich nicht veraendern) .586 ; Prozessor .586 .model flat, c ; Kompatibel zu Sprache C in C++ Dateien mit extern "C" fak_rekasm deklarieren! .code ; Codesegment es gibt noch .data, data? und .const ;****************************************************** ; Rekursive Berechnung der Fakultaet ;****************************************************** ; Aufrufparameter in eax ablegen und fak_rek aufrufen public fak_rekasm fak_rekasm: push ebp mov ebp, esp mov eax, [ebp + 8] call fak_rekursive pop ebp ret ; Eigentlich Funktion fak_rekursive: cmp eax, 1 jg groesser_1 mov eax, 1 ret groesser_1: push eax dec eax call fak_rekursive pop ecx mul ecx ret end
Schau mal wegen MASM bei Codingcrew.de vorbei. Wenn Dir was nicht klar ist, frag hier nach.
mfg
-
PS Wenn Du fak_rekam von C++ aufrufen willst muss dort
extern "C" void fak_rekam();
stehen!
-
freak11 schrieb:
PS Wenn Du fak_rekam von C++ aufrufen willst muss dort
extern "C" void fak_rekam();
stehen!
Na in C++ muss eine Funktion die einen Parameter übernimmt und einen zurückliefert dann doch wohl so aussehen:
extern "C" int fak_rekasm(int);
-
danke für eure antworten,
ich habs mal ausprobiert, bekomme aber leider immer die gleichen fehler beim compilieren. vlt liegt es an der version, die ich nutze: Visual Studio pro 2005
jetzt meckert er halt nicht mehr über die asm-file, sondern eher über:
fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen?
wenn ich jetzt aber die stdafx.h einbinde bekomme ich folgenden fehler:
fatal error C1853: Die vorkompilierte Header-Datei "Debug\ASS.pch" stammt von einer früheren Version des Compilers, oder der vorkompilierte Header stammt von C++, und Sie verwenden Ihn von C (oder umgekehrt)
weiß einer von euch, was man dagegen tun kann?
die c-file sieht wie folgt aus:#include <stdio.h> #include "stdafx.h" extern "C" int fak_rekasm(int); int main(void){ int n = 4; int erg1 = fak_rekasm(n); printf("\nAufruf von fak_rekasm(%d) = %d\n", n, erg1); return 0; }
heimschmiede
-
stdafx.h muss als erstes in der Datei stehen, stdio.h wird in stdafx.h eigendlich bereits eingebunden.
-
Wenn das ne *.c File sein soll hat extern "C" da nichts zu suchen, das ist C++ - in C bloss extern int func(int) schreien und stdafx.h in 'ner c-datei hab ich noch nie gesehen.
-
moinsen,
ich habs jetzt mal ausprobiert ohne das "C", aber ich bekomm immer die gleichen Fehler.
ich meine, mein Programm ist ja nur ein Bsp-Proggl. Könnt ihr mir einfach mal die Quelltexte eines ganz einfachen Beispiels senden, in dem man eine in ner asm-file (MASM) definierten Funktion in C einbindet ?
die beispiele der msdn sind irgendwie anders gebaut. Dort wird ständig mit dem Schlüsselwort PROC rumgebastelt.
das programm muss ja nix wesentliches tun. einfach nur nen integer übergeben bekommen und inkrementiert zurückgeben oder so.
Das wäre sehr cool!heimshcmiede
-
Deine rekursive Fakultätsfunktion in Assembler fak_rekasm: ist in Ordnung proc muss man da nicht schreiben.
Hab ich selbst getestet - sie funktioniert, lässt sich aus C++ (extern "C")und C (extern) aufrufen.
Du machst irgendwo was falsch.
Du musst die Fehler posten die du erhältst - damit man dir helfen kann!
Deine Funktion mal als proc :.586 ; Prozessor .586 .model flat, c ; Kompatibel zu Sprache C in C++ Dateien mit extern "C" fak_rekasm deklarieren! .code ; Codesegment es gibt noch .data, data? und .const ;****************************************************** ; Rekursive Berechnung der Fakultaet ;****************************************************** ; Aufrufparameter in eax ablegen und fak_rek aufrufen public fak_rekasm option prologue:none option epilogue:none fak_rekasm proc para:dword push ebp mov ebp, esp mov eax, para call fak_rekursive pop ebp ret ; Eigentlich Funktion fak_rekursive: cmp eax, 1 jg groesser_1 mov eax, 1 ret groesser_1: push eax dec eax call fak_rekursive pop ecx mul ecx ret fak_rekasm endp end
mfg
-
bei mir klappt es leider nicht. ich hab irgendwie das gefühl, dass irgendeine einstellung im vs2005 nicht korrekt läuft. ich bekomme immer die gleichen fehlermeldungen:
Heimschmiede schrieb:
jetzt meckert er halt nicht mehr über die asm-file, sondern eher über:
fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen?
wenn ich jetzt aber die stdafx.h einbinde bekomme ich folgenden fehler:
fatal error C1853: Die vorkompilierte Header-Datei "Debug\ASS.pch" stammt von einer früheren Version des Compilers, oder der vorkompilierte Header stammt von C++, und Sie verwenden Ihn von C (oder umgekehrt)diese beiden fehler bekomm ich leider immernoch.
was ich aber komisch finde ist, dass die bsp-asm-projekte aus der msdn alle funktionieren. ich habe aber keine anders eingestellte eigenschaften gefunden.
@freak11: leider funktionniert der von dir geändertem Quelltext auch nicht.heimschmiede
-
ahhh! ich habs hinbekommen !
im projekt musste ich die eigenschaft "vorkompilierten Header verwenden" ausschalten.
und wenn man tatsächlich den vorkompilierten header nutzen will und in c++ schreibt muss tatsächlich die stdafx als aller erstes eingebubunden werden! (dank an tip)
naja, war wohl eher ein VS-problem, anstelle eines assembler-problems. Danke nochmal an euch alle und die Mühe !
ich werde später noch einen neuen thread aufmachen zur syntax vom masmheimschmiede
-
Hallo,
versuche mich auch mit asm in Visual Studio. werde aber extern auf der CommandoZeile kompilieren müssen. Ist für mich auch Ok.
Aber ich brauche Syntax Coloring. Bekommt ihr das hin? Wenn ja wie?
Grüßle