Red de conocimiento informático - Material del sitio web - ¿Cómo utilizar métodos de programación en lenguaje ensamblador para mostrar caracteres chinos en la pantalla?

¿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

Le sugiero que escriba más grueso. En este momento, encontrará que algunas cuadrículas están atravesadas por trazos y otras todavía son espacios. Ahora marque las cuadrículas que no están atravesadas por trazos como 0 y las que están atravesadas por trazos. se registra como 1. Comenzando desde la primera línea, escriba la información de esta "celosía" de 16 × 16. Dado que cada línea tiene 16 bits, se necesitan 2 bytes para registrar una

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>

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

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

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 proc

empujar bp

empujar ax

empujar bx

empujar ds

empujar si

empujar cx

empujar dx

mov bp, sp

xor dx, dx

jmp s1

nextChar: ;apunta al siguiente carácter que se generará

add si, 32

add bx, DefDis CharWidth

s1:

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.