Microsoft Macro Assembler
Der Microsoft Macro Assembler (abgekürzt MASM) ist ein von Microsoft entwickelter Assembler für x86-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 von Microsoft stammenden Betriebssysteme. Er ist in aktuellen Versionen in der integrierten Entwicklungsumgebung (IDE) Microsoft Visual Studio enthalten. Früher wurde er als eigenständiges Softwarepaket vertrieben. Die kostenlosen Versionen von MASM (aus Visual Studio Community; früher Express) dürfen nicht für kommerzielle Zwecke verwendet werden. Zudem darf man sie nur zur Entwicklung von Software 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.[1] Als kostenlose und freie Alternativen sind beispielsweise die beiden MASM kompatiblen Programme JWasm und UASM verfügbar.[2] [3] Außerdem gibt es noch den Netwide Assembler und Flat assembler mit eigner Syntax.
In der aktuellen Version 14.0 werden folgende Befehlssätze unterstützt: x86-Architektur, x87-fpu, MMX, 3DNow, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4.A, VMX, AVX, AVX2, AES-NI, CVT16, FMA3 und FMA4. Ab 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.
Durch Microsofts Freigabe und Veröffentlichung des Quellcodes von MS-DOS 4.0 am 25. April 2024 ist MASM 5.10 mitsamt dem Microsoft-C-Compiler (Version 5.10), dessen Linker LINK.EXE
(Version 3.65) und Build-Management-Tool NMAKE.EXE
(Version 1.00.05), sowie der dazugehörigen C-Bibliothek als Binärcode öffentlich auf GitHub verfügbar.[4] [5]
Ausdrücke ähnlich den Hochsprachen
[Bearbeiten | Quelltext bearbeiten ]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
[Bearbeiten | Quelltext bearbeiten ]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 die Switch-Anweisung (mehrfache Verzweigung) zu generieren.
Versionen
[Bearbeiten | Quelltext bearbeiten ]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 |
---|---|---|---|
1.0 | 1981 | (IBM) | für 8086 |
2.0 | 1984 | (Einzelprodukt) | für 8086/8087 |
3.0 | 1984 | (Einzelprodukt) | |
4.0 | 1985 | (Einzelprodukt) | |
5.0 | 1987 | (Einzelprodukt) | |
5.1 | 1988 | (Einzelprodukt) | OS/2-Unterstützung |
6.0 | 1991 | (Einzelprodukt) | 32-Bit- und OS/2-Unterstützung, mit der integrierten Entwicklungsumgebung Programmer’s WorkBench |
6.1 | 1992 | (Einzelprodukt) | |
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; ohne DOS-Extender |
6.13 | 05.12.1997 | (Update) | Unterstützung für AMD 3DNow-Instruktionen |
6.14 | 12.04.1999 | (Update) | Unterstützung für SSE |
6.15 | 2000 | Visual C++ 6.0 Processor Pack | Unterstützung für 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 |
11.0 | 2011 | Visual C++ 2011 | AVX2/FMA/half-precision conversion |
12.0 | 2013 | Visual C++ 2013 | |
14.0 | 2019 | Visual Studio 2019 |
Beispielprogramme
[Bearbeiten | Quelltext bearbeiten ]Beispiel 1
[Bearbeiten | Quelltext bearbeiten ]Dieses Hallo-Welt-Programm zeigt ein Dialogfenster mit dem Text "Hello World" an:
.686 .modelflat,stdcall optioncasemap:none includewindows.inc; MASM32 SDK includeuser32.inc; includekernel32.inc; ; includelibuser32.lib; includelibkernel32.lib; StrAmacrotext:=<>;macro IFNDEFsome_cntr; some_cntr=0; ELSE; some_cntr=some_cntr+1; ENDIF; ; IFNB<text>; .data; @CatStr(_stra_,%some_cntr)dbtext,0; .code; %EXITM<OFFSET@CatStr(_stra_,%some_cntr)>; ELSE; echostringrequired!; EXITM<>; ENDIF; endm .code start: ;code invokeMessageBox,NULL,StrA("HelloWorld"),StrA("Sayhello"),MB_OK; invokeExitProcess,NULL; ; endstart
Beispiel 2
[Bearbeiten | Quelltext bearbeiten ]Dieses Beispielprogramm zeigt ein Fenster mit dem Text "Hello World!":
includemasm32rt.inc; MASM32 SDK .data ClassNamedb"WinClass",0 AppNamedb"HelloWorldApp",0 Textdb"HelloWorld!",0 .data? msgMSG<> wcWNDCLASSEX<> .code start: movwc.hInstance,rv(GetModuleHandle,NULL); fill WNDCLASSEX-struct movwc.cbSize,SIZEOFWNDCLASSEX; movwc.style,CS_HREDRAWorCS_VREDRAW; movwc.lpfnWndProc,OFFSETWndProc; movwc.hbrBackground,rv(CreateSolidBrush,0FFFFFFh); movwc.lpszClassName,OFFSETClassName; movwc.hIcon,rv(LoadIcon,NULL,IDI_APPLICATION); movwc.hIconSm,eax; movwc.hCursor,rv(LoadCursor,NULL,IDC_ARROW); invokeRegisterClassEx,OFFSETwc invokeCreateWindowEx,NULL\; create window ,OFFSETClassName\; ,OFFSETAppName\; ,WS_OVERLAPPEDWINDOW\; ,CW_USEDEFAULT,CW_USEDEFAULT\; ,CW_USEDEFAULT,CW_USEDEFAULT\; ,NULL\; ,NULL\; ,wc.hInstance\; ,NULL; pusheax; tricky parameter passing ;) invokeShowWindow,DWORDptr[esp+4],SW_SHOWNORMAL; callUpdateWindow; .whileTRUE; message loop invokeGetMessage,OFFSETmsg,NULL,0,0; .break.if(!eax); invokeTranslateMessage,OFFSETmsg; invokeDispatchMessage,OFFSETmsg; .endw; invokeExitProcess,0; exit Program WndProcprochWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD; window call-back function LOCALps:PAINTSTRUCT LOCALrect:RECT .ifuMsg==WM_DESTROY invokePostQuitMessage,NULL .elseifuMsg==WM_PAINT invokeBeginPaint,hWnd,ADDRps; paint text "Hello World!" invokeGetClientRect,hWnd,ADDRrect; invokeDrawText,ps.hdc\; ,OFFSETText\; ,SIZEOFText\; ,ADDRrect\; ,DT_CENTERorDT_VCENTERorDT_SINGLELINE; invokeEndPaint,hWnd,ADDRps; .else invokeDefWindowProc,hWnd,uMsg,wParam,lParam ret .endif xoreax,eax ret WndProcendp endstart
Beispiel 3
[Bearbeiten | Quelltext bearbeiten ]Dieses Programm demonstriert einen Algorithmus zur Bestimmung von Zeichenkettenlängen unter Zuhilfenahme von SSE2-Instruktionen:
includemasm32rt.inc; MASM32 SDK .686p; choose instruction set .mmx; .xmm; szLenXmmproto:DWORD .data szTextAdb"Thisstringis55byteslong(withouttermination-zero)",0 .code start: invokeszLenXmm,OFFSETszTextA; call szLenXmm invokeMessageBox,0,OFFSETszTextA\ ,cat$(chr$("stringsize="),udword$(eax))\; generate title using macros ,MB_OK invokeExitProcess,0; exit program szLenXmmproclpString:DWORD; determine string size movedx,lpString; using XMM-instrutions pxorxmm1,xmm1; xorecx,ecx; PS: under extremely rarely align16; conditions this func. may @@:movdquxmm0,OWORDptr[edx]; cause an access violation pcmpeqbxmm0,xmm1; pmovmskbeax,xmm0; testeax,eax; leaecx,[ecx+16]; leaedx,[edx+16]; jz@B; @@:leaecx,[ecx-16]; bsfeax,eax; .if!ZERO?; leaecx,[eax+ecx]; .endif; str. size returns moveax,ecx; through EAX ret; szLenXmmendp; endstart
Weblinks
[Bearbeiten | Quelltext bearbeiten ]Einzelnachweise
[Bearbeiten | Quelltext bearbeiten ]- ↑ MASM 5.1 oder TASM 1.0 Die Qual der Wahl. In: DOS International. Band 89, Nr. 6. DMV, 1989, ISSN 0933-1557 , S. 50.
- ↑ JWasm. In: japheth.de. Abgerufen am 22. Mai 2012 (englisch).
- ↑ UASM. In: terraspace.co.uk. Abgerufen am 10. Juli 2022 (englisch).
- ↑ Scott Hanselman, Jeff Wilcox: Open sourcing MS-DOS 4.0. In: opensource.microsoft.com. Microsoft, 25. April 2024, abgerufen am 29. Mai 2024 (englisch).
- ↑ MS-DOS > v4.0 > src > TOOLS. In: github.com. Microsoft, 25. April 2024, abgerufen am 29. Mai 2024 (englisch, MASM Version 5.10 mitsamt dem Microsoft C Compiler sowie weiteren Tools aber ohne IDE aus der Quellcodeveröffentlichung von MS-DOS 4.0).