Schreiben Sie Charakter in Videopuffer Masm
Frage
Ich versuche, den Buchstaben 'D' in blau auf einem weißen Hintergrund zu schreiben, indem ich ihn in den Videopuffer verschiebt. Was ist los mit diesem Code?
INCLUDE Irvine16.inc .code main PROC mov ax,@data mov ds,ax mov si, 0b800h mov word ptr [si], 44h mov word ptr [si+2] 0701h mov ah, 08h int 21h exit main ENDP
Die Änderungen an oben gemacht. Es montiert jetzt, zeigt aber nichts an.
Lösung
Beispielbeispiel:
name "hello-world" org 100h ; set video mode mov ax, 3 ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3) int 10h ; do it! ; cancel blinking and enable all 16 colors: mov ax, 1003h mov bx, 0 int 10h ; set segment register: mov ax, 0b800h mov ds, ax ; print "hello world" ; first byte is ascii code, second byte is color code. mov [02h], 'h' mov [04h], 'e' mov [06h], 'l' mov [08h], 'l' mov [0ah], 'o' mov [0ch], ',' mov [0eh], 'w' mov [10h], 'o' mov [12h], 'r' mov [14h], 'l' mov [16h], 'd' mov [18h], '!' ; color all characters: mov cx, 12 ; number of characters. mov di, 03h ; start from byte after 'h' c: mov [di], 11101100b ; light red(1100) on yellow(1110) add di, 2 ; skip over next ascii code in vga memory. loop c ; wait for any key press: mov ah, 0 int 16h ret
Hoffe, dieses Beispiel hilft dir
Andere Tipps
1) 0b800h ist das Segment Adresse des Videopuffers. mov word ptr [si], 44h
Adressen nur die Offset (hier: 0b800h) der Segmentadresse in DS
- und DS
zeigt nicht auf den Videopuffer. Ich schlage vor, das Videosegment in das Laden zu laden ES
und um eine Segmentüberschreibung zu verwenden (ES:
).
2) Buchstabe plus Farbform zusammen ein Wort. Im Videopuffer kommt zuerst der Buchstabe dann die Farbe. Hintergrund- und Vordergrundfarbe verwenden jeweils ein Knabbern (4 -Bit). Aufgrund von "Little Endianness" (Google dafür) sollte ein Wort die Formatfarbe/den Format haben, z. B. weiß/blau/'D' = 7144H
Dies ist ein kompatibles Beispiel von Irvine16:
INCLUDE Irvine16.inc
INCLUDELIB Irvine16.lib
.CODE
main PROC
; mov ax,@data ; No .DATA in this example
; mov ds,ax
mov si, 0b800h ; Initialize ES with video buffer
mov es, si
xor si, si ; Position 0 is top left
mov word ptr es:[si], 7144h ; White background ('7'), blue foreground (1), letter 'D' (44)
mov ah, 08h ; Wait for key - http://www.ctyme.com/intr/rb-2561.htm
int 21h
exit ; Irvine16: end of program
main ENDP
END main
Schauen Sie sich hier die Auflistung 15 an: