1
LABORATORIO 2
Objetivos.
Nuestros objetivos en este laboratorio son los de desarrollar sistemas de computacion usando instrucciones
para el manejo de cadenas de caracteres que. Primero nos permitira la manipulacion de la pantalla en
modo texto 80x25, comprendiendo y aplicando tecnicas para limpiar la pantalla, familiarizarse con la arqui-
tectura de memoria de video en modo texto y optimizar el uso de las instrucciones de cadena en lenguaje
ensamblador. Segundo aplicar compresion de datos alfanumericos definidos en el segmento de datos, usar
instrucciones aritmeticas en el procesamiento de numeros de 16 bits, mostrar el resultado en nuestra pantalla
de 80x25 asi dominando el manejo en la interfaz de video. Tercero deberemos comprimir datos alfanumericos
que seran definidos en el segmento de datos desarrollando la capacidad manipulando procesos de cadenas de
caracteres y datos binarios que nos permitan optimizar el uso de memoria con estas tecnicas de compresion.
Y cuarto trabajar en la descompresion de datos que previamente fueron comprimidos de tal manera que se
pueda recuperar archivos identicos a los anteriores, todo esto en el procesador Intel.
1. Utilizando las instrucciones para manejo de cadenas de caracteres desarrollar un sistema de
computación que permita borrar la pantalla modo texto 80x25.
Analisis.
Para el borrado de pantalla se crea espacios en blanco usando el comando de espacio, este en ASCII es 20 en
Hexadecimal o 0020 0000 en binario, para que cumpla el espacio requerido se multiplica este, para este caso
es 80 x 25 x 2, que es lo pedido en el enunciado, dando un total de 4000 espacios, esto se implementa en el
codigo de la siguiente manera.
borrarP
datos segment para ' data '
ax ← 0B800h
es ← ax datos ends
; ----------------------------------------------------------
codigo segment para ' code '
ax ← 8720h programa proc far ; Encabezado de programa
assume ss : pila , cs : codigo , ds : datos , es : codigo
push ds
di ← 0 mov ax , 0
push ax
cx ← 4000 mov ax , 0 B800h ; accedemos a la memoria en modo texto
mov es , ax ; apuntamos
rep stosw
mov ax , 8220 h ; atributo LETRA VERDE parapadeante sobre fondo negro
mov di , 0 ; apuntamos al inicio
retf mov cx , 4000 ; 80*25
rep stosw ; copiamos espacios en la pantalla
retf
programa endp
; ----------------------------------------------------------
codigo ends
end programa
Figura 1: Diagrama de flujo y programa .asm del ejercicio 1
Aplicacion.
Para el borrado de pantalla se procede a acceder a la memoria en modo texto que tiene su pocision inicial
en 0B800h, desde esta posicion se realiza el copiado del caracter de espacio para realizar el borrado y el
atributo que establecimos es 1000 0010 los primeros 4 bits definen si el atributo de la letra es parpadeante
(1 bit) y el color de la pantalla, como solo el primero esta en 1 solo se le atribuira el parpadeo al texto con
el fondo color negro, los otros 4 bits indican si el texto estara en negrilla (1bit), y el resto define el color del
texto, en este caso verde.
2
Conclusiones.
Para desarrollar un sistema de computación que permita borrar la pantalla en modo texto 80x25, se deben
utilizar las instrucciones específicas para el manejo de cadenas de caracteres. Esto asegurará que la pantalla
se limpie adecuadamente en un entorno de texto con una resolución de 80x25 caracteres, requiere una com-
prensión de la memoria de video y el uso de instrucciones para manejar y manipular cadenas de caracteres
en dicho contexto. Implementar correctamente estas técnicas garantizará que la pantalla se limpie de manera
efectiva y eficiente. con este programa ensamblador podemos convertir códigos ASCII a binario hexadecimal
es esencial porque los dispositivos estándar de entrada y salida, como el teclado y la pantalla, utilizan el
código ASCII para representar caracteres. Sin embargo, el microprocesador de la computadora opera inter-
namente en binario hexadecimal. Por lo tanto, esta conversión es necesaria para que los datos en formato
ASCII, que ingresan o salen de los dispositivos, sean transformados en un formato binario hexadecimal que
el microprocesador pueda procesar y manejar eficientemente.
3
2. Desarrollar un sistema de computación que permita multiplicar dos números de 16 bits que
están definidos en el segmento de datos. El resultado debe presentarse en la pantalla 80x25,
utilizando el programa de la figura 3. Por ejemplo 9876 x 1964 = 19396464.
Analisis.
Para comenzar se multiplicaran los valores, luego el resultado sera convertido a ascii para ser mostrado en la
pantalla 80x25.
multiP datos segment
multiplicando dw 02694 h
mov ax; multiplicando multiplicador dw 007 ACh
resultado dw 2 dup (0)
val_bin dw 2 dup (0)
mul multiplicador val_asc dw 4 dup (0)
fil dw 12
col dw 40
resultado + 2 ← dx k dw 0
atrib db 02 h
datos ends
resultado ← ax ; ----------------------------------------------------------
codigo segment
inicio proc far
hexa_ascii assume cs : codigo , ss : pila , ds : datos , es : datos
push ds
sub ax , ax
Cx ← 0Ah push ax
mov ax , datos
mov ds , ax
si = valasc + 3
mov ax , multiplicando
mul multiplicador ; multiplicamos
ax ← valbin mov resultado +2 , dx ; -+| > guardamos el resultado
mov resultado , ax ; -+
call hexa_ascii
call mostrar
ax < 10 ret
si
no inicio endp
; -----------------------------------------------------
al ← [si] hexa_ascii proc ; conversion hexadecimal a ascii
mov ax , resultado ; -+
mov cx ,3 e8h ; | > convertimos por partes
dx xor dx div cx ;
mov val_bin +2 , ax ;
mov val_bin , dx ;
div Cx lea si , val_asc +7 ;
mov bx ,2 ;
mov ax , val_bin ; -+
dl or 30h mov cx ,0 ah ; factor de division
sig :
cmp ax ,0 ah ; si Nro. binario < 10
[si] ← dl jb fin ; terminar
xor dx , dx ; divide dx : ax
div cx ; entre cx
si = si - 1 or dl ,30 h ; guarda resto
mov [ si ] , dl ; como ascii
dec si
al or 30h jmp sig
fin :
or al ,30 h ; guarda ultimo cociente
[si] ← dl mov [ si ] , al ; como ascii
dec si
mov ax , val_bin +2
ret dec bx ; realiza la conversion
jnz sig ; de la parte alta del numero
ret
hexa_ascii endp
; ---------------------------------------------------------------
mostrar proc
mov ax ,0 b800h
mov es , ax
lea si , val_asc
mov cx ,08 h
Figura 2: Diagrama de flujo y codigo del inciso 2
Aplicacion.
Primero se realizara la multiplicacion con el comando Mul, cuyo resultado se guardara en dx y ax, alma-
cenaremos este valor en la variable resultado y posteriormente se realizara la conversion de binario a ascii
para poder ser mostrado en la pantalla.
4
Conclusiones.
El desarrollo del sistema, lo implementamos en un programa que multiplique dos números de 16 bits definidos
en el segmento de datos y presente el resultado en una pantalla de 80x25 caracteres. Esto incluye definir
adecuadamente las variables para los números y el resultado en el segmento de datos, realizamos la mul-
tiplicación de manera que el resultado de 32 bits sea correctamente manejado y almacenado, y finalmente
convertir este resultado a una cadena de texto que pueda ser desplegada en la pantalla utilizando el programa
definido. De esta manera, se asegura que la multiplicación se ejecute correctamente y que el resultado se
muestre de manera clara y precisa en la pantalla.
5
3. Desarrollar un sistema de computación que permita comprimir (en la variable infCom db)
los datos de un texto definido en el segmento de datos (infOri db). El texto deberá contener
letras y números.
Analisis.
Para comprimir caracteres que estan en codigo ascci se considera que cada caracter en ascci lleva por delante
el numero cero, por ejemplo el 20h = 0010 0000 o tambien 7a = 0111 1010, donde el primer bit es cero,
entonces la forma que se penso para comprimir esto fue la de eliminar ese bit de cero en cada caracter ascii
para que quede en estado comprimido.
Compress
si = infOri pila segment stack
dw 32 dup ( ' la ')
pila ends
si = infCom ; -----------------------------------------------------
datos segment
infOri db " Fernando Molina "
Cx ← logitud db " La Paz 27 FEB 2017 - 20:43 CET "
db " Bolivia acaba de aprobar una controvertida Ley de la "
db " coca , que aproxima la extension de los cultivos "
repmovsb db " autorizados a la cantidad de cultivos existentes , "
db " y distribuye las autorizaciones de produccion entre "
db " dos poderosos grupos de campesinos , uno de los cuales "
si = infCom + longitud -1 db " sigue siendo dirigido por el presidente Evo Morales. "
db " La ley ha sido polemica porque aumento la extension "
db " legal de los cultivos de coca de las 12 .000 hectareas "
Cx ← constante1 db " permitidas hasta ahora , a 22 .000. "
longitud equ $ - infOri
infCom db longitud dup (0)
infDes db longitud dup (0)
clc constante1 dw 1
constante2 dw 0
datos ends
al ← [si] ; -----------------------------------------------------
codigo segment
inicio proc far
rcl al, 1 assume cs : codigo , ss : pila , ds : datos ; Encabezado
push ds
sub ax , ax
[si] ← al push ax
mov ax , datos
mov ds , ax
si = si - 1 mov es , ax
lea si , infOri ; apuntamos texto
loop lea di , infCom ; -+
mov cx , longitud ; | > copiamos
rep movsb ; -+
constante1 = constante1 + 1
sig_byte :
lea si , infCom + longitud -1 ; apuntamos ultimo caracter
mov cx , constante1
no
dx = longitud + 1 clc ; borramos bandera c
sig_rotac ion_izq :
mov al ,[ si ] ; -+
si rcl al ,1 ; | > rotamos hacia izquierda
descomprimir mov [ si ] , al ; -+
dec si ; -+
loop sig_rotacion_izq ; | > rotamos hasta comprimir los ceros
inc word ptr constante1 ;
mov dx , constante1 ;
cmp dx , longitud +1 ;
jne sig_byte ; -+
Figura 3: Diagrama de flujo y programa del inciso 3
Aplicacion.
Para resolver este ejercicio se realizo la rotacion de una palabra donde realizando esto llevariamos el bit que
no nos interesa al final por ejemplo 0111 1010 seria 11110100, con esto podemos excluir de cada palabra solo
haciendo la rotacion para llevar el primer bit que siempre es cero hacia el final.
6
Conclusiones.
Para que podamos desarrollar un sistema que comprima un texto definido en la variable ‘infOri‘ y almacene
el resultado en ‘infCom‘, implementamos un algoritmo de compresión, como RLE (Run-Length Encoding).
Este proceso implica leer el texto original, aplicamos la compresión para reducir su tamaño, guardamos el
resultado comprimido en ‘infCom‘, asegurando que la memoria asignada sea suficiente. La compresión facili-
tará el almacenamiento o la transmisión del texto al reducir su tamaño, mejorando así la eficiencia del manejo
de datos, esto puede permitir mayores velocidades en la transmision de datos al tener datos que puedan ser
transportados en menor espacio de memoria, pero el receptor tambien debe ser capaz de descomprimir la
informacion.
7
4. Desarrollar un sistema de computación que permita descomprimir los datos de la variable
infCom en la variable infDes. Las zonas de memoria infOri e infDes deben ser exactamente
iguales.
Analisis.
Para descomprimir solo se tiene que agregar el cero a cada bit de la informacion que fue comprimida esto
con el fin de tener en codigo ascii la informacion, para esto se vera la manera de agregar ceros cada 7 bits.
Descomprimir
si = infCom
di = infDes
Cx ← logitud
repmovsb
pila segment stack
constante2 = longitud dw 32 dup ( ' la ')
pila ends
; -----------------------------------------------------
si ← infDes datos segment
infOri db " Fernando Molina "
db " La Paz 27 FEB 2017 - 20:43 CET "
push si db " Bolivia acaba de aprobar una controvertida Ley de la "
db " coca , que aproxima la extension de los cultivos "
db " autorizados a la cantidad de cultivos existentes , "
Cx ← constante2 db " y distribuye las autorizaciones de produccion entre "
db " dos poderosos grupos de campesinos , uno de los cuales "
lea si , infCom ; apuntamos al comprimido
lea di , infDes ; -+
clc mov cx , longitud ; | > copiamos
rep movsb ; -+
al ← [si] mov constante2 , longitud
lea si , infDes
rcr al, 1 sig_byte0 :
push si ; agregamos a la pila
mov cx , constante2
si ← al clc ; borramos c
sig_rotac ion_der :
mov al ,[ si ] ; -+
si = si + 1 rcr al ,1 ; | > rotacion derecha 1 vez
mov [ si ] , al ; -+
inc si ; -+
loop loop sig_rotacion_de r ; | > rellenamos de ceros para descomprmir
pop si ;
inc si ;
pop si dec word ptr constante2 ;
jnz sig_byte0 ; -+
si = si + 1 ret
inicio endp
constante2 = constante 2 - 1 ; -----------------------------------------------------
codigo ends
end inicio
no constante2 = 0
si
ret
Figura 4: Diagrama de flujo y programa del inciso 4
Aplicacion.
Para descomprimir la informacion se le añade un cero al final y cada 7bits se realiza la rotacion hacia la
derecha por ejemplo si se tiene la letra A mayuscula comprimida osea 100 0001, se le añade un cero al final
osea 100 00010 y se realiza la rotacion hacia la derecha con lo que se tendria 0100 0001 obteniendo asi la
8
letra A mayuscula en codigo ascii.
Se debe agregar que solo se uso un codigo para los incisos 3 y 4, este se muestra completo en el archivo adjunto.
Conclusiones.
Realizamos un programa que descomprima datos almacenados en ‘infCom‘ y los almacene en ‘infDes‘, es
crucial implementar un algoritmo de descompresión que restaure el texto a su forma original antes de la
compresión. Debe garantizarse que el tamaño de la memoria para ‘infDes‘ sea igual al de ‘infOri‘, asegurando
que el texto descomprimido en ‘infDes‘ coincida exactamente con el texto original en ‘infOri‘. El proceso in-
cluye leer los datos comprimidos, aplicar el algoritmo de descompresión correspondiente (como RLE inverso),
y verificar que el resultado restaurado sea correcto y completo y verificando que el tamaño y el contenido
de la memoria sean consistentes con el texto original, para cada caso de compresion debe haber un caso de
descompresion que sea capaz de recuperar todos los datos comprimidos.
En general este laboratorio se centró en el desarrollo de un programa en ensamblador para convertir un
número en formato ASCII a su representación binaria asi tambien en codigo BCD. El código implementa
de manera efectiva conceptos fundamentales del ensamblador, como el uso de segmentos, registros, manipu-
lación de datos y bucles. Se logró implementar un programa funcional en lenguaje ensamblador que convierte
números en formato hexadecimal a caracteres ASCII, demostrando la comprensión de los conceptos funda-
mentales y la capacidad para realizar programas simples en este lenguaje.