Home

Die Messagebox MSGbox
in Visual BASIC 2010
und im MASM32-SDK

Tastatureingabe per Input-Befehl, etwas Fehlersuche
mit VKdebug sowie Ein- und Ausgabeumleitung

MASM32 - Infoseite

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

  • Die beim Assemblieren erzeugte Programmauflistung soll nicht unnötig aufgebläht werden. Deshalb wird die Listung der Makrkosammlung \masm32\include\masm32rt.inc durch .NOLIST unterdrückt. Die Listung wird mit .LIST wieder eingeschaltet.
  • .LISTMACROALL bewirkt, dass die Auflösung von Makros im Programmlisting enthalten ist.
  • Über die Notwendigkeit, die Prozedur main einzurichten, kann man geteilter Meinung sein. Sie soll die Lesbarkeit des Programmes verbessern. Bei kurzen Programmen ist so etwas m.E. häufig nicht erforderlich.
    Aufgerufen wird die Prozedur main durch die Programmschritte
    start:
        call main
        inkey
        exit
  • LOCAL bytecount :DWORD definiert eine nur innerhalb der betreffenden Prozedur gültige Doppelwortvariable mit dem Namen bytecount. Diese Variable wird nicht im Datenbereich gespeichert, sondern sie wird im Stack gespeichert und verwaltet:
    Syntax: LOCAL name [[count]][:type] [, name [[count]] [:type]]...
    Erzeugt eine oder mehrere Stack (automatische) Variable, auf die nur innerhalb der betreffenden Prozedur zugegriffen werden kann. „Automatisch ” meint, dass die Variable beim Betreten ihrer Prozedur angelegt wird und dass die Zugriffsmöglichkeit auf sie beim Verlassen ihrer Prozedur verloren geht. Ob dabei ihr verwendeter Speicherbereich auch gelöscht wird ist aus der mir bekannten Dokumentation nicht eindeutig ersichtlich.
    name ist der Variablenname.
    count gibt die Anzahl der nachfolgenden Elemente an. Diese Angabe ist wahlweise und muss in eckigen Klammern erfolgen.
    type bezieht sich auf den Variablennamen. Der Defaultwert ist in einem 32-bit Segment DWORD. In einem 16-bit-Segment ist der Defaultwert WORD.

    Auf die lokalen Variablen kann über ihren Namen zugegriffen werden. Der Assembler benutzt dafür ) die indirekte Adressierung mit dem BP-Register. Originaltext Microsoft: Once declared in a LOCAL statement, local variables can be referred to by name. The assembler translates references to these variables into references to their actual location on the stack using the BP indirect addressing mode.(Abruf 20.1.2019)
Letztes Upload: 11.02.2019 um 17:16:51