Frage zu globalen und lokalen Variablen
-
Hallo zusammen,
wie der ein oder andere bemerkt hat schreibe ich zur Zeit etwas mehr
mit MASM32 unter Windows.Da die Programme somit auch immer größer werden habe ich noch eine Frage
bezüglich der lokalen/globalen Variablen.Im Moment habe ich im Datenbereich fast alles liegen von Strukturen
über Strings bis zu den Handles der Fenster und Steuerelemente.In manchen Prozeduren nutze ich lokale Variablen
speicher_loeschen proc hram:DWORD LOCAL handle_hram:DWORD invoke GlobalHandle, hram ;Handle des Speichers ermitteln mov handle_hram, eax ;Handle nach EAX invoke GlobalUnlock, handle_hram ;hmem freigeben invoke GlobalFree, handle_hram ;hmem Speicher zurückgeben Ret speicher_loeschen EndP
Die Variable in Zeile 2 (handle_hram) ist eine lokale die ja auf dem Stack
gehalten wird und beim Verlassen der Prozedur nicht mehr verfügbar ist (oder?)Nun habe ich mir gedacht, alle Variablen die in einer Prozedur verarbeitet werden
auch dort unterzubringen wie hier z.B.testproc proc jmp beg_testproc var1 dd 100d var2 dd 22d string11 db "Suppenhühner haben es nicht leicht...",0 beg_testproc: mov eax, cs:var1 mov ebx, cs:var2 mul ebx call PRINT invoke MessageBox, NULL, eax, addr szCaption, MB_OK mov eax, offset cs:string11 invoke MessageBox, NULL, eax, addr szCaption, MB_OK Ret testproc EndP
Der für mich ersichtliche Vorteil läge darin, das ich alle Prozeduren "mitnehmen"
kann in andere Programme ohne mir Gedanken machen zu müssen, eine Variable
zu vergessen. Ein Zugriff auf alle Variablen habe ich ja immer.Auch wenn ein Programm dadurch etwas langsamer wird (Segmentpräfix setzen)
macht es Sinn oder eher nicht? Ich möchte nur gern den Überblich behalten
bei mittlerweile 4500 Zeilen CodeNicky
-
hallo,
Code und Daten zu mischen ist im allgemeinen Schlecht, da die Daten im Code Cache landen, wo sie nichts zu suchen haben.
Die Segment-Präfixe (CS) brauchst du nicht, da Code- und Datensegment die gleich Basis haben (Flat Memory model).
Ansonsten gilt, wie auch in den Hochsprachen: globale Variablen nur wenn unbedingt nötig (nicht verwechseln mit Konstanten).
Lokale variablen haben den Vorteil, da auf den Stack, als immer gecached angenommen werden zu können. Dies machte den Nachteil der eventuellen nötigen Initialisierung wieder weg.Wenn es um das einfache wiederverwenden geht:
testproc proc .data var1 dd 100t var2 dd 22t string11 db "Suppenhühner haben es nicht leicht...",0 .code mov eax, var1 mov ebx, var2 mul ebx call PRINT invoke MessageBox, NULL, eax, addr szCaption, MB_OK mov eax, offset cs:string11 invoke MessageBox, NULL, eax, addr szCaption, MB_OK Ret testproc EndP
-
masm schrieb:
hallo,
Wenn es um das einfache wiederverwenden geht:
testproc proc .data var1 dd 100t var2 dd 22t string11 db "Suppenhühner haben es nicht leicht...",0 .code mov eax, var1 mov ebx, var2 mul ebx call PRINT invoke MessageBox, NULL, eax, addr szCaption, MB_OK mov eax, offset cs:string11 invoke MessageBox, NULL, eax, addr szCaption, MB_OK Ret testproc EndP
Hallo masm,
das habe ich gesucht...
Danke
Nicky