JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=880c6aca64368a69b486032cb0ba41c9Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Prozessor... Segmente ... ??
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 20.10.2007, 00:52    Titel: Antworten mit Zitat

Der "weitere Wert" ist der Wert, den das Register CS enthält.
Register sind unterschiedlich groß. Das CS (Code Segment) ist 16 Bit groß.
Ja, Register ist der Oberbegriff für Speicher auf der CPU.

CS ist ein Code Segment, ein Register und ist 16 Bit bzw. 2 Byte groß.
Damit kann man in 16 Byte-Schritten den Arbeitsspeicher adressieren.

Beispiele:
Dualzahl:
CS = 0000 0000 0000 0000 (dezimal 0) * 16 Byteposition Nr. 0
CS = 0000 0000 0000 0001 (dezimal 1) * 16 Byteposition Nr. 16
CS = 0000 0000 0000 0010 (dezimal 2) * 16 Byteposition Nr. 32
CS = 0000 0000 0000 0011 (dezimal 3) * 16 Byteposition Nr. 48 usw.

Arbeitsspeicher
Byte Nr. 0 (Wenn CS 0 ist, dann verweist CS auf diese Stelle.)
Byte Nr. 1
Byte Nr. 2
Byte Nr. 3
Byte Nr. 4
Byte Nr. 5
Byte Nr. ...
Byte Nr. 16 (Wenn CS 1 ist, dann verweist CS auf diese Stelle)
usw.

Wenn CS den Wert 17000 enthält entspricht dies nicht Byteposition Nr. 17000 sondern
(da die Schrittweite 16 ist) 17000 x 16 = Byteposition Nr. 272000.
Diese Umrechnung macht der Computer intern. Dadurch wird erreicht, dass man
einen größeren Wertebereich adressieren kann.

Wenn dein Programm geladen werden soll, wird CS auf den noch
freien Arbeitsspeicher gesetzt.

Nun wird dein Programm geladen.
Beispiel:

(Beginn)
(Offset = 0) Befehl1 (4 Byte groß)
(Offset = 4) Befehl2 (4 Byte groß)
(Offset = 8) Befehl3 (6 Byte groß)
(Offset = 14) M1: Befehl4 (4 Byte groß)
(Offset = 18) Befehl5 (6 Byte groß)
(Offset = 24) JMP M1 (4 Byte groß)
(Offset = 28)

Der Assembler addiert beim Assemblieren die Anzahl der Bytes, die jeder Befehl im Speicher
belegt. An der Stelle JMP M1 soll das Programm zu der Stelle M1: springen. Der Befehl JMP enthält
neben dem Befehl zu springen, auch den Wert wie weit (relativ vom Programmanfang aus gesehen)
er springen soll.Dieser Wert ist identisch mit dem ermittelten Offset-Wert an der Stelle M1 (14).

Das Offset (Relativadresse) an einer Programmstelle ist also die Anzahl der Bytes, welche die
vorangehenden Befehle bis zur aktuellen Position im Speicher belegen.

Für den Wert wie weit das Programm springen soll stehen 2 Bytes zur Verfügung.
Damit kann man 0 bis maximal 2^16 = 65535 Bytes weit springen.

(Es gibt noch weitere Sprungarten.)

Statt eines festen Zahlenwerts M1 kann man auch folgendes Schreiben:

JMP AX

Dabei muss das Register AX den Offset-Wert enthalten, zu dem das Programm springen soll.

Ich hoffe, dass es nun verständlicher ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 20.10.2007, 10:16    Titel: Antworten mit Zitat

JO das habe ich jetzt ganz gut verstanden, nur jetzt habe ich wieder eine weitere frage:

User_User hat Folgendes geschrieben:
Folgende 20 Bit-Adresse:

20-Bit-Adresse:
1001 1111 1010 1011 0111

Wird in folgende 16-Bit Adresse umgewandelt:
1001 1111 1010 1011

Der Computer interpretiert diese Adresse später als:
1001 1111 1010 1011 0000

Die letzten 4 Bit lässt man Weg. Damit haben die einzelnen Positionen zu diesen Adressen jeweils einen Abstand von 16 Adressstellen. Diese Adresse heißt Basisadresse.

Die Endadresse ergibt sich aus: Basisadresse x 16 + Offset


Ich verstehe nicht genau, was jetzt die basisadresse ist.
Und warum wird überhaupt 20 bit verwendet?? Und nicht gleich 16 bit ??



und wie belegt man AX mit einem wert ?
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 20.10.2007, 17:23    Titel: Antworten mit Zitat

Zitat:
Ich verstehe nicht genau, was jetzt die basisadresse ist.
Und warum wird überhaupt 20 bit verwendet?? Und nicht gleich 16 bit ??


Mit den 16-Bit kann man nur jede 16'ste Stelle ansprechen. Wie erreicht man dann die Zwischenwerte?

Lösung: Das Code-Segment bestimmt grob, wohin das Programm geladen werden soll. Die Offset-Werte erhöhen sich von Byte zu Byte, sodass keine Lücken bleiben.

Die beiden Werte zusammen ergeben eine Adresse.

Beispiel:

Das Programm soll zum Byte Nr. 480015 springen.

Wenn CS den Wert 0 hätte, würden die Offset-Werte ab dieser Stelle berechnet. Mit den Offset-Werten könnte man Byte Nr. 480015 aber nicht ansprechen, da die Sprungweite größer ist als 65536.

Setzt man CS auf 480000/16 würden die Offset-Werte von dieser Ausgangsposition aus berechnet. Von dieser Position aus gesehen, ist das Offset 15 Byte groß genug.

Das Laden eines Programms in den freien Speicher macht das Programm später automatisch. Dabei wird das Code-Segement entsprechend gesetzt. Auch beim Assemblieren macht dies der Assembler automatisch.

Ohne die Basisadresse könnte man nicht alle Bytes des Arbeitsspeichers ansprechen. Die Basisadresse bestimmt die Stelle im Arbeitsspeicher wo das Offset 0 beginnen soll.

Zitat:
und wie belegt man AX mit einem wert ?


Mit dem Move-Befehl kann man Werte in ein Register kopieren.
Dies wird in Büchern zu Assemblerprogrammierung erklärt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 21.10.2007, 12:09    Titel: Antworten mit Zitat

User_User hat Folgendes geschrieben:
Die Endadresse ergibt sich aus: Basisadresse x 16 + Offset


Ehm, kannst du dazu evtl ein beispiel geben ?
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 21.10.2007, 16:56    Titel: Antworten mit Zitat

Beispiel:

Nehmen wir an der Arbeitsspeicher sei von Byte 0 bis Byte 173330 belegt.
Nun startest du ein weiteres Programm.
Nun sei der Arbeitsspeicher von 0 bis Byte 194440 belegt.

Nun startest du dein erstelltes Programm.
Dann geschieht folgendes:

194440 / 16 = 12152,5

Die nächste freie Stelle ist CS = 12153 (es sind nur Ganzzahlen erlaubt und dies wäre die nächste freie Stelle.)
Dies entspräche im Arbeitsspeicher Byte Nr. 12153 * 16 = 194448.

CS wird also auf 12153 gesetzt und dein Programm ab Byte Nr. 194448 in den Arbeitsspeicher geladen.

Enthält dein Programm einen JMP (jump = springen) Befehl berechnet der Computer die Stelle, zu der er springen soll wie folgt:

Wir nehmen ein Offset-Wert von 31 Bytes an:
12153 * 16 + 31 =
194448 + 31 = 194479 (zu dieser Stelle im Arbeitsspeicher springt das Programm)

Offset 0 entspricht:
12153 * 16 + 0
194448 + 0 = Byte Nr. 194448 im Arbeitsspeicher
Ab dieser Stelle aus werden die Offset-Werte berechnet.

Die Endadresse kann einen Wertebereich einnehmen von 2^20 Bit (d.h. 1024 * 1024 verschiedene Bytes ansprechen).

Wenn dein Programm klein ist und die Sprünge nicht größer sind als 65536 Byte, dann kann es dir egal sein, welchen Wert das Segmentregister hat.

Das macht der Computer im Hintergrund und du hast es im Programm (als Anfänger vorerst) nur mit den Offset-Werten zu tun.

Nochmals empfehle ich dir in einer größeren Bücherei (in deiner Kreisstadt) nach Büchern umzusehen, da eine Buchabbildung einen schweren Sachverhalt oft einfach macht.

Außerdem solltest du auch die allgemeinen Grundlagen nicht vernachlässigen Exclamation (als Schüler oder Auszubildender (Mahte, Physik, Computer-AG, Englisch...). Dieses Rat gebe ich, da du mit Bits und Bytes nichts anfangen konntest und dies zu den Grundlagen gehört. Selbst zum Buch zu diesem Forum kann man etwas über Bits und Bytes erfahren.

So, nun widme ich mich anderen Dingen und beende diese Diskussion. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum