MASM (einsteiger) Problem



  • ich wollte ein simples programm ausprobieren mit folgenden code

    .386
    .model flat,stdcall
    option casemap:none
    
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\masm32.lib
    
    .data
        szText db 72,97,108,108,111,0
    .code
        start:
            push offset szText
            call StdOut
        end start
    

    das sollte mir einfach Hallo in der konsole ausgeben ... leider ist dem nicht so wen ich das programm ausführe sagt windows das die anwendung ein problem festgestellt hat und beendet werden mus ... was mache ich falsch ? ich habe herausgefunden das der denn fehler nur spuckt wen ich im data segment versuche etwas in den speicher zu schreiben ... übringens ich hab auch mit

    szText db "Hallo",0
    

    probiert



  • Dein Programm läuft nach dem Aufruf von SdtOut in eine nicht definierten Bereich -> ExitProcess.



  • Mit "end start" teilst Du dem Assembler/Linker nur mit, wo der Startpunkt des Programms ist. Beenden musst Du es selbst:

    xor eax, eax    ; Returncode (0: alles in Ordnung)
    ret             ; Programmende
    

    So machen es die meisten Compiler. Man kann aber auch übervorsichtig sein:

    invoke ExitProcess, 0
    

    viele grüße
    ralph



  • Oh danke stimt das erklärt die test.exe die nichtmehr verschwinden will 😃

    edit: Jetzt läuft das ohne fehler aber es erzeugt keine ausgabe 😮



  • TomHalo schrieb:

    Oh danke stimt das erklärt die test.exe die nichtmehr verschwinden will 😃

    edit: Jetzt läuft das ohne fehler aber es erzeugt keine ausgabe 😮

    Da die Ausgabe auf der Console stattfindet, musst Du ein Konsolenprogramm erstellen:

    ml.exe /coff test.asm /link /SUBSYSTEM:CONSOLE

    und das Ganze in einer Konsole ("Eingabeaufforderung") ablaufen lassen.

    viele grüße
    ralph

    Edit: Im Quick Editor vom MASM32-Paket (qedit.exe) nimmst Du nicht die Option "Assemble&Link", sondern "Console Assemble&Link".



  • was macht der assembler den dann für unterschiede ?



  • TomHalo schrieb:

    was macht der assembler den dann für unterschiede ?

    gar keine, da dies nur den Linker betrifft, der einen entsprechenden Vermerk im PE Header deine EXE macht. Ein Konsolen-Programm ist ein eine gewöhnliches GUI Programm, bei dem automatisch eine Konsole geöffnet wir, bevor der eigentliche Code aufgerufen wird. (sieh auch AllocConsole())



  • Ok Danke damit haben sich meine fragen erledigt 😃


Anmelden zum Antworten