Autor Thema: Text-Ausgabe im PM  (Gelesen 3140 mal)

SebE

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« am: 27. December 2005, 19:07 »
Hallo, ich bin Assembler-Neuling und das hier könnte mein erster ASM-Code sein.
Da ich eigentlich in Hochsprachen programmiere, habe ich so meine Probleme mit den Registern, ...

Kann mir jemand weiterhelfen, ich weiß nicht weiter:

PrintStr:
  PUSH CX
  MOV CX, [0xB000:0x8000] ;FEHLER: invalid Segment override

.Load
 ;Byte laden
  LODSB
  OR AL, AL

 ;"Null-Byte", dann Ende
  JZ Short .PrintStrEnd

 ;Zeichen in Video-RAM schreiben
  MOV [CX], AL ;FEHLER: invalid effective address

 ;Farbwert in Video-RAM schreiben
  MOV [CX], AH ;FEHLER: invalid effective address

  INC CX

 ;Nächstes Byte
  JMP .Load

.PrintStrEnd:
  POP CX
  RETN


Könnt ihr mir diese Fehler erklären und beheben?

Danke

SebE

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 27. December 2005, 19:22 »
Also wenn du im PM proggst, dann geht:
MOV CX, [0xB000:0x8000] nicht, denn im PM gibt es keine Segmente mehr. Es würde so heissen:
mov BYTE[0xB8000E], ????????

Und wenn du "0xB000:0x8000" in Klammern schreibst, dann wird ein Word von dieser Adresse nach CX geladen, und keinesfalls die Adresse als Wert selbst.

Gruss Nooooooos

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 27. December 2005, 19:36 »
Zitat von: nooooooooos
Also wenn du im PM proggst, dann geht:
MOV CX, [0xB000:0x8000] nicht, denn im PM gibt es keine Segmente mehr.

<klugscheiß>Das stimmt so auch nicht. Man braucht sie zwar nicht unbedingt zu Adressierung des ges. RAM's, aber trotzdem gibts noch Segmente.</klugscheiß>

Enjoy :!:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

SebE

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 27. December 2005, 19:54 »
ehm, im Moment arbeite ich noch im Real Mode.
ich dachte mir nur, dass ich einen Text ohne die BIOS-Ints zu verwenden, auf den Bildschirm ausgeben könnte.

hab meinen Code geändert:

PrintStr:
  ;PUSH ES
  ;PUSH BX
  PUSH AX

  MOV AX, 0xA000
  MOV ES, AX

  MOV AX, 0x0000
  MOV BX, AX

.Load
 ;Byte laden
  LODSB
  OR AL, AL

 ;"Null-Byte", dann Ende
  JZ Short .PrintStrEnd

 ;Zeichen in Video-RAM schreiben
  MOV [ES:BX], AL

 ;Farbwert in Video-RAM schreiben
  MOV [ES:BX], WORD 0x0007

  INC BX

 ;Nächstes Byte
  JMP .Load

.PrintStrEnd:
  POP AX
  ;POP ES
  ;POP BX

  RETN


Es kommen zwar keine Fehler mehr, aber anzeigen tut er auch nichts.
Ich hab einfach mal ein bisschen mit den Registern und den Adressen rumgespielt - nur es kam nix bei raus.

Hat jemand vielleicht einen Quellcode der das macht, was ich gern hätte??

Danke für eure Hilfe

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 27. December 2005, 21:27 »
- 0xb800 nicht 0xa000

MOV [ES:BX], WORD 0x0007
- du überschreibst das was du einen befehl vorher in den video-ram geschrieben hast. du solltest vorher bx um 1 erhöhen
- außerdem solltest du nur 1 byte schreiben
Dieser Text wird unter jedem Beitrag angezeigt.

SebE

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 27. December 2005, 22:30 »
Hab eine Lösung (hier im Forum) gefunden:

PrintStr:
 ;SI: Text
 ;EBX: Zeile
 ;ECX: Spalte
 ;DL: Attribute (Farbwert)

 ;Zeile bestimmen (80 Spalten = 1 Zeile)
  IMUL EBX, 0x0080

 ;Spalte bestimmen
  ADD ECX, EBX

 ;Adresse verdoppeln, aufgrund des Attribut-Bytes
  IMUL ECX, 0x0002

 ;Adresse bestimmen
  MOV EDI, 0xB8000
  ADD EDI, ECX

.PrintChar:
  MOV BL, [SI]

 ;"Null-Byte", dann Ende
  OR BL, BL
  JZ .PrintStrEnd

  MOV [EDI], BL
  INC EDI

  MOV [EDI], DL
  INC EDI
  INC SI

  JMP .PrintChar

.PrintStrEnd:
  RET


Danke an alle

 

Einloggen