Simples MASM Beispiel anhand von Erstellen einer MsgBox



  • Ich habe vor längerem mal begonnen mich ein bisschen mit MASM zu beschäftigen, bisher hatte ich allerdings noch kaum Zeit viel weiterzumachen.
    Ich habe mal ein kleines Programm geschrieben, was ich für mich selbst sehr ausführlich kommentiert habe.
    Vielleicht hilft es dem ein oder anderen auch weiter als Anreiz:

    .386 
    	;Definiert das 80386 instruction set für den Assembler
    	;386p würde das Programm im privileged mode ablaufen lassen, somit können privileged instructions ausgeführt werden, die sonst von der CPU oder vom OS reserviert sind
    .MODEL FLAT, STDCALL 
    	;model flat definiert das Speichermodel flat für unser Programm, unter Win32 gibts es nur dieses
    	;sdtdcall definiert die Art der Parameterübergabe links nach rechts oder rechts nach links und wer den Stack nach einem Funktionsaufruf wieder anpasst
    	;unter Win32 werden Parameter nach der stdcall Konvention von rechts nach links auf den Stack gepusht. Die Function räumt den Stack nachdem sie aufgerufen wurde wieder auf und liefert das Ergebnis im Register EAX zurück
    option casemap:none 
    	;Unterscheidung von Groß/Kleinschreibung an
    include f:\masm32\include\windows.inc
    include f:\masm32\include\kernel32.inc
    include f:\masm32\include\user32.inc
    includelib f:\masm32\lib\kernel32.lib
    includelib f:\masm32\lib\user32.lib
    	;Includes
    	;.inc beinhalten Funktions Prototypen. Ein Funktions-Prototyp definiert die Attribute einer Funktion für den Assembler/Linker, damit er ein Datentyp-Check für uns machen kann. 
    	;zb ExitProcess proto uExitCode:DWORD [FunktionsName PROTO [ParameterName]:DatenTyp,[ParameterName]:DatenTyp,...
    .DATA
    MsgBoxCaption db "Paxi MsgBox Tut",0
    MsgBoxText db "Win32 Assembly ist super! :)", 0
    	;beinhalted bereits initialisierte Daten 
    	;db definieren bytes, ASCII Strings immer mit 0 terminieren!
    .DATA?
    	;beinhalted nicht initialisierte Daten, reserviert nur Speicher
    .CONST
    	;beinhalted Konstanten 
    .CODE
    	;hier startet der Code
    start:
    	;Label start
    	push MB_OKCANCEL
    	push offset MsgBoxCaption
    	push offset MsgBoxText
    	push NULL
    	call MessageBox
    		;Pushen der 4 Benötigten Argumente auf den Stack, aufrufen(call) der Funktion MessageBox aus der WinAPI	(http://msdn.microsoft.com/en-us/library/ms645505%28VS.85%29.aspx)
    		;offset übergibt die Adresse
    		;selbiges geht auch mit der Funktion invoke die unter MASM zur Verfügung steht: invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OKCANCEL
    	push NULL
    	call ExitProcess
    		;Pushen des benötigten Parameter auf den Stack, aufrufen(call) der Funktion ExitProzess aus der WinAPI (http://msdn.microsoft.com/en-us/library/ms682658%28VS.85%29.aspx)
    		;selbiges mit: invoke ExitProcess, NULL
    
    end start;
    	;Label start Ende
    


  • wenn man schon das masm32 SDK verwendet, kann man die Sache natürlich noch etwas minimieren:

    include masm32rt.inc
    .code
    start:
        fn MessageBoxA,0,"Win32 Assembly ist super! :)","Paxi MsgBox Tut",MB_OK
        invoke ExitProcess,0
    end start
    

Log in to reply