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 Code 👍

    Nicky



  • 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


Anmelden zum Antworten