Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet 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
-
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
-
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 :!:
-
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
-
- 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
-
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