07-17-2023, 09:39 PM
Here a new Code Example:
variable wert2_I on line 62 is a test value for a example in the text (line 8 - 46)
variable wert2_I on line 62 is a test value for a example in the text (line 8 - 46)
Code: (Select All)
'SagraS, Beispiel fuer die Nutzung von _MEM - 16. Juli 2023
' 32Bit / 64Bit Speicher (Der von Windows)
' Reine 32/64 Bit Adressierung
' 32/64 Bit Pointer
' Funktioniert fuer Werte mit bis zu 64Bit (Integer64)
'*****************************************
' Das hier ist der Datentyp den _MEM erzeugt
' IMAGE und SOUND wird erst mit dem jeweiligen _MEMIMAGE oder _MEMSOUND Befehl
' aufgerufen. So wuerde sich der Datentyp sogar vergroessern
' Also hast du die ersten 4 Datentypen des Typs memory_type fuer _MEM
'
' TYPE memory_type
' OFFSET AS _OFFSET 'start location of block(changes with byte position)
' SIZE AS _OFFSET 'size of block remaining at offset(changes with position)
' TYPE AS _OFFSET 'type description of variable used(never changes)
' ELEMENTSIZE AS _OFFSET 'byte size of values inside the block(never changes)
' -----------------------
' IMAGE AS LONG 'the image handle used when _MEMIMAGE(handle) is used
' SOUND AS LONG 'the sound handle used when _MEMSOUND(handle) is used
' END TYPE
'
' Jede Position im Speicher egal um welchen Datentyp es sich handelt betraegt
' 8 Bytes, da die Funktion von _MEM fuer 64Bit ausgelegt ist.
' Du kannst dich auch nur innerhalb des jeweiligen Speicher Segmentes bewegen
' In diesem Falle die 8 Bytes
' Bedeutet:
' Um Fehler vorzubeugen, weil du einen Wert mit Integer reingeschrieben hast,
' kannst du diesen Wert an selber Adresse mit einem Integer64 Datentyp auslesen
' lassen, ohne den Wert darin zu gefaehrden.
'
' Darum ist _MEM auch sehr sicher und man kann nix ausserhalb seines Programmes
' kaputt machen. z.B. Windows eigene Speicher Adressen, so das dein Rechner z.B.
' einfach runter faehrt.
'
' Gibst du eine INTEGER64 Variable in den Speicher mit _MEM, so kannst
' du die ersten 4, 2 oder 1 Byte mit long, integer oder einem Byte Datentyp
' von dieser Zahl auslesen
' z.B. &FEDC BA98 7654 3210 <- Integer64
' Jetzt kannst du mit _MEMGET einen LONG Wert daraus auslesen
' und die Offset Position darin verschieben.
' z.B. willst du BA98 7654 auslesen
' Dann geht das so:
' wert2_O = _MEMGET(SEGBlock2, SEGBlock2.OFFSET + 2, LONG)
OPTION _EXPLICIT
DIM SEGBlock1 AS _MEM
DIM SEGBlock2 AS _MEM
DIM AS _UNSIGNED _INTEGER64 wert1_I, wert2_I
DIM AS _UNSIGNED LONG wert1_O, wert2_O
DIM AS _OFFSET position1, position2
PRINT
INPUT "Zahl eingeben : ", wert1_I
PRINT
INPUT "Noch eine Zahl: ", wert2_I
' Test Wert fuer wert2
wert2_I = &HFEDCBA9876543210
' Speicherblock der Variable ermitteln
SEGBlock1 = _MEM(wert1_I)
SEGBlock2 = _MEM(wert2_I)
'Entspricht der Startadresse
' *** Dies ist unnoetig fuer _MEM ***
position1 = _OFFSET(wert1_I)
position2 = _OFFSET(wert2_I)
' Aendern des Wertes im Speicher um +5
' *** Mit _MEMPUT kannst du an einer Offsetadresse ein Wert eintragen ***
' Um den Wert zu aendern der bereits drin steht, holt man ihn mit _MEMGET raus und manupuliert ihn
'_MEMPUT SEGBlock1, SEGBlock1.OFFSET, _MEMGET(SEGBlock1, SEGBlock1.OFFSET, _OFFSET) + 5 AS _OFFSET
' Wert aus dem Speicher holen
wert1_O = _MEMGET(SEGBlock1, SEGBlock1.OFFSET, LONG)
wert2_O = _MEMGET(SEGBlock2, SEGBlock2.OFFSET + 2, LONG) ' <- 3-6 Byte auslesen
PRINT LEN(SEGBlock1)
PRINT
PRINT "Position 1te Zahl im Speicher : &H" + HEX$(position1)
PRINT "Position 2te Zahl im Speicher : &H" + HEX$(position2)
PRINT
PRINT "Position 1te Zahl im Speicher : &H" + HEX$(SEGBlock1.OFFSET)
PRINT "Groesse des Blocks(Byte) : &H" + HEX$(SEGBlock1.SIZE)
PRINT "Type des Blocks(Nummer) : &H" + HEX$(SEGBlock1.TYPE)
PRINT "Datentyp des Blocks(Nach Dim) : &H" + HEX$(SEGBlock1.ELEMENTSIZE)
PRINT "Inhalt der Speicheradresse : " + STR$(wert1_O) + " HEX( " + HEX$(wert1_O) + " )"
PRINT
PRINT "Position 2te Zahl im Speicher : &H" + HEX$(SEGBlock2.OFFSET)
PRINT "Groesse des Blocks(Byte) : &H" + HEX$(SEGBlock2.SIZE)
PRINT "Type des Blocks(Nummer) : &H" + HEX$(SEGBlock2.TYPE)
PRINT "Datentyp des Blocks(Nach Dim) : &H" + HEX$(SEGBlock2.ELEMENTSIZE)
PRINT "Inhalt der Speicheradresse : " + STR$(wert2_O) + " HEX( " + HEX$(wert2_O) + " )"
PRINT
'Startadresse bleibt gleich, es wird ja nur der Inhalt geaendert
PRINT "Startadresse neuer Inhalt : "; SEGBlock1.OFFSET
' Speicherblock freigeben
_MEMFREE SEGBlock1
_MEMFREE SEGBlock2
END