Hallo Simon.
Nach eigenen Angaben programmiert er schon 1,5 Jahre Assembler. Ich würde ihn damit nicht gerade als wirklichen Anfänger bezeichnen. Und ich denke nach 1,5 Jahren wird es möglicherweise Zeit die verschiedenen Adressierrungsarten einmal näher kennenzulernen. Und ob er nun durch eine schlichte Tabelle wo die verschiedenen Adressierungsarten ersichtlich werden nun verschreckt wurde, das kann ich so noch gar nicht erkennen, zumal er nun ein Interesse bekundete sich die Adressierungsarten einmal genauer anzuschauen. Auch meine ich das es nur wenig nütztlich ist nur um den heissen Brei herumzudebatieren, ohne mal konkrete Fakten auf den Tisch zu packen mit denen man sich auch etwas spezieller und eingehender befassen kann.
Da muss ich ganz bescheiden sagen:
Ich hab mich erstmal gefreut, das ich überhaupt etwas funktionierendes hingekriegt habe, und habe dann auf dem Niveau weiterprogrammiert.
Ich habe überhaupt keine Ahnung über Real Mode, usw...
Speicheradressierung hat mich auch noch nicht besonders beschäftigt, weil ich es nie gebraucht habe.
Ich bin sogesehen ein Anfänger
Simon
Schönen Dank das du dazu noch etwas zu sagen hast und ich freue mich das du beim Programmieren schon ein klein wenig Erfolg hattest.
Was genau hast du denn programmiert?
Du sagst das dein Programm schon größer als 512 Bytes ist. Ich denke mir das du dort wohl auch mal eine Speicheradresse beschrieben und ausgelesen hast.
Nun habe ich mal nach asmarc gesucht und diese Adresse gefunden:
http://assembler86.de/download/asmarc.exeIm dort enthaltenen "Liesmich.txt" findet man auch nähere Details dazu z.B. unter Systemvoraussetzungen, das man ein PC mit DOS ab Version 3.x benötigt.
Dieser Assembler arbeitet also im 16 Bit-Realmode und man kann damit 16 Bit-Realmode-Programme erstellen.
Beim weiterern Stöbern fand ich dann auch ein "10.asm" im Verzeichniss "Lernprog".
Dort wird gezeigt wie man eine Zeichenkette über DOS-Funktion 0Ah eingibt und dazu wird eine Speicheradresse mit den folgenden Befehlen beschrieben:
OBJECT Line:
MaxLen DB ? ; 1. Feld "MaxLen" (ein Byte groß)
Length DB ?
....
....
lea di, Line.MaxLen
mov Word [di], 254
....
.....
Der LEA-Befehl läd in das DI-Register die Adresse(Offset) von "Line.MaxLen".
Und der folgende MOV-Word-Befehl schreibt über DI den Wert zu dieser Adresse und der darauf folgenden Adresse("Line.Length").
Bei dieser Adressierung wird das DS-Segmentregister verwendet und die vollständige Adresse bildet sich aus "DS:DI" bzw. "DS:Line.MaxLen"
Das Daten-Segment-Register "DS" braucht man hierbei nicht extra mit in den MOV-Befehl mit angeben, da es hierbei standardmäßig zugeordnet wird, wenn man das DI-Register als Adress-Register verwendet.
...
In der von mir geposteten Intel-Postbyte-Tabelle findet man auch noch andere Adressierungarten mit den man auf eine Speicherstelle zugreifen kann.
Hiermit kannst du etwas experimentieren.
Beispiel:
Puffer1 DB 0,1,2,3,4,5,6,7,8,9
DB "ABCDEFGHIJ"
....
....
lea di, Puffer1
mov bx, 10
mov al, [bx+di]
.....
Ich vermute du kannst hierbei erkennen was hier in das AL-Register geladen wird.
Dirk