¿Cómo utilizar métodos de programación en lenguaje ensamblador para mostrar caracteres chinos en la pantalla?
A través de la práctica, tendrá una comprensión general de los métodos de trabajo en modo gráfico y los métodos básicos de implementación del soporte de caracteres chinos. Mi trabajo es mostrar los cinco caracteres chinos del "Sistema operativo de caracteres chinos" en la pantalla después de iniciar el sistema
Nota: Aquí solo presentamos el uso de fuentes de matriz de puntos.
Preparación:
1. Primero, se debe crear la información de la matriz de puntos correspondiente.
Creemos una matriz de puntos de 16 × 16 de dos caracteres chinos. , Es muy simple. Dibujas una fila en el papel.
Cada cuadrado tiene 16 cuadrículas. Luego, según su tamaño, escribe una palabra en su interior, como "成", construir
Líneas, *** 16 líneas, por lo que se necesitan ***2×16=32 bytes para guardar el "retículo" de una palabra.
Por ejemplo: chino-- 00000h, 04008h, 037fch, 01008h, 08208h, 06208h, 02210h, 00910h
01120h, 020A0h, 0E040h, 020A0h, 02110h, 02208h, 0240Eh, 00804h
Por supuesto que sí" "Dot Matrix" se carga desde otras bibliotecas de fuentes, pero el método anterior es definitivamente factible
Así es esencialmente como se genera la matriz de puntos.
2. Escribe una subrutina para mostrar un píxel
Tarea afrontada: imprimir un píxel en pantalla en modo gráfico
Análisis:
Variables requeridas: valores iniciales de coordenadas de la esquina superior izquierda x0, y0
Parámetros predeterminados: la resolución predeterminada es el modo de color 640×480×16
(Porque este es el modo admitido por BIOS estándar VGA)
El color predeterminado es negro con caracteres amarillos
Implementación: (Consulte "Tecnología de programación práctica VGA" Luo Jianjun Tsinghua University Press 1995)
; Función:
; Dibujar un punto con el color especificado en la posición de pantalla especificada
; coordenada del píxel en la pantalla
; ax = y0 es la coordenada Y del píxel en la pantalla
; cl = color es el valor de color del píxel
writePix proc
linelen = 80; El número de bytes ocupados por una línea de escaneo en modo de color 640*480*16
=Ancho/8
; Calcula la posición del píxel
push es
push bp
push dx
push ax
empujar di
empujar cx
empujar bx
mov bp, sp
mov cl, 3
shr bx , cl; número de página
mov di, ax
;Establecer el registro de máscara de imagen
mov dx, secuencia_ctl
mov al, 2
out dx, al
inc dx p> p>
mov al, 0fh; los cuatro planos pueden escribir
dx, al
elegir el método de escritura 2
mov; dx , graphi_ctl
mov al, 5
out dx, al
inc dx
mov al, 2
out dx, al
Calcula el código de máscara y configura el registro de máscara de bits
dec dx
mov al, 8
out dx, al
mov cx, [bp]; obtener coordenadas X
y cl, 7
mov al, 80h
shr al, cl
inc dx
out dx, al
; escribir datos
mov ax, vgaseg; a la dirección de memoria de video 0a000h
mov es, ax
mov ax, [bp 2]; obtiene el valor del color
mov ah, es: [di ]; leer una vez para enmascarar El registro es válido
mov es: [di], al; escribir para mostrar la memoria
pop bx
pop cx
pop di
pop hacha
pop dx
pop bp
pop es
ret
writePix endp
3. Escribe una subrutina que genere un carácter gráfico chino Con la base de 2, este paso parece más fácil de implementar
<. p> De la siguiente manera:; Muestra un carácter chino en modo gráfico
; Parámetros de entrada:
; p >
; AX=y0 coordenada Y inicial de la esquina superior izquierda
; CX=color en realidad es solo cl que indica el color
; información de matriz
p>; Valor de retorno: Ninguno
DispZhC proc
push si
push bp
empujar hacha
empujar bx
empujar cx
empujar dx
mov bp, sp
xor dx, dx; dx línea actual
jmp a1
Disp:
inc si
inc si apunta a la siguiente palabra
inc dx; agregue uno al recuento de filas
a1:
cmp dx, 16; la fila actual es 0-15 porque es una matriz de puntos de 16*16.
je Listo p>
xor cx, cx; inicialización de la columna actual cx
mov bx, palabra ptr [si]; representado por dos bytes en una fila
DispL:
cmp cx, 16
je Disp; avance de línea
o cx, cx; clear CF
shl bx, 1
jc DispP si el bit actual es 1, muestra un punto.
inc cx
jmp DispL
DispP:
empujar el hacha
empujar bx
empujar cx
mov ax,[bp 6]
agregar ax,dx
mov bx,[bp 4]
agregar bx, cx
mov cx, [bp 2] valor de color en cl
llamar a writePix
pop cx
inc cx;
pop bx
pop ax
jmp DispL
Hecho:
pop dx
pop cx
pop bx
pop hacha
pop bp
pop si
ret p>
DispZhC endp
4. Escribe una subrutina que genere una cadena
Tarea que enfrentas: ya tienes una subrutina que muestra un carácter y ahora necesitas llamarla continuamente para mostrar completamente toda la matriz de puntos de caracteres chinos en el búfer.
Análisis:
Variables requeridas: Coordenadas iniciales de la esquina superior izquierda de toda la cadena x0, y0
Longitud de la cadena
En Las coordenadas x1 e y1 de la esquina superior izquierda se pasan a la subrutina al mostrar cada carácter
Parámetros predeterminados: el valor predeterminado es 16 puntos
El espacio predeterminado entre caracteres es 5 píxeles
Estructura principal del programa:
Un único bucle que se repite según la longitud de la cadena.
Mi implementación:
; Muestra una cadena de longitud especificada en modo gráfico
; Parámetros de entrada:
; la primera dirección del búfer de matriz de puntos de cadena
ax=y0 es la coordenada Y de la esquina superior izquierda del primer carácter de la cadena
; esquina izquierda del primer carácter de la cadena Coordenada X de la esquina
; ch=n
; cl=color
; p>
DefDis = 5 Cada El espacio predeterminado entre dos símbolos es 5 píxeles
CharWidth = 16 el valor predeterminado es 16 puntos, que también es el ancho de píxeles de cada carácter
<; p> DispZhS procempujar bp
empujar ax
empujar bx
empujar ds
empujar si
empujar cx
empujar dx
mov bp, sp
xor dx, dx
jmp s1 p>
nextChar: ;apunta al siguiente carácter que se generará
add si, 32
add bx, DefDis CharWidth
s1: p>
cmp dh, ch ¿Se ha generado el número de caracteres especificado?
je Dones
call DispZhc
inc dh
jmp nextChar
Hecho:
pop dx
pop cx
pop si
pop ds
pop bx
pop hacha
pop bp
ret
DispZhS endp
5. Cómo ingresar al modo de gráficos para VGA estándar
; ingrese al modo de color 640×480×16
; 16 y 320* en 200*256 son modos VGA estándar, que son 12h y 13h respectivamente en varios VGA
mov ax, 12h
int 10h 19_24.rar (39,92 KB)
Algunas ideas sobre el soporte chino:
1. "Conjunto de caracteres" es sólo una abstracción de alto nivel del problema para los usuarios.
Cuando guardas un documento chino en un disquete y te lo llevas a casa, lo que se almacena en él es una colección de códigos en el "juego de caracteres", que define el único mundo real de una manera que se convierte en un estándar. Los caracteres chinos existen. Pero, por otro lado, ¿estos códigos en sí no indican ninguna otra información sobre este carácter chino, como por ejemplo la pronunciación? ¿Radical? Espere, cuando vea este documento en otra máquina, debe haber una "capa de visualización" entre el humano y la computadora. No importa cómo se implemente esta capa de visualización. Lo único importante es que también debe conocer la codificación. Relación correspondiente con los caracteres chinos: cuando lee un código que está en un determinado "conjunto de caracteres", convierte el código estándar en su propio código de información de glifos a través de una tabla de conversión de códigos que mantiene. Este es un proceso de tabla de búsqueda. "dibuja" un carácter chino específico basándose en la información encontrada.
2. Esto significa que lo importante es el estándar, no la implementación. Cuando desea mostrar caracteres chinos en una plataforma en inglés, la única dificultad es determinar un conjunto de caracteres estándar que no entre en conflicto. entre sí. No es en absoluto una cuestión de qué forma aparece.
3. Para garantizar la compatibilidad y la multiplataforma, desde la perspectiva del software, es mejor traer su propia fuente. A través de este ejemplo, queda claro cómo traer su propia fuente. El programa implementado aquí se basa en palabras. En lugar de leer la información del glifo en bytes como es habitual, la codificación en la biblioteca de fuentes de matriz de puntos habitual no se puede utilizar directamente. En ese caso, los dos lados del carácter se invierten y cada dos. Los bytes deben intercambiarse antes de que puedan mostrarse correctamente. Pero no es difícil lograr la universalidad modificando el código en DispZhC.
4. El principio para realizar glifos vectoriales es el mismo, pero se necesitan más métodos matemáticos. Esto explica el propósito de la teoría. Piense en por qué algunos expertos en informática están motivados originalmente por su amor por los juegos.