MASM32-SDK (Windows Konsolapplikationen):
fn und rv unterstützen invoke

Beim Beispiel auf der vorhergehenden Webseite wurde invoke zum Aufruf der Messagebox verwendet. Es geht jedoch auch anders. Aus der Dokumentation zum MASM32-SDK geht hervor, dass es zwei Macros zur Unterstützung von invoke gibt. Erklärt wird dies an einem Beispiel mit Messagebox:
Die Codierungsfolge
push MB_OK
push offset TitleTxt
push offset Message
push hWnd
call MessageBox
lässt sich mit invoke kürzer schreiben:
invoke MessageBox,hWnd,ADDR Message,ADDR TitleTxt,MB_OK
Statt mit invoke kann man die Funktion mittels des Macros fn aufrufen. fn erlaubt es, auch Direktwerte für die Texte zu übergeben:
fn MessageBox,hWnd,"Hi, I am a Message Box","Greetings",MB_OK

Die aufgerufene Funktion (MessageBox) endet mit einem Rückgabewert im Register EAX. Wenn man den Funktionsaufruf jedoch mittels des fast funktionsgleichen MACROS rv aufruft, kann man den Funktionsaufruf so behandeln wie das Register EAX. Gezeigt wird es an einem Beispiel mit mov und an einem Beispiel mit cmp :

mov retval, rv(MessageBox,hWnd,ADDR Message,ADDR TitleTxt,MB_OK)

cmp rv(MessageBox,hWnd,ADDR Message,ADDR TitleTxt,MB_OK), IDYES
je label

Die beiden Macros fn und rv sind in der beim MASM32-SDK mitgelieferten Datei masm32/macros/macros.asm definiert.



Programm zur Anzeige der Länge einer Datei
Eine kurze Interpretation zu diesem Programm steht unterhalb des Quellprogrammtextes.
.NOLIST
    include \masm32\include\masm32rt.inc

comment * -----------------------
    Modifiziert aus masm32\examples\exampl06\filesize\fs.asm
    Programm zeigt die Länge der in fname spezifizierten Datei an
------------------------------- *
.LIST
    .data
    fname db "\masm32\include\windows.inc",0

    .code
start:
    call main
    inkey
    exit

main proc
.LISTMACROALL
    LOCAL bytecount :DWORD

    .if rv(exist,ADDR fname) == TRUE                ; test if file exists
        mov     bytecount, rv(filesize,ADDR fname)  ; use "filesize" procedure
        print   "Size of "
        print   offset fname, " = "
        print   str$(bytecount)," bytes",13,10      ; display the results
    .else
        print   "Sorry, can't find that file",13,10 ; otherwise show error
    .endif
    ret

main endp

end start
Ablaufbeispiel:
0:05:23:24 C:\masm32\examples\exampl06\filesize>fs
Size of \masm32\include\windows.inc = 977412 bytes
Press any key to continue ...

Interpretation des Programmes

Letztes Upload: 24.03.2023 um 11:35:11 • Impressum und Datenschutzerklärung