Programmcode???
-
Hi!
Hab hier ein Stück Code, dass ich net so ganz verstehe.
MOV AX, @DATA
MOV DS, AXIn nem Buch hab ich das dazu gelesen:
Leider wird das Datensegment-Register beim Laden des Programms vom Lader nicht mit dem korrekten Wert initialisiert. Daher muß die Initialisierung bei jedem Programm, das auf Daten zugreift, vom Anwender selbst vorgenommen werden. Dies geschieht mit den zwei Befehlen.
Kann mir jemand die zwei Befehle auf Deutsch erklären?? Ich werd aus dem obigen Text einfach nicht wirklich schlau.
Gruß Friggel
-
Hier soll DS mit dem richtigen Wert gefüllt werden. Da man mit MOV nicht einem Segmentregister direkt einen Wert zuweisen kann, sondern nur ein Register, muss dies in zwei Schritten geschehen. Wir kopieren den Wert nach AX und von dort aus nach DS. @DATA ist ein TASM Symbol, das für das Datensegment deines Programms steht.
-
Das mit dem direkten kopieren und so weiß ich. Das das net geht usw.
Aber genau das @Data raff ich net, was das genau macht. Was wird mit @Data in AX geschrieben???
-
In DS wird herbei das Segment geschrieben, in dem sich die Daten befinden. In DS muss das Segment stehen, in dem sich deine Daten befinden, damit beim Lesen der Daten auch die richtigen ankommen. Da du beim Ausfüren eines Progrannes (ein eigenes OS mal ausgenommen) keinen Einfluss hast, wohin das Programm ins RAM geladen wird, weißt du natürlich auch nicht in welchem Segment deine Daten stehen. @Data ist einfach nur dieses Segment (bei TASM jedenfalls. Meines wissens ist das nich bei allen interpretern so). Dann musst dus nicht selbst ermitteln und kannst Arbeit sparen.
-
WARUM geht das denn nicht direkt?
-
Moin, Moin...
Bekanntermaßen wird eine Speicheradresse im Realmode in zweit Teile augespalten: Segmentadresse und Offsetadresse.
Ein Segment ist maximal 64 KByte groß und beginnt an einer bestimmten Stelle im Speicher. Die Anfangsadresse des Segments ist die Segmentadresse. Diese Adresse muss in ein Segmentregister abgelegt werden. Für ein Datensegment ist es das Register DS.
Nun ist die Frage, wie man an die Segmentadresse herankommt. Dazu benutzt man eine Assembler-Direktive. Diese Direktive lautet normalerweise SEG(z.B. mov DS, SEG DATA). Der Assembler TASM bietet die Möglichkeit die Definition der Segmente zu verkürzen(über die Direktiven .model, .data, .code). Wenn Du diese verkürzte Segmentdefinition verwendest, kannst Du die SEG-Direktive nicht mehr verwenden. Dann erhälst die die Segmentadresse mit @DATA.
mov AX, @DATA schreibt die Segmentadresse, also die Adresse, an der das Segment beginnt, in das Register AX. Mit mov DS, AX schreibt man die Segmentadresse dann in das zuständige Segmentregister DS. Der mov-Befehl ist nicht so "gebaut", dass man Konstanten direkt in die Segmentregister schreiben kann. Konstanten muss man immer über ein anderes Register in die Segmentregister schreiben. Die Intel-CPUs sind eben so konstruiert.
Nun kannst Du auf Daten in dem Segment zugreifen:
mov bx, 0 ; Offset-Adresse 0 mov byte ptr [bx], 012h ; Der Wert 012h(dez 18) wird an die Adresse 0 im Segment geschrieben
Ciao...
-
Danke für alle Erklärungen von euch. Jetzt hab ich es verstanden.
@Data gibt die Segmentadresse des Datensegments zurück. Ok alles klar.
Ciao