Escribir personaje en Video Buffer Masm
Pregunta
Estoy tratando de escribir la letra 'D' en azul sobre un fondo blanco moviéndola al buffer de video. ¿Qué está mal con este código?
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
Realizó los cambios a arriba. Ahora se ensambla, pero no muestra nada.
Solución
Ejemplo de muestra:
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
Espero que esta muestra te ayude
Otros consejos
1) 0B800H es el segmento Dirección del búfer de video. mov word ptr [si], 44h
aborda solo el compensar (aquí: 0b800h) de la dirección del segmento en DS
- y DS
No apunta al búfer de video. Sugiero cargar el segmento de video en ES
y para usar una anulación de segmento (ES:
).
2) letra más forma de color de color una palabra. En el búfer de video primero viene la letra que el color. El fondo y el color en primer plano usan cada un mordisco (4 bits). Debido a "poca endianness" (Google para él), una palabra debe tener el color/letra del formato, por ejemplo, blanco/azul/'d' = 7144h
Este es un ejemplo compatible con 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
Eche un vistazo al Listado 15 aquí: