suche Erklärungen für Fachbegriffe

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Beitragvon Aldebaran » Samstag 9. August 2003, 13:14

hallo,

hab euch durch Zufall ergoogelt und möchte hier ab und zu ein paar Fragen stellen, fürs erste hab ich da einige Fachbegriffe, wo ich nicht immer recht weiß, was das eigentlich ist, bzw. wie ich mir das vorstellen soll:

Unterschied zwischen linearer und physikalischer Addresse?
was ist ein Vector? Selector? bzw. Unterschied
wie ist ein Deskriptor aufgebaut? (z.b. von der LDT-table)
anstelle von OFFSET kann man auch ADDR verwenden, in diesem Zusammenhang kommt auch Local Variable zur Sprache, was bedeutet dieses Local genau?

gruß Aldebaran
ja schewu, i ze duze dobre tak :)
Aldebaran
Newbie
 
Beiträge: 7
Registriert: Samstag 9. August 2003, 11:10

Beitragvon Marwin » Samstag 9. August 2003, 23:57

Helfen kann ich dir leider nur bei deiner letzten (und zugleich der leichtesten) Frage.

LOCAL wird innerhalb von Prozeduren verwendet um Speicherplatz für Variablen auf dem Stack (!) zu reservieren:

Code: Alles auswählen
vergleich PROC zeichenkette1 :DWORD, zeichenkette2 :DWORD
LOCAL interneVariable :WORD
.
vergleich ENDP


Auf diese Variablen kann nur innerhalb der Prozedur zugegriffen werden, in welcher sie erstellt worden sind (=] lokale Variablen). Dabei muss man aber beachten, dass der Inhalt der Variablen nach dem Beenden der Prozedur verloren geht (da sie ja eine Stack-Variable ist).


Zum Descriptor kann ich dir nur sagen, dass man ihn nur (?) im Protected Mode verwendet/verwenden kann. :(


Falls du die Begriffe irgendwo erklärt bekommst, und hier mal irgendwann wieder vorbeischaust, kannst du sie dann auch für mich kurz erläutern oder einen Link posten? Das wurmt mich nämlich, ich habe mir nach deinem Beitrag so einiges durchgelesen um dir zu Helfen, aber etwas (für mich) verwertbares habe ich nicht gefunden. So wird zum Beispiel in dieser FAQ (äußerst umfangreich!!) erklärt, wie man aus einer linearen Adresse eine physikalische errechnet. Aber wozu sie genau gebraucht werden, kein Ahnung. Nur soviel habe ich mitgenommen:
segmentierte Adresse (=logische) sieht z.B. folgendermaßen aus: 1234:5678h
eine physikalische Adresse so: 179b8h
es entfallen also die Doppelpunkte.
Bild Na klar! Unterschiedliche Segmentadressen können auf den gleichen Punkt im Speicher verweisen (z.B. FFFF:000Fh == F000:FFFFh). Es gibt wird aber nur genau eine physikalische Adresse geben, welche auf genau einen bestimmten Punkt im Speicher verweist. Ich denke, das wird der Unterschied sein.


Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon Aldebaran » Sonntag 10. August 2003, 11:11

hi

danke für deine Mühe, ich habe jetzt nochmal mein Assemblerbuch hervorgeholt und habe da noch einiges gefunden, zumindest Selector ist mir klar, bei Deskriptor muss ich wohl einen unter Debugger sehen, damit ich weiss wie der auf Byteebene aussieht.

hier ein Auszug aus diesem Buch:

Im protected Mode wird der Arbeitsspeicher über Tabellen verwaltet, die GDT (Global Descriptor Table) und die LDT (Local Descriptor Table). Die GDT ist nur einmal im System vorhanden, während die LDT für jeden separaten Prozess existiert.In der LDT werden die Adressen der einzelnen Segmente gespeichert. Die Segmentregister enthalten im Protected Mode nicht mehr die direkte Basisaddresse, sondern einen Verweis auf den betreffenden Eintrag in der LDT.

Ein solcher Verweis nennt sich SELECTOR; CS,DS,SS sind somit im Protected Mode Selectorregister.

Die Einträge der GDT bzw. LDT heißen Deskriptoren. Ein Deskriptor setzt sich aus einer Basisaddresse, der Segmentgrösse und aus Flags zusammen. Die Flags regeln den Speicherzugriff. (...weiss aber immer noch nicht, wie so ein Deskriptor effektiv unter Debugger aussieht)

okay, weiter, jetzt wirds chaotisch (für mich):
Beim Start richtet deas System die GDT ein, deren Adresse im GDT-Register des Prozessors gespeichert wird. Die GDT enthält unter anderm Deskriptoren, die die Adressen der LDTs der einzelnen Tasks enthalten.
Die Selektorregister wiederum enthalten im wesentlichen die Indizes (was istn dass schon wieder für ein Wort?? :/ ) der betreffenden Deskriptoren in der LDT der aktuellen Taskg, die erst die Adresse des Segments enthalten. Der Index dieser aktuellen LDT in der GDT findet sich jeweils im LDT-Register des Prozessors.

Findet nun ein Task-Switch statt, also ein Umschalten zu einer anderen Anwendung, müssen nicht unbedingt die Selctor Register angepasst werden, da sie ja nur Indizes in die LDT darstellen. Die Adresse der LDT selbst wird jedoch über den Deskriptor in der GDT ermittelt, dessen Index im LDT-Register steht.

Bei einem Taskswitch beziehen sich schlicht die Einträge in den Segmentregistern auf einen anderen Deskriptor in der GDT, also eine andere LDT.

----------------------
Gruss Aldebaran
ja schewu, i ze duze dobre tak :)
Aldebaran
Newbie
 
Beiträge: 7
Registriert: Samstag 9. August 2003, 11:10

Beitragvon Marwin » Sonntag 10. August 2003, 14:12

Hallo,

erstmal danke für den Text-Ausschnitt.

Ein Indiz/Index kennzeichnet ein Element eines Arrays/Datenfeldes.
Ein Beispiel (leicht zu erkennen, JavaScript):
Code: Alles auswählen
<script type="text/javascript">
<!--
Werte = new Array(4064, 234, 2334);
var x = Werte[2];  // hier ist das Indiz 2
//-->
</script>


Das untenstehende Bild verdeutlicht, wie ein Segementbeschreiber aufgebaut ist.

Der dazugehörige Buchausschnitt:
[!--QuoteBegin--Data Beckers PC Intern+--][/span][table border=0 align=center width=95% cellpadding=3 cellspacing=1][tr][td]QUOTE (Data Beckers PC Intern)[/td][/tr][tr][td id=QUOTE][!--QuoteEBegin--]Sie sehen, daß ein Segmentbeschreiber jeweils acht Byte in Anspruch nimmt und in verschiedene Felder aufgeteilt wird. Dabei wird zunächst die Segmentlänge festgehalten, denn im Gegensatz zum Real Mode müssen die Segmente im Protected Mode nicht genau 64 KByte groß sein. Vielmehr gibt das erste Feld im Segmentbeschreiber die Länge des Segments zwischen einem Byte und 64 KByte an.
Die darauffolgenden drei Byte liefern die Startadresse des Segments im Speicher. Durch die Verwendung von 3 Byte wird die "Adreßbreite" gegenüber dem Real Mode von 20 auf 24 Bit ausgedehnt. Dadurch vergrößert sich auch der physikalisch adressierbare Speicher von 1 MByte auf 16 MByte.

Daß die Lage eines Segments im Segmentbeschreiber und nicht in den FAR-Zeigern kodiert wird, über die der Zugriff auf dieses Segment erfolgt, bietet natürlich auch für die Implementation einer leistungsfähigen Speicherverwaltung große Vorteile. Denn die parallele Ausführung mehrerer Programme ist von dem ständigen Allokieren und Freigeben von Speicherbereichen gekennzeichnet, wodurch der Speicher immer stärker fragmentiert wird. Um dieser Fragmentierung vorzubeugen, ist deshalb immer wieder die Verschiebung einzelner Speichersegmente
[...]

Auf die Basisadresse des Segments folgt innerhalb des Segmentbeschreibers das Byte mit den verschiedenen Flags, von denen gleich noch die Rede sein soll. Als letztes Feld schließt sich ein Word an, das für den 80386 und seine Nachfolger reserviert ist und beim 80286 immer den Wert 0 enthalten muß.[/quote]

;) Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon Aldebaran » Sonntag 10. August 2003, 22:50

super, genau das wollte ich wissen :rolleyes:

vielen Dank
Aldebaran
ja schewu, i ze duze dobre tak :)
Aldebaran
Newbie
 
Beiträge: 7
Registriert: Samstag 9. August 2003, 11:10


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag
  • Suche im RAM
    von DaHarry » Samstag 3. April 2004, 11:55
    11 Antworten
    2201 Zugriffe
    Letzter Beitrag von Marwin Neuester Beitrag
    Donnerstag 15. April 2004, 11:47

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron