IntroduccionEmu8086-Part 2
IntroduccionEmu8086-Part 2
Cada microprocesador proporciona las instrucciones para E/S de los dispositivos que se unen a él,
ej. el teclado y la pantalla.
Los 8086 proporciona las instrucciones in para la entrada y out para la salida. Estas instrucciones
son absolutamente complicadas de utilizar, así que en lugar de esto, utilizamos generalmente el sistema
operativo para hacer E/S.
El sistema operativo proporciona una gama de los subprogramas de E/S, en mucho de la misma
manera que una biblioteca extensa de subprogramas disponibles para el programador de C. En C, para
realizar una operación de E/S, llamamos un subprograma usando su nombre para indicar sus operaciones,
ej. putchar(), printf(), getchar(). Además podemos pasar un parámetro al subprograma, por ejemplo se
pasa como parámetro el caracter que será mostrado por el putchar() ej. putchar(c).
En el lenguaje ensamblador debemos tener un mecanismo para llamar al sistema operativo para
que realice E/S. Además debemos poder decir al sistema operativo qué clase de operación de E/S
deseamos realizar, ej. leer un caracter del teclado, exhibir un carácter o una secuencia en la pantalla o para
hacer E/S en el disco.
En el lenguaje ensamblador 8086, no llamamos subprogramas del sistema operativo por nombre,
en vez de esto, utilizamos un mecanismo de interrupción del software.
Las señales de una interrupción ordenan al procesador suspender su actividad actual (es decir su
programa corriendo) y de pasar control a un programa del servicio de la interrupción (es decir parte del
sistema operativo).
Una interrupción del software es generada por un programa (en oposición con una generada por el
hardware).
La instrucción interna 8086 genera una interrupción del software.
Utiliza un solo operando que es un número que indica qué subprograma del MSDOS debe ser
invocado.
Salida de Caracteres:
La tarea aquí es mostrar un solo carácter en la pantalla. Hay tres elementos implicados en realizar
esta operación usando la instrucción int:
1- Especificamos el caracter que se mostrará. Esto es hecho almacenando el código ASCII del
caracter en un registro específico del 8086. En este caso utilizamos el registro del d1, es decir
utilizamos el d1 para pasar un parámetro al subprograma de la salida.
2- Especificamos cuáles de los subprogramas de E/S del MSDOS deseamos utilizar. El
subprograma para mostrar un caracter es el subprograma número 2h. Este número se almacena en
el registro ah.
3- Solicitamos al MSDOS para realizar la operación de E/S usando la instrucción interna. Esto
significa que interrumpimos nuestro programa y transferimos control al subprograma del MSDOS
que hemos especificado usando el registro ah.
Introducción a la Programación 8086: 2016
Licenciatura en Análisis de Sistemas Informáticos -Unae
Ejemplo 1: Escriba un fragmento de código para mostrar el caracter ' a ' en la pantalla:
Versión en C:
putchar( „a„ ) ;
Versión en 8086:
mov dl, „a„ ; dl = „a„
mov ah, 2h ; subprograma de caracter de salida
int 21h ; llama al caracter de salida del ms-dos
Como puedes ver, esta tarea simple es absolutamente complicada en lenguaje ensamblador.
Entrada de Caracteres:
La tarea aquí es leer un solo caracter del teclado. Hay también tres elementos implicados en la
ejecución el caracter de entrada:
1- Así como para el caracter de salida, especificamos cuáles de los subprogramas de E/S del MSDOS
deseamos utilizar, es decir el caracter de entrada del subprograma del teclado. Este es el
subprograma numero 1h del MSDOS. Este número se debe almacenar en el registro ah.
2- Llamamos al MSDOS para realizar la operación de E/S usando la instrucción int para la salida del
caracter.
3- El subprograma del MSDOS utiliza el registro al para almacenar el caracter que lee del teclado.
Versión en C:
c = getchar();
Versión en 8086:
mov ah, 1h ; subprograma de entrada del teclado
int 21h ; caracter de entrada
; carácter es almacenado en a1
mov c, a1 ; copia el caracter de a1 a c
El ejemplo siguiente combina dos los anteriores, leyendo un carácter del teclado y exhibiéndolo.
Versión en C:
c = getchar();
putchar( „c„ ) ;
Versión en 8086:
mov ah, 1h ; subprograma de entrada del teclado
int 21h ; caracter de entrada
; carácter es almacenado en a1
mov d1, a1 ; copia el caracter a d1
mov ah, 2h ; subprograma de salida de carácter
int 21h ; muestra el caracter en d1
Un programa completo:
Ahora estamos en una posición para escribir un programa completo 8086. Debes utilizar un
editor para incorporar el programa en un archivo. El proceso de usar el editor (editar) es una forma básica
de procesamiento de textos. Esta habilidad no tiene ninguna importancia en la programación.
Utilizamos los programas de MASM y del ACOPLAMIENTO de Microsoft para montar y unir
programas del lenguaje ensamblador 8086. Los archivos del programa de MASM deben tener nombres con
la extensión (3 caracteres después del período) asm. Llamaremos nuestro primer programa prog1.asm, en
el mostramos la letra ' a ' en la pantalla. (puedes utilizar cualquier nombre que desees. Es una buena idea
elegir un nombre de archivo significativo). Habiendo ingresado y guardado el programa usando un editor,
debes entonces utilizar los comandos de MASM y del ACOPLAMIENTO para traducirlo al código
máquina y poder ejecutarlo, y es como sigue:
Si tienes errores de sintaxis, obtendrás mensajes de error de estos puntos. Después tienes que
editar tu programa, corregirlo y repetir el comando anterior, osino para proceder al comando de
acoplamiento, presiona RETURN en respuesta a los avisos para los archivos desde el masm o el
acoplamiento.
Para ejecutar el programa, incorpora simplemente el nombre del programa y presiona enter:
C> prog1
a
C>
Las primeras tres líneas del programa son comentarios para dar el nombre del archivo que contiene
el programa, explican su propósito, dan el nombre del autor y la fecha en la que el programa fue escrito.
Las primeras dos directivas, .model y .stack se refieren a cómo tu programa será almacenado en
memoria y que tamaño de pila requiere. La tercera directiva, .code, indica donde las instrucciones de
programa (es decir el código del programa) comienzan.
Por el momento, sé suficiente para decir que necesitas comenzar todos los programas en el
lenguaje ensamblador en un formato particular (no necesariamente como el formato dado arriba).
Tu programa debe también acabar en un formato particular, la directiva del final indica donde
acaba tu programa.
En el centro se encuentra el código que tu mismo escribes.
Debes también especificar donde comienza tu programa, es decir cual es la primera instrucción a ser
ejecutada. Éste es el propósito de la etiqueta, start.
(nota: Podríamos utilizar cualquier etiqueta, ej. begin en lugar de start).
Esta misma etiqueta es también usada para la directiva end. Cuando un programa ha acabado, volvemos al
sistema operativo.
De la misma manera que al realizar una operación de E/S, esto también es logrado usando la
instrucción int. En este tiempo se utiliza el subprograma de ms-dos número 4c00h.
Este es el subprograma para terminar un programa y volver al MSDOS. Por lo tanto, aquí están
las instrucciones:
; <nombre de archivo>.asm:
; Author:
; Date:
.model small
.stack 100h
.code
start:
; < tu codigo va aqui >
mov ax, 4c00h ; retorna a ms-dos
int 21h
end start
Para escribir un nuevo programa, introduces tu código en el lugar apropiado según lo indicado arriba.
Ejemplo 3.10: Escribe un programa que lee un caracter desde el teclado y lo muestra en pantalla.
Si se asume que se introduce la letra ' B ' en el teclado cuando ejecutes el programa, la salida
aparecerá como sigue:
C> prog2
BB
C>prog4
?B B
Nota: En este ejemplo debemos ahorrar el caracter introducido (lo ahorramos en bl) de modo a utilizar el ax
para el número del subprograma de la exhibición.
Ejemplo 3.12: Modifica el programa anterior de modo que el caracter que entrara, se exhibe en la línea
siguiente, como se indica seguidamente
C> io4
?x
x
En esta versión, necesitamos hacer salir los caracteres del retorno del carry y de la línea de avance:
El retorno (Carriage Return ASCII 13D) es el caracter de control para traer el cursor al
comienzo de una línea.
La linea de avance(Line-feed ASCII 10D) es el caracter de control que trae el cursor abajo a la
línea siguiente en la pantalla.
(utilizamos el CR de las abreviaturas y el LF para referir a retorno y a line-feed en comentarios.)
En programas de C y de Java utilizamos el carácter ' \n ' del newline para generar una nueva línea
que en efecto cause un retorno y un linefeed que se transmitirán a su pantalla.
String de salida:
La primera versión utiliza el método de idiomas de alto nivel e incluye simplemente la secuencia
en comillas. Éste es el método preferido.
La segunda versión define una secuencia especificando una lista de las constantes de caracter que
forman el String
La tercera versión define una secuencia especificando una lista de los códigos ASCII que forman
el String.
Podemos también combinar los métodos antedichos para definir una secuencia como en el ejemplo
siguiente:
El mensaje de la secuencia contiene ' hola mundo ' seguido por el retorno (ASCII 13), el line-feed
(ASCII 10) y el carácter de ' $ '.
Este método es muy útil si deseamos incluir caracteres de control (tales como return) en una
secuencia.
Terminamos la secuencia con el carácter de ' $ ' porque hay un subprograma del MSDOS (número
9h) para exhibir secuencias que espera que la secuencia sea terminada por el carácter de ' $ '.
Es importante entender que el db no es una instrucción del lenguaje ensamblador. Es llamada
directiva.
Una directiva dice al ensamblador para hacer algo, cuando se traduce tu programa a codigo
maquina.
Introducción a la Programación 8086: 2016
Licenciatura en Análisis de Sistemas Informáticos -Unae
La directiva del DB dice a ensamblador que almacene unos o más bytes en una posición de
memoria nombrada. De los ejemplos antedichos, las localizaciones nombradas son version1, version2,
version3 y mensaje. Estos son en efecto, variables String.
Para exhibir un String debemos saber dónde comienza y termina.
El principio de la secuencia es dado obteniendo su dirección usando al operador compensado.
El extremo de una secuencia puede ser encontrado conociendo la longitud de la secuencia o
almacenando un carácter especial en el extremo de la secuencia que actúa como centinela.
Hemos utilizado ya los subprogramas del MSDOS para el carácter E/S (número 1h para leer un
solo carácter del teclado y número 2h para exhibir un carácter en la pantalla.)
Salida de Strings:
El MSDOS proporciona el subprograma número 9h para mostrar los String que son terminados
con el carácter de ' $ '. Para utilizarlo debemos:
El código siguiente ilustra cómo el String “hola mundo”, seguido por los caracteres de la retorno y
del line-feed, puede ser exhibido.
Escriba un programa para exhibir el mensaje “hola mundo” seguido por retorno y line-feed:
En este ejemplo, utilizamos la directiva .data. Se requiere esta directiva cuando las variables de la
memoria se utilizan en un programa.
Las instrucciones:
se tratan de variables de la memoria que tienen acceso y deben ser utilizadas con los programas
que utilizan variables de la memoria. Vea el libro de textos para la información adicional.
El operador offset permite que tengamos acceso a la dirección de una variable. En este caso, lo
utilizamos para tener acceso a la dirección del mensaje y almacenamos esta dirección en el registro dx.
El subprograma 9h puede tener acceso al mensaje del string (o a cualquier string), una vez que se
haya pasado la dirección en que comenzaba el string.
Ejercicios:
1- Escriba un programa para mostrar „MS-DOS‟ usando (a) caracter de salida y (b) string de salida
2- Escriba un programa para mostrar el mensaje ' Ding! ¡Ding! Ding!' y código ASCII 7 de salida
tres veces. (el código 7 del ASCII es el carácter del belio. ¡Produce en tu maquina un beep!
Introducción a la Programación 8086: 2016
Licenciatura en Análisis de Sistemas Informáticos -Unae
3- Escriba un programa para producir un beep (señal sonora), mensaje '?' como aviso, lea un
carácter y exhíbalo en una nueva línea.
Nota: Los subprogramas se definen después del código para terminar el programa, pero antes de la
directiva del final.
Si pusiéramos los subprogramas anterior en el código, serían ejecutados sin ser llamado (la
ejecución bajaría a través en ellos). Esto no se debe permitir que suceda.
C> sub
Enter a character: x
You entered: x
; y mostrar el carácter
; Author: Joe Carthy
; Date: March 1994
.model small
.stack 100h
.data
Introducción a la Programación 8086: 2016
Licenciatura en Análisis de Sistemas Informáticos -Unae
Por ejemplo si deseamos utilizar el CR de los nombres y LF, para representar los códigos ASCII
del retorno y line-feed, podemos utilizar este directorio para hacerlo:
CR equ 13d
LF equ 10d
MAX equ 1000d
MIN equ 0
El ensamblador, substituye todas las ocurrencias del CR por el número 13 antes de que el
programa se traduzca al lenguaje maquina. Realiza los reemplazos similares para las otras constantes.
Esencialmente, el directorio del equ proporciona una facilidad de la substitución del texto. Una
sola pieza del texto (CR) es substituida por otro pedazo del texto (13), en su programa. Tal facilidad es a
menudo llamada a la facilidad macro.
Utilizamos constantes para hacer nuestros programas más fáciles leer y entender.
Ejemplo 3,18: El programa, exhibe el mensaje “Hello world” y usa la directiva equ
ret
end start