Está en la página 1de 11

Tres programas bsicos en ensamblador del 8086

Autor: Profesor No Amir Rodrguez Olivares

Introduccin
Este manual presenta una breve introduccin a la programacin en ensamblador
para el microprocesador de 16 bits 8086. Este manual se apoya de una serie de
recursos en lnea de otros autores, con lo cual se enriquece ms la informacin
disponible. El procedimiento para generar un conocimiento se basa en los
siguientes pasos:

1. Se muestra la descripcin de la funcin que desarrolla el programa.


2. Se presenta un cdigo, 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 descripcin de puntos importantes del cdigo.
4. Se solicita al estudiante anotar los comentarios necesarios al programa.
5. Se presentan una serie de actividades que ayudan a mejorar la
comprensin del programa.

Ejercicio 1. Impresin de texto en pantalla

Funcin. El siguiente programa presenta el texto en pantalla Mi primer


programa:

Fig. 1 Ejercicio 1

Programa 1. El cdigo que genera el texto es el mostrado a continuacin:

.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 cdigo en el emulador para que valide el mensaje de texto


mostrado.

Descripcin. 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 cdigo objeto. En el programa 1 las directivas estn
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 lneas de cdigo explicando cul es la


funcin de cada una. Para realizar los comentarios de la mejor manera posible,
apyese de las siguientes ligas de informacin:

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 cdigo 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 llmelo Ejemplo1_v1, y modifquelo conforme al


programa 1 versin 1 y trate de predecir cmo se ver el texto en el monitor al
correr el programa y comprelo con el mostrado en la Fig. 2.

Programa 1 versin 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, versin 2

El cdigo no aparece totalmente en la parte superior izquierda debido a las lneas


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

Ahora copie el programa y llmelo Ejemplo1_v2, y trate de predecir cmo se


ver el texto en el monitor al correr el programa.

Programa 1 versin 2: Impresin 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 lnea$'

.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 versin 2, en la lnea sombreada en color amarillo para


poner al final de la lnea el signo de pesos $, corra el programa y los siguientes
puntos del programa:

Qu funcin 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

Funcin. El siguiente programa espera la captura de un nmero, el programa


es una adaptacin 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 nmeros 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 cdigo para facilitar la comprensin.
Declara a texto 1 y a texto 2, si=0

Espera un caracter, y crgalo 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 cdigo es el mostrado a continuacin:

;-------------------------------------------------------
;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 Carcter 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 cdigo en el emulador para que valide el funcionamiento del


programa.

Descripcin. 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


interrupcin 21h, para mayor informacin 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


instruccin cmp. https://www.alpertron.com.ar/INST8088.HTM

Con el valor 9h cargado en la interrupcin 21h, y utilizando offset es


posible imprimir variables por separado tomadas de la seccin .Data.
Comentarios. Analice los comentarios realizados en el cdigo, y relacinelos
con el diagrama de flujo.

Actividades. Ahora copie el programa y llmelo Ejemplo2_v1, y modifquelo


para que ahora el programa almacene cualquier carcter excepto los nmeros
del 0 al 9.

Fig. 4 Pantalla del ejemplo 2 versin 1.

Ahora compare su cdigo con el Ejemplo2_v1 mostrado a continuacin.

;-------------------------------------------------------
;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 Carcter ledo

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


conversin a octal

Funcin. El siguiente programa espera la captura de un nmero de mximo 3


digitos, el programa es una adaptacin 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 nmeros 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 cdigo que genera el texto es el mostrado a continuacin:

;-------------------------------------------------------
;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
;-------------------------------------------------------
;Cdigo
.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 Carcter 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
;Impresin 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 aadir 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 cdigo en el emulador para que valide el funcionamiento.

Descripcin. En este tercer ejercicio se utilizan mltiples registros e


instrucciones para poder realizar la conversin de decimal a octal. El
pseudocdigo 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 gurdalo, y ve al
paso 2, si no es un nmero, solo ve al paso 2.
Paso 5: Limpia la pantalla
Paso 6: Imprime el texto1 y el nmero adquirido.
Paso 7: Quita el signo de pesos al vector de nmeros
Paso 8: Convierte cada uno de los dgitos que tienen un valor ascii a su
valor binario y multiplcalos por su valor posicional, y smalos, para tener
en un solo registro, el acumulado en binario de los dgitos ingresados.
Paso 9: Secciona en paquetes de 3 bits al registro acumulado, y gurdalo
en un vector sumndole 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 relacinelos con


el pseudocdigo, para entender algunas de las operaciones ms importantes, se
le sugiere consultar en la red los siguientes tpicos muy importantes.

El valor numrico del ASCII 0, 1 hasta el 9, apyese de


http://www.elcodigoascii.com.ar/
Cules son las funciones bsicas 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 programacin
para los alumnos.

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


semana.