Deutsch
Assembler Forum

Bereichsvariable und einfache Bereiche

 

if 0

     {$cleq}

endif

declare bereich#, y&, z&
dim bereich#,16
print
print "Erster Test zum Umgang mit Bereichsvariablen# und einfachen Bereichen in XPIA"
print " (In diesem Teil geht es ausschließlich um long&-Werte mit 4 Byte = 32 bit)"
print
z& = 1234567899
y& = 1212
print "------ Profan-Teil ------"
print "An Position 0 von bereich# wird zugewiesen",z&
long bereich#,0 = z&
print "An Position 4 von bereich# wird zugewiesen",y&
long bereich#,4 = y&
print "Probe: An Position 0 des Bereiches steht tatsächlich", @long(bereich#,0)
print "       An Position 4 des Bereiches steht tatsächlich", @long(bereich#,4)
print
print "Die Variable ´bereich#´ zeigt den Wert",bereich#
set("decimals",0)
print "Die Funktion Addr( bereich# ) liefert ebenfalls", Addr( bereich# )
print "Addr( bereich# ) liefert also den Inhalt des Zeigers ´bereich#´"
print "Aber worauf zeigt er?"
print
print "---- Assemblerteil ----"

AsmStart Alig1( bereich# )

    MOV EAX, para1

AsmEnd (z&)

Print "Der Inhalt von ´bereich#´, wird mit MOV EAX eingelesen als", z&

AsmStart Alig3( bereich# )

    MOV EBX,para1
    LEA EAX, [EBX]

AsmEnd (z&)

Print "Test: Para1 zeigt auf Speicherstelle", z&

AsmStart Alig2( bereich# )

    LEA EAX, para1

AsmEnd (z&)

Print "An Speicherstelle ´bereich#´ steht ein 32bit-Zeiger, der auf", z&,"zeigt."
print "----------------------"
print "Der 16-byte-alignment-Versatz des Bereichsbeginns ist ", z& mod 16
print "Ergebnis NULL ist SEHR wichtig für schnelle SSE/SIMD-Algorithmen!"
print "----------------------"

AsmStart Alig4( bereich# )

    LEA EBX, para1
    LEA EAX, [EBX]

AsmEnd (z&)

Print "Probe: para1 verweist indirekt auf", z&

AsmStart Alig5( bereich# )

    MOV EBX, para1
    MOV EAX, [EBX]

AsmEnd (z&)

Print "Und dort wiederum steht = ", z&

AsmStart Alig6( bereich# )

    MOV EBX, para1
    MOV EAX, [EBX + 4]

AsmEnd (z&)

Print "Und 4 Byte weiter steht = ", z&
Print "----- Meine Schlussfolgerung -----"
print "´Der Inhalt von bereich#´ stellt also ein interner Zeiger dar, in dem "
print "der Beginn des reservierten Speicherbereiches vermerkt ist!"
print
print "Garantie gibts natürlich keine! Aber dafür herzliche Grüße von Specht ;-)"
WaitInput
dispose bereich#
End

Edit von Jörg: Das mit den Code-Tags scheint echt schwer zu sein! 
Stimmt, woher sollen Anfänger auch wissen, daß das # was mit Code zu tun hat?
 
27.08.2008  
 



Hier noch eine Antwort, mit direkter Eingabe der Adresse zu Fuss
Kann sich ändern, wenn zwischenzeitlich was neues declariert bzw neu gestartet wird.
Also Programm starten , Adresse merken ,sofort einsetzen,nochmal starten und die Lösung ist da.
Der Offset wir zur direkten Adresse zugerechnet.
Funktioniert als Poke und Peek, wie bei üblichen Basicprogrammen.
Also : bereich# beinhaltet die direkte Speicheradresse in der geschrieben werden kann.
Die Adresse wird soweit reserviert so gross wie vorher das DIM war.
Ein einfaches und schnelles Verfahren.

mfg
peter
declare bereich#
declare adresse%
dim bereich#,16
byte bereich#,0 = 7
byte bereich#,1 = 8
print Addr( bereich# )
print byte(Addr( bereich# ),0)
print byte(Addr( bereich# ),1)
print byte(177857072,0)
print byte(177857072+1,0)
waitkey
 
28.08.2008  
 



@Peter: Kompileranweisungen des XPSE musst Du nicht in eine Blockanweisung ablegen - diese wird XProfan sowieso nicht erreichen wenn XPSE vorgeschaltet ist.

Wenn Du dennoch die Anweisung beibehalten möchtest, ohne XPSE zu nutzen, dann gibt es hierfür einen undokumentierten Trick: Das Ausklammern von XPSE-Kompileranweisungen kann man z.B. mit dem Remtyp und dem Remtyp //, verwendest Du jedoch zweimal das Zeichen , also , dann wird der Schalter von XProfan (natürlich) dank Rem übersehen - aber XPSE krallt sich den Schalter trotzdem. Die Ausnahme gilt aber nur für 2 x vor der Anweisung.
 
28.08.2008  
 




Jörg
Sellmeyer
Wenn Du einen Speicherbereich benötigst, der sich zur Laufzeit nicht ändert (außer durch Dein Programm), brauchst Du ihn einfach nur am Anfang des Programms deklarieren und noch gewünschter Größe dimensionieren. Der Bereich wird solange reserviert, bis er mit Dispose Var# wieder freigegeben wird. Früher waren nur solche nicht-dynamische Bereichsvariablen möglich.
Ob die dann in Windows tatsächlich an physikalisch aufeinanderfolgenden Adressen beschrieben werden, wage ich zu bezweifeln. Das dürfte vom Defragmentierungszustand des Rams abhängen.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
28.08.2008  
 




Jörg
Sellmeyer
iF
@Peter: Kompileranweisungen des XPSE musst Du nicht in eine Blockanweisung ablegen - diese wird XProfan sowieso nicht erreichen wenn XPSE vorgeschaltet ist.

Wenn Du dennoch die Anweisung beibehalten möchtest, ohne XPSE zu nutzen, dann gibt es hierfür einen undokumentierten Trick: Das Ausklammern von XPSE-Kompileranweisungen kann man z.B. mit dem Remtyp und dem Remtyp //, verwendest Du jedoch zweimal das Zeichen , also , dann wird der Schalter von XProfan (natürlich) dank Rem übersehen - aber XPSE krallt sich den Schalter trotzdem. Die Ausnahme gilt aber nur für 2 x vor der Anweisung.


Das hast Du nicht dokumentiert? Das ist das beste Feature überhaupt an XPSE! Schön, das auch mal zu erfahren.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
28.08.2008  
 




Ob die dann in Windows tatsächlich an physikalisch aufeinanderfolgenden Adressen beschrieben werden, wage ich zu bezweifeln.


Da bin ich mir sicher. Sonst könnten wir uns ja die mühe sparen , solch kurze Befehle auszudenken.
Weil beim starten eines Programmes (hier Profan) dieser Raum nur noch für das eine Programm Profan vorhanden ist. Wenn du ein 2. Profan startest und probehalber die gleiche Adresszahl eingibst, wirst du nicht auf den Speicher zugreifen können von Profan beim 1. Start, obwohl beim 2. Programm die Adresse auch vorhanden ist, du bekommst einen anderen Wert.
Wenn dein Ram an der Stelle defekt ist wist du die Zahl nicht mehr finden.

Wenn man die Programm.exe von Profan natürlich hergestellt, mit einem Disassembler bearbeitet, wirst du es feststellen.

mf
peter
 
28.08.2008  
 




Jörg
Sellmeyer
Defekter Ram sollte dabei eine untergeordnete Rolle spielen. Angenommen Dein Ram sieht so aus:
Daten|Daten|Daten|Daten|Daten| |Daten| |Daten|Daten| |Daten| | | | | | | | |

Und Du startest Dein Programm, dann glaube ich nicht, daß der Speicher hiterher so aussieht:
Daten|Daten|Daten|Daten|Daten| |Daten| |Daten|Daten| |Daten|Profan|Profan|Profan|Profan|Profan| | | |

Sondern so:
Daten|Daten|Daten|Daten|Daten|Profan|Daten|Profan|Daten|Daten|Profan|Daten|Profan|Profan| | | | | | |
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
28.08.2008  
 



Jörg Sellmeyer
Ob die dann in Windows tatsächlich an physikalisch aufeinanderfolgenden Adressen beschrieben werden, wage ich zu bezweifeln. Das dürfte vom Defragmentierungszustand des Rams abhängen.


Die physikalische Adresse erhält man eh nie, nur eine Zuordnungsadresse (welche oft fälschlich als phy Addr verkannt wird) und diese ändert sich - (aber) je nach Reservierungsmethode - normalerweise bis zu eine möglichen Redimensionierung nicht.

Ge DIM ter Speicher behält also seine Adresse bis er wieder mit Dim redimensioniert wird oder gar freigegeben.
 
28.08.2008  
 



Peter Bierbachh
Weil beim starten eines Programmes (hier Profan) dieser Raum nur noch für das eine Programm Profan vorhanden ist.


Das ist aus einem anderen Grund falsch. Jeder Prozess hat so wie so seinen eigenen Adressbereich - reden wir hier aber mal nur von NT. (und nicht von älteren Windowsversionen wie z.B. 98 wo das Speichergeschehen noch nicht so organisiert (sicher) war.)

Du kannst natürlich auch Speicher reservieren welcher für alle Prozesse verfügbar ist - halt eine Frage der Art der Reservierung.

Dim reserviert unbeweglichen Speicher der für gewöhnlich nur im erzeugenden Prozess verfügbar ist, und natürlich auf übergeordneten Leveln z.B. wenn das eigene Programm den UserMode verlässt. (wie z.B. Treiber)
 
28.08.2008  
 



@Peter: Hast Du Dir noch einen zweiten Account zugelegt? (mit 2 h am Ende des Nachnamen?)
 
28.08.2008  
 



Es gibt nur der mit dem 2h. Das eine h kriege ich nicht weg.
Wollte ich schon überberschreiben, dann kam ich nicht mehr dran.

mfg
 
28.08.2008  
 



Wer was im Computer macht, ist mir eigentlich wurscht.

Mit dem Speichergedöns sollen sich die selbsternannten Fachleute rumschlagen. ist nicht meine Welt.
Und wenn Windows den Speicher von Aldi holt, Hauptsache det Programm läuft.

mfg
peter
 
28.08.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

16.841 Betrachtungen

Unbenanntvor 0 min.
funkheld22.05.2016
Georg Teles09.01.2016
H.Brill16.11.2013
moefy04.09.2013
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie