Forum: Mikrocontroller und Digitale Elektronik 8086 Problem mit Segment Adresse


von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Bei einem 386er Mainboard habe ich den BIOS Chip entfernt und einen
EPROM Simulator angeschlossen.
Nun habe ich ein LCD an den ISA Bus angeschlossen, was auch einwandfrei
funktioniert. Das LCD wird initialisiert und ich kann auch Zeichen
senden. Nur um einen String zu senden muss ich das Data Segment (DS)
anpassen. Sobald ich das mache, initialisiert das LCD aber nicht
mehr...

von Ingo Henze (Gast)


Lesenswert?

Ich weiß jetzt zwar nicht, woran das konkret liegt, aber Du kannst ja
erstmal für den Text das Extra-Segment ES verwenden.
Also oben steht dann:
  mov AX, 61440
  mov ES, AX

und dann in DispText:
  mov AL, ES:Text[SI]

Damit sagst Du dem Assembler, das sich die Indexierung nicht auf DS
(default) sondern auf ES bezieht.

Gruß
Ingo

von Benedikt (Gast)


Lesenswert?

Danke !
Das geht einwandfrei !
Mich würde aber trotzdem interessieren, wiso es mit DS nicht
funktioniert. Im Simulator läuft es einwandfrei...
Immerhin habe ich jetzt ein Display, auf dem ich die Register ausgeben
kann.

von Ingo Henze (Gast)


Lesenswert?

Was für einen Assembler verwendest Du denn.
Beim MASM oder TASM mußte man immer noch Segmente definieren und
zuweisen. z.B.

CODE SEGMENT
     ASSUME CS:CODE,DS:CODE
     mov  AX, CS
     mov  DS, AX
     ...

     Text db   'Das ist ein Test!'
ENDS

Wieso willst Du in DS eine absolute Adresse laden?


Gruß
Ingo

von Benedikt (Gast)


Lesenswert?

Ich verwende Emu8086.
DS braucht doch eine absolute Adresse, sonst funktioniert SI usw. nicht
?
Sobald ich DS beschreibe (damit SI im aktuellen Segment liest) läuft
das Programm nichtmehr.

von Ingo Henze (Gast)


Lesenswert?

Wenn ich das richtig verstanden hab, hast Du dem Board das BIOS geklaut,
und läßt es per EPROM-Simulator Deinen Code ausführen. Das heißt, Du
bist jatzt das BIOS, richtig?
Und genau das ist das Problem. Im Gegensatz zu normalen Programmen, bei
denen auch Konstanten, wie Texte u.ä. immer im RAM landen, sieht das
beim Dir natürlich etwas anders aus.

Nach dem Starten initialisiert die CPU die Register DS, ES und SS mit
0, und CS mit 0ffff0h.
Da ab Adresse 0 beim PC normalerweise RAM liegt, funktioniert der
Schreibzugriff auf Deine Variable "Wert", die auch relativ zu DS
adressiert wird. Setzt Du nun aber DS so, das Deine Textkonstante
verwendet werden kann, zeigt DS ins ROM, was damit natürlich alle
Schreibzugriffe auf Deine Variablen (Zeile, Spalet, Wert, Tester)
unmöglich macht.

Es bleibt Dir also nichts weiter übrig, als für die Adressiereung
Deiner Konstanten eben ein extra Segment-Register (z.B. ES :-) zu
verwenden.

Gruß
Ingo

von Benedikt (Gast)


Lesenswert?

Stimmt !
Daran hatte ich nicht gedacht (bin 8051 gewöhnt, wo es getrennte
Daten/Programmspeicher gibt.)

Solange die Software nicht zu komplex wird, kann ich ja DS für RAM und
ES fürs ROM verwenden. Oder ich bastel mir einen Bootloader, der ein
Programm aus dem ROM in den RAM läd. Daran mangelt es ja zum Glück beim
PC nicht...

von buz11 (Gast)


Lesenswert?

@Benedikt

Wollte auch mal mitm 80x86 rumspielen .
Macht Du was "ernstes" , oder nur so zum Spass ?

von Benedikt (Gast)


Lesenswert?

Das kann ich noch nicht sagen, ich will halt mal alles durchprobieren,
was so rumliegt. Da meine Anfangsschaltung mit einem SAB8088 nicht
funktioniert hat, wollte ich die Idee bereits wieder aufgeben, da ab
286er 16bit Speicher gebraucht wird. Aber dank des BIOS Speichers ist
das ja kein Problem. Auch eine Erweiterung mit Daten ist kein Problem,
da man ja einen Bootloader schreiben kann, der Daten aus einem 8bit
EPROM liest (bzw. aus dem EPROM Simulator) und diese in den RAM
schreibt.
Ich werde auf jedenfall mal versuchen DOS auf meiner eigenen BIOS mit
einem LCD zum laufen zu bekommen...

von Tobi (Gast)


Lesenswert?

"Ich werde auf jedenfall mal versuchen DOS auf meiner eigenen BIOS mit
einem LCD zum laufen zu bekommen..."

du wisst das dos die bios interrupts braucht... viel spass beim
nachbilden.. :)

von Benedikt (Gast)


Lesenswert?

Wo ist das Problem ?
Es gibt feste Adressen die bei einem Interrupt aufgerufen werden.
An diese muss ich nur die entsprechenden Routinen schreiben.
Mal schauen ob es geht...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.