Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: SebE am 27. December 2005, 19:07

Titel: Text-Ausgabe im PM
Beitrag von: SebE 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
Titel: Text-Ausgabe im PM
Beitrag von: nooooooooos 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
Titel: Text-Ausgabe im PM
Beitrag von: bluecode 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 :!:
Titel: Text-Ausgabe im PM
Beitrag von: SebE 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
Titel: Text-Ausgabe im PM
Beitrag von: Jidder 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
Titel: Text-Ausgabe im PM
Beitrag von: SebE 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