Diese Webseite behandelt die Assemblerdirektiven PROC, ENDP, PROT und INVOKE. In diesem Zusammenhang wird auf Anwendungsschnittstellen (APIs Application Programming Interfaces, API in der Einzahl) und die beiden Assemblierungsdurchläufe (Pass 1 und Pass 2) kurz eingegangen.
Zur Definition von Prozeduren und bei Funktionen steuert das im MASM32-SDK genutzte Assemblierprogramm ML das Direktivenpaar PROC und ENDP bei. PROC, ENDP, PROT und INVOKE haben allesamt etwas mit Unterprogrammaufrufen zu tun.
Glaubt man der üblichen Assemblerliteratur, so muss ein Assemblerunterprogramm mit PROC eingeleitet werden und sein Schluss ist mit ENDP zu kennzeichnen. Was dabei verschwiegen wird: Man muss das Pärchen PROC und ENDP nur dann verwenden, wenn es erforderlich ist. Unterprogramme lassen sich auch ohne dies beiden Assemblerdirektiven schreiben. Ich habe mir deshalb angewöhnt, PROC und ENDP nur dann zu schreiben, wenn es erforderlich ist. Beispielsweise kann man die Befehlssequenzen
main proc cls print "Hello World",13,10 ret main endpdes Progrämmchens aus einer der vorhergehenden Webseiten platzsparend so schreiben:
main: cls print "Hello World",13,10 ret
Eine Verschachtelung von anonymen Sprungmarken ist nicht möglich. Beispiel:
XOR EAX, EAX MOV ECX, 10 @@: CMP EAX, 5 JE @F INC EAX LOOP @B JMP Weiter @@: MOV EAX,20
Beim Aufruf einer API sind keine, ein oder mehrere Parameter anzugeben. Welches es sind, steht für rund 1500 APIs in der Datei Win32.hlp (Win32 Programmers Manual). Eine Bezugsquelle ist auf der Webseite MASM32-SDK: Wo finde ich Informationen? angegeben.
Grundsätzlich lassen sich die APIs mit dem normalen Assemblerbefehl CALL wie Unterprogramme aufrufen. Es wird angeraten, statt dessen die Direktive INVOKE zu nutzen. INVOKE arbeitet mit der Direktive PROTO (wie Prototyp) zusammen. Das bei PROTO für diese API hinterlegte Muster ermöglicht bei Verwendung von INVOKE eine formale Prüfung der Syntax des programmierten API-Aufrufs. Beispiel:
INVOKE FunctionName, par1, ADDR par2, par3, ADDR par4 mov retval, eax ;Rückgabewert von FunctionNamewürde traditionell programmiert werden als:
push offset par4 push par3 push offset par2 push par1 call FunctionName mov retval, eax ;Rückgabewert von FunctionNameAllerdings würde bei der traditionellen Programmierung die Aufrufparameter nicht bereits zur Assemblierungszeit auf Typ und Anzahl überprüft werden.
Damit die Überprüfung erfolgen kann, sind mit PROTO für bekannte APIs die Muster angelegt. Beispiele dazu stehen in der Datei \masm32\include\kernel32.inc. Diese Datei wird in das Assemblerquellprogramm mit INCLUDE eingelesen und erweitert es somit.
Unter MASM32-SDK sehen die INVOKE-Aufrufe ungewohnt aus, z.B. so:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OKDie Bedeutung der nicht im dem Quellprogramm ersichtlichen Symbole enthüllt zumeist die Datei \masm32\include\windows.inc:
TRUE equ 1 FALSE equ 0 NULL equ 0 MB_OK equ 0
In der Version 11 des MASM32-SDK enthält die Datei \masm32\include\windows.inc über 26000 Zeilen!
Beim ersten Durchgang
Sofern beim ersten Durchgang mindestens ein Fehler entdeckt wurde, wird der Umstand gemeldet und der Assembliervorgang abgebrochen.
Beim zweiten Durchgang