Está en la página 1de 11

Tres programas básicos en ensamblador del 8086

Autor: Profesor Noé Amir Rodríguez Olivares

Introducción
Este manual presenta una breve introducción a la programación en ensamblador
para el microprocesador de 16 bits 8086. Este manual se apoya de una serie de
recursos en línea de otros autores, con lo cual se enriquece más la información
disponible. El procedimiento para generar un conocimiento se basa en los
siguientes pasos:

1. Se muestra la descripción de la función que desarrolla el programa.


2. Se presenta un código, el cual se debe compilar en el software emu8086
(para ver como instalar el programa visite el siguiente link:
https://www.youtube.com/watch?v=CZNmEAKhk8I ).
3. Se hace una breve descripción de puntos importantes del código.
4. Se solicita al estudiante anotar los comentarios necesarios al programa.
5. Se presentan una serie de actividades que ayudan a mejorar la
comprensión del programa.

Ejercicio 1. Impresión de texto en pantalla

Función. El siguiente programa presenta el texto en pantalla “Mi primer


programa”:

Fig. 1 Ejercicio 1

Programa 1. El código que genera el texto es el mostrado a continuación:

.STACK 100h ;Segmento de Pila de longitud 256


CR EQU 13 ;com:
LF EQU 10 ;com:
.DATA ;Segmento de datos con valores iniciales

TEXTO DB LF,CR,'Mi primer programa$' ; com:

.CODE ;com:
MOV AX,@DATA ;com:
MOV DS,AX

MOV AH,9 ;com:


INT 21h ;com:

MOV AH,4ch ;com:


INT 21h

END

Implemente el código en el emulador para que valide el mensaje de texto


mostrado.

Descripción. En este primer ejercicio se definen algunos conceptos de un


programa en lenguaje ensamblador.

 Una directiva es un comando que afecta al compilador (al software que


opera con el lenguaje ensamblador) y no al microprocesador, por lo tanto,
no generan un tipo de código objeto. En el programa 1 las directivas están
sombreadas en color amarillo.
 Las instrucciones se encuentran marcadas en color azul.
 Los registros que está utilizando el programa van marcados en color
rojo.

Comentarios. Comente cada una de las líneas de código explicando cuál es la


función de cada una. Para realizar los comentarios de la mejor manera posible,
apóyese de las siguientes ligas de información:

 https://www.alpertron.com.ar/INST8088.HTM
 http://www.cs.buap.mx/~mgonzalez/asm_mododir2.pdf
 http://nuyoo.utm.mx/~jjf/le/LE_APENDICE_D.pdf

Actividades. Ahora puede consultar el siguiente link para que comprenda de


mejor manera el código ASCII y la importancia de manejarlo correctamente.

 https://www.youtube.com/watch?v=UR1kGGe1wjw&spfreload=10
 http://www.elcodigoascii.com.ar/caracteres-ascii-control/salto-linea-
nueva-linea-codigo-ascii-10.html
 https://es.wikipedia.org/wiki/Retorno_de_carro

Ahora copie el programa y llámelo Ejemplo1_v1, y modifíquelo conforme al


programa 1 versión 1 y trate de predecir cómo se verá el texto en el monitor al
correr el programa y compárelo con el mostrado en la Fig. 2.

Programa 1 versión 1: Desplazamiento horizontal y vertical

.STACK 100h
CR EQU 13 ;Retorno de cato
LF EQU 10 ;Nueva linea
.DATA ;Zona de datos inicializados

TEXTO DB LF,CR,LF,LF,LF, ' Espacio Mi primer programa$'

.CODE ;com:
MOV AX,@DATA ;com:
MOV DS,AX

MOV AH,9 ;com:


INT 21h ;com:

MOV AH,4ch ;com:


INT 21h

END

Fig. 2 Programa 1, versión 2

El código no aparece totalmente en la parte superior izquierda debido a las líneas


sombreadas en color amarillo, principalmente al valor 10 que es cargado al poner
4 veces LF en el código. Si tiene alguna duda, vuelva a revisar los links sobre la
información correspondiente al código ASCII.

Ahora copie el programa y llámelo Ejemplo1_v2, y trate de predecir cómo se


verá el texto en el monitor al correr el programa.

Programa 1 versión 2: Impresión de 2 cadenas juntas

.STACK 100h
CR EQU 13 ;Retorno de cato
LF EQU 10 ;Nueva linea
.DATA ;Zona de datos inicializados

TEXTO1 DB LF,CR,LF,LF,LF, ' Espacio Mi primer programa'


TEXTO2 DB CR,10,10,10,10,10,LF, 'Aquí empieza otra línea$'

.CODE ;com:
MOV AX,@DATA ;com:
MOV DS,AX
MOV AH,9 ;com:
INT 21h ;com:

MOV AH,4ch ;com:


INT 21h

END

Modifique el programa 1 versión 2, en la línea sombreada en color amarillo para


poner al final de la línea el signo de pesos “$”, corra el programa y los siguientes
puntos del programa:

 ¿Qué función realizan los valores de 10 en la variable TEXTO2?


 ¿Qué pasó al colocar el signo de pesos “$” al final de TEXTO1?

Ejercicio 2. Ingreso de datos por medio del teclado

Función. El siguiente programa espera la captura de un número, el programa


es una adaptación del programa presentado por:
https://www.programacion.com.py/escritorio/ensamblador/ejercicios-
resueltos-en-ensamblador-8086 y tiene la capacidad de filtrar y capturar solo
los números si es que se ingresa texto. El programa termina cuando se presiona
la tecla enter. La Fig. 3 muestra el resultado en pantalla de ingresar el texto
as12ks4kjd3kjs5.

Fig. 3 Pantalla del ejercicio 2

El siguiente diagrama de flujo presenta como funciona el programa, y relaciona


en colores las partes del código para facilitar la comprensión.
Declara a texto 1 y a texto 2, si=0

Espera un caracter, y cárgalo en al

si no
al=13?

Limpia la pantalla no si
al>57?

Imprime texto 1 no si
al<=47?
?
Bx=[bx $]
bx[si]=al

si=si+1
Imprime
bx

Imprime texto 2

Programa 2. El código es el mostrado a continuación:

;-------------------------------------------------------
;Descripcion:
; Programa que espera la captura de datos
;
;-------------------------------------------------------
;Equates o definiciones

;-------------------------------------------------------
Org 100h ;Inicio del codigo
.Data
texto1 db 10,13,'El numero es: $'
texto2 db 10,13,10, 'Programa terminado$'
.Code
mov si,0 ;Se inicia en 0 el registro "si"
;consulte http://www.cs.buap.mx/~mgonzalez/asm_mododir2.pdf
entrada: ;Etiqueta para volver a esperar caracter
mov ah,1 ;Espera de caracter con eco
int 21h
;consulte
;http://ict.udlap.mx/people/oleg/docencia/ASSEMBLER/asm_interrup_21.html
;recuerde que en AL = codigo ASCII del Carácter leido

cmp al,13 ;Se presiono la tecla enter?


jz termina ;si se presiono enter (valor numerico 13) ve a termina
;para entender porque el 13 revise el codigo ASCII

cmp al,57 ;Compara el numero de la tecla con 57?


ja entrada ;brinca a entrada si es mayor a 57
cmp al,47 ;Compara el numero de la tecla con 47?
jng entrada ;brinca a entrada si es menor o igual a 47

;Aqui llega solo aquel valor entre 0 y 9 en ASCII


mov bx[si],al ;si es un digito entonces lo guardo en bx
inc si ;incrementa el registro si
jmp entrada ;regresa para esperar otro dato

termina:
mov ah,00h ;Limpia la pantalla
mov al,03h
int 10h
mov ah,9 ;Impresion de texto 1
mov dx,offset texto1
int 21h

mov bx[si],"$" ;Se anade el signo $ para terminar una cadena


mov dx,offset bx
mov ah,9 ;preparar ah con 9 para la interrupcion 21h
int 21h ;mostrar contenido guardado en bx

mov ah,9 ;Impresion de texto 2


mov dx,offset texto2
int 21h
ret

Implemente el código en el emulador para que valide el funcionamiento del


programa.

Descripción. En este ejercicio se presentan algunos puntos importantes útiles


para un programa en lenguaje ensamblador.

 El programa permite el ingreso de diferentes caracteres por medio de la


interrupción 21h, para mayor información consulte:
http://ict.udlap.mx/people/oleg/docencia/ASSEMBLER/asm_interrup_21.
html, primera parte sombreada en amarillo.

 Las instrucciones ja y jng se utilizan posteriormente de utilizar la


instrucción cmp. https://www.alpertron.com.ar/INST8088.HTM

 Con el valor 9h cargado en la interrupción 21h, y utilizando offset es


posible imprimir variables por separado tomadas de la sección .Data.
Comentarios. Analice los comentarios realizados en el código, y relaciónelos
con el diagrama de flujo.

Actividades. Ahora copie el programa y llámelo Ejemplo2_v1, y modifíquelo


para que ahora el programa almacene cualquier carácter excepto los números
del 0 al 9.

Fig. 4 Pantalla del ejemplo 2 versión 1.

Ahora compare su código con el Ejemplo2_v1 mostrado a continuación.

;-------------------------------------------------------
;Descripcion:
; Programa que espera la captura de datos
;
;-------------------------------------------------------
;Equates o definiciones

;-------------------------------------------------------
Org 100h ;Inicio del codigo
.Data
texto1 db 10,13,'Las letras y caracteres son: $'
texto2 db 10,13,10, 'Programa terminado$'
.Code
mov si,0 ;Se inicia en 0 el registro "si"
entrada: ;Etiqueta para volver a esperar caracter
mov ah,1 ;Espera de caracter con eco
int 21h ;recuerde que en AL = codigo ASCII del Carácter leído

cmp al,13 ;Se presiono la tecla enter?


jz termina ;si se presiono enter (valor numerico 13) ve a termina

cmp al,57 ;Compara el numero de la tecla con 57?


ja guarda ;brinca a entrada si es mayor a 57
cmp al,47 ;Compara el numero de la tecla con 47?
jng guarda ;brinca a entrada si es menor o igual a 47
jmp entrada
guarda:
mov bx[si],al ;si es un digito entonces lo guardo en bx
inc si ;incrementa el registro si
jmp entrada ;regresa para esperar otro dato
termina:
mov ah,00h ;Limpia la pantalla
mov al,03h
int 10h
mov ah,9 ;Impresion de texto 1
mov dx,offset texto1
int 21h

mov bx[si],"$" ;Se anade el signo $ para terminar una cadena


mov dx,offset bx
mov ah,9 ;preparar ah con 9 para la interrupcion 21h
int 21h ;mostrar contenido guardado en bx

mov ah,9 ;Impresion de texto 2


mov dx,offset texto2
int 21h
ret

Ejercicio 3. Ingreso de datos por medio del teclado y


conversión a octal

Función. El siguiente programa espera la captura de un número de máximo 3


digitos, el programa es una adaptación del programa presentado por:
https://www.programacion.com.py/escritorio/ensamblador/ejercicios-
resueltos-en-ensamblador-8086 y tiene la capacidad de filtrar y capturar solo
los números si es que se ingresa texto. El programa continua cuando se presiona
la tecla enter. Posteriormente convierte el valor cargado en decimal a octal. La
Fig. 5 muestra cuando al programa se le carga el texto “as1sdf2jg9”

Fig. 5 Pantalla 1 del ejercicio 3

Posteriormente, al presionar la tecla enter, el programa toma solo el valor 129


y lo convierte a octal. El resultado del programa se muestra en la Fig. 6.

Fig. 6 Resultado del ejercicio 3


Programa 3. El código que genera el texto es el mostrado a continuación:

;-------------------------------------------------------
;Descripcion:
; Programa que espera la captura de datos y convierte
; el valor en decimal a octal
;
;-------------------------------------------------------
;Equates o definiciones

;-------------------------------------------------------
Org 100h ;Inicio del codigo
;-------------------------------------------------------
;Datos utilizados en el programa
.Data
texto1 db 10,13,'El numero es: $'
texto2 db 10,13,10, 'su valor octal es: $'
acumulad dw 0 ;Acumador
apoyo1 dw 0
potencia dw 1 ;potencia 1 10 100 1000
;-------------------------------------------------------
;Código
.Code
Mov si,0 ;Se inicia en 0 el registro "si"
entrada: ; Etiqueta para volver a esperar caracter
mov ah,1 ;Espera de caracter con eco
int 21h ;recuerde que en AL = codigo ASCII del Carácter leido
cmp al,13 ;Se presiono la tecla enter?
jz termina;si se presiono enter (valor numerico 13) ve a resultado
;para entender porque el 13 revise el codigo ASCII
cmp al,57 ;Compara el numero de la tecla con 57?
ja entrada ;brinca a entrada si es mayor a 57
cmp al,47 ;Compara el numero de la tecla con 47?
jng entrada ;brinca a entrada si es menor o igual a 47
;Aqui llega solo aquel valor entre 0 y 9 en ASCII
mov bx[si],al ;si es un digito entonces lo guardo en bx
inc si ;incrementa el registro si
jmp entrada ;regresa para esperar otro dato
;Aquí muestra el numero leido
termina:
mov ah,00h ;Limpia la pantalla
mov al,03h
int 10h
mov ah,9 ;Impresion de texto 1
mov dx,offset texto1
int 21h

mov bx[si],"$" ;Se anade el signo $ para terminar una cadena


mov dx,offset bx
mov ah,9 ;preparar ah con 9 para la interrupcion 21h
int 21h ;mostrar contenido guardado en bx
;Aquí comienza la conversion a binario
dec si ;se mueve el puntero-1, para no tomar a "$"
llenacum:
mov bx,[si] ;se carga en bx el dato guardado
mov apoyo1,bx ;se pasa de bx a apoyo1
and apoyo1,00FFh ;se toman solo los primeros 8 bits
sub apoyo1,48 ;se le resta el 48 del ASCII
mult:
mov ax,potencia ;se carga la potencia por posicion
;las potencias son 1 10 100 1000 10000
mul apoyo1 ;se multiplica el valor por la potencia
add acumulad,ax ;acumulador=acumulador+(apoyo1*potencia)
mov ax,10 ;se carga el 10 para elevar
mul potencia ;se multiplica la potencia por 10
mov potencia,ax ;potencia=potencia*10, inicio siendo 1
cmp si,0 ;se compara a si con 0
mov bx,0 ;se limpia bx
je ajuste ;si "si==0" brinca a ajuste, sino sigue
dec si ;si=si-1
jmp llenacum ;sigue llenando el acumulador
;Conversion a octal
ajuste:
mov si,5 ;Se separa acum en paquetes de 3 bits
;seran maximo 5 paquetes
convoctal:
mov ax,acumulad ;Ax=acumulador
and ax,0007h ;se enmascaran, y quedan solo los primeros 3 bits,
add ax,48 ;se le suman 48 para hacerlo ASCII
mov bx[si],al ;Se guarda el valor
dec si ;si=si-1
shr acumulad,1 ;Se recorre acumu 1 a la derecha
shr acumulad,1 ;Se recorre acumu 1 a la derecha
shr acumulad,1 ;Se recorre acumu 1 a la derecha
cmp si,65535 ;se compara si si ya se desbordo hacia atras
je finacum ;si "si"es igual a 65535 brinca a finacum
jmp convoctal ;sino son iguales, sigue convirtiendo a octal
;Impresión del valor en octal
finacum:
mov ah,9 ;Impresion de texto 2
mov dx,offset texto2
int 21h
mov si,6 ;Se da la direccion para añadir el signo de pesos
mov bx[si],"$" ;Se anade el signo $ para terminar una cadena
mov dx,offset bx
mov ah,9 ;preparar ah con 9 para la interrupcion 21h
int 21h ;mostrar contenido guardado en bx
ret
Implemente el código en el emulador para que valide el funcionamiento.

Descripción. En este tercer ejercicio se utilizan múltiples registros e


instrucciones para poder realizar la conversión de decimal a octal. El
pseudocódigo utilizado para el desarrollo es el siguiente:

 Paso 1: Inicio del programa


 Paso 2: Espera dato
 Paso 3: Compara el dato ingresado, si es la tecla enter ve al paso 5, si no,
ve al paso 4.
 Paso 4: Compara el dato ingresado, si es un numero guárdalo, y ve al
paso 2, si no es un número, solo ve al paso 2.
 Paso 5: Limpia la pantalla
 Paso 6: Imprime el texto1 y el número adquirido.
 Paso 7: Quita el signo de pesos al vector de números
 Paso 8: Convierte cada uno de los dígitos que tienen un valor ascii a su
valor binario y multiplícalos por su valor posicional, y súmalos, para tener
en un solo registro, el acumulado en binario de los dígitos ingresados.
 Paso 9: Secciona en paquetes de 3 bits al registro acumulado, y guárdalo
en un vector sumándole a cada dato el valor 48 para convertirlo en un
valor ascii.
 Paso 10: Imprime texto 2 y el valor en octal.
 Fin del programa

Comentarios. Analice cada uno de los comentarios realizados y relaciónelos con


el pseudocódigo, para entender algunas de las operaciones más importantes, se
le sugiere consultar en la red los siguientes tópicos muy importantes.

 El valor numérico del ASCII 0, 1 hasta el 9, apóyese de


http://www.elcodigoascii.com.ar/
 Cuáles son las funciones básicas para las cuales se ocupan los registros
ax, bx y dx. Consulte
http://www.exa.unicen.edu.ar/catedras/progens/materiales/arquitectura
%208086.pdf ,
https://lenguajeensambladoryelementos.wordpress.com/2013/04/30/re
gistros/, https://es.wikipedia.org/wiki/Intel_8086_y_8088
 Analice como se multiplican valores en lenguaje ensamblador:
https://tutoasm-emu8086.jimdo.com/asm-emu8086/instrucciones-
b%C3%A1sicas/

Actividades. Ahora puede continuar con sus ejercicios de clase y con la tarea
4. Es importante mencionar que este documento no forma parte del material
compartido para la materia, y ha sido desarrollado para facilitar la programación
para los alumnos.

Si tiene dudas adicionales, asista a las open class programadas semana a


semana.

También podría gustarte