NASM in das Visual Studio 2005 einbinden ??



  • moinmoin,
    ich hab schon nach gegoogelt, aber mit nur wenig erfolg. es gab immer irgendwelche probleme. einmal hatte ich es soweit, dass nur der linker vom vc die bin im falschen ordner gesucht hat.
    Würde mich echt glücklich machen, wenn mir das einer erklären könnte. und ich hab gehört, dass die asm-files im vc ein paar besonderheiten haben müssen.

    heimschmiede



  • Würde dir nicht inline assembler reichen?



  • Wieso NASM es gibt doch MASM32 für VS2005?

    Bei mir läuft Visual-Studio 2005 Standard-Version. Darin ist der Microsoft-Macro-Assembler ml.exe enthalten (bekannt als masm32).
    Der Assembler in der Version 8.0.. ist Ergänzung des VC++ 8.0 Compiler.
    Ich kann mit Quellcode in C++, C und Assembler gleichzeitig in Projekten arbeiten. IntelliSense-Infos auch in den asm-Dateien! - vom Feinsten!
    Wenn in C++ oder C keine main()-Funktion existiert und in der asm-Datei "start:" definiert ist - beginnt das Programm beim "start:" Label der Assemblerdatei.

    Etwas umständlch ist asm-Dateien in die Projekte einzubinden, weil die *.asm Dateiendung in den Menüs nicht aufgeführt wird - also Handarbeit.

    1. Datei > Neu > Projekt > Visual C++ > Win32 > Win32-Projekt oder-Konsolen Anwendung
    2. Projekt > Neues Element hinzufügen > z.B Headerdatei
    3. Headerdatei umbenennen neue Endung *.asm
    4. Projekt > Vorhandenes Element hinzufügen > asm-Datei zum Projekt hinzufügen

    Diese neu dem Projekt hinzugefügte asm-Datei muss im Editor den Focus haben! - damit unter Projekt der Menüpunkt "Benutzerdefinierte Buildregel" sichtbar wird.

    5. Projekt > Benutzerdefinierte Buildregel > Microsoft-Macro-Assembler aktivieren!

    Ab jetzt wird vor dem Compilieren die asm-Datei assembliert, wenn du Erstellen wählst. Fehler-Report, Linken, IntelliSense alles inklusive.

    Gibst du jetzt der *.cpp Datei die Endung *.c und schliesst die *.cpp Datei aus(Fokus im Editor!)Projekt > Aus Projekt ausschliessen - aus dem Projekt aus,

    hast du ein C-Projekt mit *.asm Datei oder nur die C++ Datei ausschliessen und du hast ein reines Assembler-Projekt(start: ... end start).

    Unter Projekt > Eigenschaften > Konfigurationseigenschaften > Microsoft-Macro-Assembler hast du weitere Einstellmöglichkeiten für den Assembler.

    mfg



  • Helmut S. schrieb:

    Wieso NASM es gibt doch MASM32 für VS2005?

    z.B. gibt es den NASM auch für andere Betriebssysteme als Windows. Außerdem ist die Syntax ein wenig anders. Oder, wenn mal also schon ein Programm mit NASM geschrieben hat, wird man das wohl nicht immer konvertieren wollen, nur um IntelliSense benutzen zu können...



  • 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 masm 🙂

    heimschmiede



  • 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


Anmelden zum Antworten