Microsoft Macro Assembler

Microsoft Macro Assembler

Der Microsoft Macro Assembler (abgekürzt MASM) ist ein von Microsoft entwickelter Assembler für x86-basierende Prozessoren. Er übersetzt Assemblerquelltext in ausführbaren, nativen Maschinencode.

Der Microsoft Macro Assembler entwickelte sich zeitweise zum meistbenutzten Assembler für die Entwicklung von MS-DOS-Programmen. Heutzutage ist MASM der bevorzugte Assembler für alle Microsoft-basierenden Betriebssysteme (wohl auch aufgrund des MASM32-SDK). Er ist in aktuellen Versionen in der Entwicklungsumgebung Microsoft Visual Studio (und Express) enthalten, es gibt ihn aber auch in einer separaten Download-Version. Die kostenlosen Versionen von MASM dürfen nicht für kommerzielle Zwecke verwendet werden. Zudem darf man sie nur zur Entwicklung für Microsoft-Betriebssysteme verwenden – alle anderen Betriebssysteme sind ausdrücklich durch die EULA (End-User License Agreement) ausgeschlossen.

Als kommerzieller Konkurrent zum Microsoft Macro Assembler behauptete sich besonders der Turbo Assembler von Borland. Als kostenlose und freie Alternativen sind beispielsweise die Programme Netwide Assembler und Flat Assembler bekannt geworden.

In der Aktuellen Version 10.0 werden folgende Befehlssätze unterstützt: x86-32/64, x87-fpu, MMX, 3DNow, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4.A, VMX, AVX und AES. Seit der Version 8.0 gibt es zwei Ausgaben unter derselben Versionsnummer, eine für die x86-32-Architektur und eine für die x86-64-Architektur.

Inhaltsverzeichnis

Hochsprachen ähnliche Ausdrücke

MASM verfügt über Ausdrücke, wie man sie aus C kennt. Diese erleichtern die Programmierung und helfen, den Quelltext übersichtlicher zu halten.

 .while/.endw, .repeat/.until, .break, .continue , .if/.elseif/.else/.endif, invoke (Funktionsaufruf).

Macros

Eine besonders hervorstechende Eigenschaft von MASM ist, wie der Name schon erahnen lässt, das äußerst mächtige Makrosystem. Mit ihm ist es sowohl möglich, Programmcode zu erstellen als auch Text zu verarbeiten. So ist es z. B. möglich, Konstrukte höherer Programmiersprachen wie „switch“ (Mehrfachauswahl in C) zu generieren.

Versionen

Der IBM Macro Assembler und der IBM Macro Assembler/2 waren OEM-Versionen des MASM. Obwohl MASM kein kommerzielles Produkt mehr ist, wird es von Microsoft weiterhin unterstützt. Die letzte MASM-Version, die als einzelnes Softwarepaket verkauft wurde, war die Version 6.11.

MASM Version Datum Produkt Bemerkungen
2.0 1984 (Einzelprodukt) für 8086/8087
3.0 1984 (Einzelprodukt)
4.0 1986 (Einzelprodukt)
5.0 1987 (Einzelprodukt)
5.1 1988 (Einzelprodukt) OS/2-Unterstützung
6.0 1991 (Einzelprodukt) 32bit- und OS/2-Unterstützung
6.1 1992 (Einzelprodukt) mit Programmer’s WorkBench
6.11 1993 (Einzelprodukt)
6.11d 19.09.1995 Windows 95 Driver Developer Kit 6.11d ist die letzte Version für DOS
6.12 27.08.1997 (Update) Unterstützung für Intel MMX-Instruktionen
6.13 05.12.1997 (Update) Unterstützung für AMD 3DNow!-Instruktionen
6.14 12.04.1999 (Update) ohne DOS-Extender
6.15 2000 Visual C++ 6.0 Processor Pack Unterstützung für SSE und SSE2
7.0 2002 Visual C++ .NET 2002
7.1 2003 Visual C++ .NET 2003
8.0 2005 Visual C++ 2005 ab 8.0 zwei getrennte Versionen: x86-32(ml.exe) und x86-64(ml64.exe), SSE3/SSSE3
9.0 2008 Visual C++ 2008 SSE4.1/SSE4.2/SSE4.A
10.0 2010 Visual C++ 2010 AVX/AES

Beispielprogramm 1

Dieses Programm zeigt eine Nachrichtenbox mit dem Text "Hello World":

.686
.model flat,stdcall
option casemap:none
 
   include windows.inc      ;
   include user32.inc       ;
   include kernel32.inc     ;
                            ;
   includelib user32.lib    ;
   includelib kernel32.lib  ;
 
StrA macro text:=<> ;macro
    IFNDEF some_cntr                                ;
        some_cntr = 0                               ;
    ELSE                                            ;
        some_cntr = some_cntr + 1                   ;
    ENDIF                                           ;
                                                    ;
    IFNB <text>                                     ;
        .data                                       ;
            @CatStr(_stra_,%some_cntr) db text,0    ;
        .code                                       ;
    %   EXITM <OFFSET @CatStr(_stra_,%some_cntr)>   ;
    ELSE                                            ;
        echo string required!                       ;
        EXITM <>                                    ;
    ENDIF                                           ;
endm
 
.code
start:
                                                                        ;code
    invoke MessageBox,NULL,StrA("Hello World"),StrA("Say hello"),MB_OK  ;
    invoke ExitProcess,NULL                                             ;
                                                                        ;
end start

Beispielprogramm 2

Dieses Beispielprogramm zeigt ein Fenster mit dem Text "Hello World!":

include masm32rt.inc ;
.data
    ClassName   db "WinClass",0
    AppName     db "Hello World App",0
    Text        db "Hello World!",0
.data?
    msg         MSG <>
    wc          WNDCLASSEX <>
.code
start:
    mov wc.hInstance,rv(GetModuleHandle,NULL)           ; fill WNDCLASSEX-struct
    mov wc.cbSize,SIZEOF WNDCLASSEX                     ;
    mov wc.style,CS_HREDRAW or CS_VREDRAW               ;
    mov wc.lpfnWndProc,OFFSET WndProc                   ;
    mov wc.hbrBackground,rv(CreateSolidBrush,0FFFFFFh)  ;
    mov wc.lpszClassName,OFFSET ClassName               ;
    mov wc.hIcon,rv(LoadIcon,NULL,IDI_APPLICATION)      ;
    mov wc.hIconSm,eax                                  ;
    mov wc.hCursor,rv(LoadCursor,NULL,IDC_ARROW)        ;
 
    invoke RegisterClassEx,OFFSET wc
    invoke CreateWindowEx,NULL\                       ; create window
                         ,OFFSET ClassName\           ;
                         ,OFFSET AppName\             ;
                         ,WS_OVERLAPPEDWINDOW\        ;
                         ,CW_USEDEFAULT,CW_USEDEFAULT\;
                         ,CW_USEDEFAULT,CW_USEDEFAULT\;
                         ,NULL\                       ;
                         ,NULL\                       ;
                         ,wc.hInstance\               ;
                         ,NULL                        ;
 
    push eax                                            ; tricky parameter passing ;)
    invoke ShowWindow,DWORD ptr [esp+4],SW_SHOWNORMAL   ;
    call UpdateWindow                                   ;
 
    .while TRUE                               ; message loop
        invoke GetMessage,OFFSET msg,NULL,0,0 ;
        .break .if (!eax)                     ;
        invoke TranslateMessage, OFFSET msg   ;
        invoke DispatchMessage, OFFSET msg    ;
    .endw                                     ;
 
    invoke ExitProcess,0                      ; exit Program
 
WndProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD ; window call-back function
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
    .if uMsg == WM_DESTROY
        invoke PostQuitMessage,NULL
    .elseif uMsg == WM_PAINT
        invoke BeginPaint,hWnd,ADDR ps                           ; paint text "Hello World!"
        invoke GetClientRect,hWnd,ADDR rect                      ;
        invoke DrawText,ps.hdc\                                  ;
                       ,OFFSET Text\                             ;
                       ,SIZEOF Text\                             ;
                       ,ADDR rect\                               ;
                       ,DT_CENTER or DT_VCENTER or DT_SINGLELINE ;
        invoke EndPaint,hWnd,ADDR ps                             ;
    .else
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .endif
    xor eax,eax
    ret
WndProc endp
end start

Beispielprogramm 3

Dieses Programm demonstriert einen Algorithmus zur Bestimmung von Zeichenkettenlängen unter Zuhilfenahme von SSE2-Instruktionen:

include masm32rt.inc ;
.686p ; choose instruction set
.mmx ;
.xmm ;
szLenXmm proto :DWORD
 
.data
    szTextA db "This string is 55 bytes long (without termination-zero)",0
.code
 
start:
    invoke szLenXmm,OFFSET szTextA                                 ; call szLenXmm
    invoke MessageBox,0,OFFSET szTextA\
                       ,cat$(chr$("string size = "),udword$(eax))\ ; generate title using macros
                       ,MB_OK
    invoke ExitProcess,0                                           ; exit program
 
    szLenXmm proc lpString:DWORD   ; determine string size
        mov edx,lpString           ; using XMM-instrutions
        pxor xmm1,xmm1             ;
        xor ecx,ecx                ; PS: under extremely rarely
        align 16                   ; conditions this func. may
    @@: movdqu xmm0,OWORD ptr [edx]; cause an access violation
        pcmpeqb xmm0,xmm1          ;
        pmovmskb eax,xmm0          ;
        test eax,eax               ;
        lea ecx,[ecx+16]           ;
        lea edx,[edx+16]           ;
        jz @B                      ;
    @@: lea ecx,[ecx-16]           ;
        bsf eax,eax                ;
        .if !ZERO?                 ;
            lea ecx,[eax+ecx]      ;
        .endif                     ; str. size returns
        mov eax,ecx                ; through EAX
        ret                        ; 
    szLenXmm endp                  ;
end start

Weblinks


Wikimedia Foundation.

Игры ⚽ Нужен реферат?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Microsoft Macro Assembler — Developer(s) Microsoft Stable release 10.0.30319.1 / April 12, 2010; 18 months ago (2010 04 12) Operating system Microsoft Windows and MS DOS …   Wikipedia

  • Microsoft Macro Assembler — (MASM, макроассемблер Microsoft)  ассемблер для процессоров семейства x86. Первоначально был произведён компанией Microsoft для написания программ в операционной системы MS DOS и был в течение некоторого времени самым популярным ассемблером …   Википедия

  • Microsoft Macro Assembler — Le logiciel Microsoft Macro Assembler (Macro Assembleur de Microsoft, plus connu sous l acronyme MASM) est un assembleur pour la famille de processeurs x86. Il fut à l origine développé par Microsoft pour le développement de leur système d… …   Wikipédia en Français

  • Microsoft Macro Assembler — El Microsoft Macro Assembler (MASM) es un ensamblador para la familia x86 de microprocesadores. Fue producido originalmente por Microsoft para el trabajo de desarrollo en su sistema operativo MS DOS, y fue durante cierto tiempo el ensamblador más …   Wikipedia Español

  • Microsoft Assembler — Der Microsoft Macro Assembler (abgekürzt MASM) ist ein von Microsoft entwickelter Assembler für x86 basierende Prozessoren. Er übersetzt Assemblerquelltext in ausführbaren, nativen Maschinencode. Der Microsoft Macro Assembler entwickelte sich… …   Deutsch Wikipedia

  • Macro — Para la fotografía, véase Macrofotografía. Para el museo, véase Museo de Arte Contemporáneo de Rosario. Una macro (del griego μακρο; significa «grande»), abreviatura de macroinstrucción, es una serie de instrucciones que se almacenan para que se… …   Wikipedia Español

  • Assembler-Code — Eine Assemblersprache ist eine spezielle Programmiersprache, welche die Maschinensprache einer spezifischen Prozessorarchitektur in einer für den Menschen lesbaren Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene… …   Deutsch Wikipedia

  • Assembler (Informatik) — Ein Assembler (nach DIN 44300: Assemblierer) ist ein Hilfsprogramm der Programmierung (Programmierwerkzeug), das ein in maschinennaher Assemblersprache geschriebenes Computerprogramm in Maschinensprache (auch Maschinencode oder Nativer Code… …   Deutsch Wikipedia

  • Cross-Assembler — Ein Assembler (nach DIN 44300: Assemblierer) ist ein Hilfsprogramm der Programmierung (Programmierwerkzeug), das ein in einer einfachen, maschinennahen Assemblersprache geschriebenes Programm in Maschinensprache (auch Maschinencode oder Nativer… …   Deutsch Wikipedia

  • Turbo Assembler — El Turbo Assembler (TASM), un paquete ensamblador principalmente destinado a la plataforma del IBM PC y sus compatibles. Fue la oferta de Borland en el mercado de herramientas de programación en lenguaje ensamblador para la familia de los… …   Wikipedia Español

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”