Autor Thema: 64kb Speicher reservieren  (Gelesen 7603 mal)

TPSeverino

  • Beiträge: 33
    • Profil anzeigen
Gespeichert
« am: 14. July 2004, 12:11 »
hi, ich hoff ich nerve niemanden mit meinen andauernden Fragen :)
folgendes, ich will im Real-Mode im Mode 13h eine kleine Grafikdemo schreiben.
Damit dass aber ordentlich funktioniert, will ich die Punkte nich direkt in den Bildschirmspeicher schreiben, sondern vorher in einen, naja virtuellen Bildschirmspeicher schieben. Bei der Auflösung 320*200 müsste der 64000 Bytes groß sein.
Wenn ich nun am Anfang von meinem Testkernel
resb 64000
schreibe, bekomme ich einen schwarzen Bildschirm und nicht einmal mehr meine Konsole aus dem Kernel wird angezeigt. er wird also schlicht nicht ausgeführt. Jetzt weiß ich nicht woran es liegen kann. kann mir jemand helfen?? thx

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 14. July 2004, 13:17 »
Hiho,

du musst das resb 64000 hinter deinen Code schreiben. Das Problem ist, was viele nicht zu verstehen scheinen, ist, dass resb und db die daten direkt in die Binärdatei schreiben, genau da wo sie steht. Also wenn du resb zwischen Opcodes schreibst, versucht die cpu diese befehle auszuführen, was natürlich nicht geht. Genau das gleich ist, wenn du die daten vor dem kernel code hast...

MfG GhostCoder
A man, a legend!

Franz1299

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 14. July 2004, 19:47 »
müsste doch auch so gehen:

jmp start
resb 64000
start:
;kernel code

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #3 am: 14. July 2004, 21:54 »
Du musst hier aber beachten (falls du im Realmode bist) das du mit den 64000 + DeinCode wohl die 64KB Grenze überschreitest und wohl das Segment wechseln musst.
----------------------
Redakteur bei LowLevel

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 14. July 2004, 23:02 »
hi

Warum willst du die denn reservieren?
Wenn du deinen eigenen Kernel schreibst, kannst dir ein ein Segment freihalten und dann die Daten da rein schreiben.

mfg gurru

TPSeverino

  • Beiträge: 33
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 15. July 2004, 14:26 »
da ja wie Teejay sagt, die Variable mit den 64000 Bytes die Segmentgrenze definitiv sprengt, wollt ich wissen, wie ich manuel das Segment von dieser Variable festlegen kann oder auch wie gurru sagt, wie ich mir ein Segment freihalten und die Daten dann da reinschreiben kann
thx

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #6 am: 15. July 2004, 15:03 »
Also du musst, schon selber drauf achten, dass du da nichts reinschreibst (ist ja u.A. die Aufgabe eines OSes. Das Segment kanst du ansprechen, indem du ein Segmendregister (z.B. es) mit dem Segment belegst und dann über ein indexregister z.B. zusammen mit dem Segmentregister die Adresse angibst (es:di).

TPSeverino

  • Beiträge: 33
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 15. July 2004, 16:26 »
ja aber wenn ich zum Beispiel mit resb einen Speicherbereich reserviere, dann weiß ich nicht in welchem Segment sich dieser Speicherbereich befindet. wie kann man da das Segment selber festlegen?

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #8 am: 15. July 2004, 21:35 »
Indem du da einfach was reinschreibst. Du musst das nicht als Varible im Programm haben! (höchstens einen Pointer)

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 15. July 2004, 22:57 »
hi

@TPSeverino:
Doch, der Speicher liegt dann im CodeSegment (CS)

MOV FS, segment
MOV FS:[AX], Value

In FS ist das Segment gespeichert, in AX der Offset, und Value ist der WErt den du speichern willst

@Segment festlegen
Bei Nasm geht das nicht (oder doch?)
Bei Tasm kann man ein Teil des Codes als Datasegment und einen anderen Teil des Codes als data segment definieren

mfg

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #10 am: 15. July 2004, 23:16 »
Kann FS im Real-Mode überhaupt genutzt werden?

FS und GS wurden ja erst im PMode eingeführt.

Würde also eher ES benutzen. Heißt ja auch "Extra-Segment-Register".
----------------------
Redakteur bei LowLevel

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 19. July 2004, 22:44 »
hi

FS, gs wurden mit dem 386 eingeführt und können damit ab diesem Prozessor benutzt werden

Ich habe FS benutzt, da ES/DS für die String-Befehle benötigt werden, und da man so das Register nicht so oft neu laden muss

gurru

 

Einloggen