%
% GSE 1994.
% Arquitectura de Computadores.
% Practica 2. Uso de procedimientos. 1994-1995.
%

\typeout{}
\typeout{Arquitectura de Computadores. Prac 2. Uso de procedimientos.}
\typeout{}

%\documentstyle[12pt,twocolumn,twoside]{IEEEtran}
\documentstyle[twoside]{IEEEtran}
%\documentstyle[7pt,twocolumn,technote,twoside]{IEEEtran}

%\documentstyle[11pt]{article}

\begin{document}

\title{Pr\'actica 2. Uso de procedimientos.}
\author{}
\markboth{Pr\'actica 2. Uso de procedimientos.}{Pr\'actica 2. Uso de procedimientos.}
\maketitle

\section{Introducci\'on.}
En esta pr\'actica aprenderemos una nueva forma de especificar los segmentos mediante
una macro construida en el para el TASM. Estudiaremos la forma de crear
procedimientos y como llamarlos. Esto nos ayudar\'a a estructurar un poco nuestros
programas y a ver el concepto de variables locales al procedimiento. Tendremos que
decidir la forma de paso de par\'ametros (mediante pila o mediante registros) y
que pasa con las variables locales que queremos almacenarlas sobre registros.
Tambi\'en usaremos nuevos servicios de MS-DOS y de la BIOS de nuestra computadora. 

\section{Programa ejemplo.}

\footnotesize
\begin{verbatim}

;TITULO:P21.asm (Este debe ser el nombre del programa, que haga el alumno)
;FECHA:
;AUTOR:
;Descripcion del programa:
;Se trata de un ejemplo muy elemental,pensado para que los alumnos que no
;tienen experiencia en crear programas en ensamblador, aprendan instrucciones
;y procedimientos fundamentales. El programa, pide que se pulse una tecla
;numerica, y presenta en pantalla el valor binario del numero introducido.
;Operaciones nuevas que debe aprender:
;1- Obtencion de caracteres desde el teclado.
;2- Convertir caracteres en codigo ASCII a binario.
;3- Analizar y mostrar bits.
;Este ejemplo, usa directivas cortas para el Turbo Assembler.
;Ensamblandolo ...[TASM P21.asm] y enlazando solo [Tlink P21]
;no debe aparecer NINGUN MENSAJE DE ERROR.
.MODEL SMALL
.8086
;-------------------------Segmento de Datos---------------------------
.DATA
MENSAJE_PRIMERO      DB 10,13,07, 'Pulse un numero: $'
MENSAJE_SEGUNDO      DB OAH,ODH,  'Su valor binario es: $'
                        ;Recordar que 0AH = 10 = Avance de linea
                        ;             0DH = 13 = Retorno de carro
                        ;             07H = Tono (Bell...de los teletipos)
;------------------------Segmento de Codigo---------------------------
.CODE
;-------------------------Inicializacion------------------------------
ENTRADA_PRINCIPAL:
;Inicializa el registro DS, para que el programa pueda accceder
;a los datos contenidos en ese segmento.
        MOV AX, @DATA ; Esta forma solo es valida,si antes se ha
                      ; definido el modelo.
        MOV DS, AX
;----------------Muestra en pantalla el primer mensaje----------------
;Se muestra el mensaje,almacenado en el segmento de datos, usando el
;servicio del DOS numero 9 de la interrupcion 21H.(Recordar que el
;mensaje debe terminar el signo dolar: $.
        LEA DX,MENSAJE_PRIMERO ;La direccion contenia en DX señala
                               ;el principio del mensaje.
        MOV AH, 9              ;Servicio solicitado
        INT 21H
;----------------Espera la pulsacion de la tecla----------------------
;El programa usa el servicio numero 0 del BIOS. Interrupcion 16
;servicio,retorna en AL, el codigo ASCII de la tecla pulsada.
        MOV AH,O        ; Servicio solicitado
        INT 16H         ; Transferimos el control al BIOS.
;-----------------------convirtiendolo a binario----------------------
;Este programa, presupone que la tecla pulsada seria una numerica,
;de valor comprendido entre 0 y 9 .El valor ASCII seria convertido a
;binario restando 30H
        SUB AL,30H
;------------------Muestra el segundo mensaje------------------------
;AL contiene un valor que debemos guardar
        PUSH AX         ;Guardamos AL en la zona de Stack.
;y mostramos el segundo mensaje.
        LEA DX, MENSAJE SEGUNDO
        MOV AH, 9
        INT 21H
        POP AX           ;Recuperamas el valor desde el stack
;---------------- Presentacion del valor binario --------------------
;Los bits, van a ser examinados desde la izquierda---->hacia la derecha
;Si detectamos que es un 1 ,escribiremos un UNO, en caso contrario,
;un CERO
        MOV AH, AL ;Los bits de AL los pasamos a AH, ya que necesitamos AL
                   ;para quardar los caracteres que debemos representar
                   ;en pantalla.
        MOV CX, 4  ;Activamos el "CONTADOR DEL BUCLE" Para contar 4 bits.
COMPROBAR_BIT_IZQUIERDO:
        TEST    AH,00001000B    ; Testeamos el bit 3.
        JNZ     BIT_IZQUIERDO_UNO
;en este punto, el bit 3 (recordar que el mas bajo es el bit 0) no es UNO.
        MOV AL,'0'       ;Caracter que bebemos presentar
        CALL PRESENTA_EN_PANTALLA
        JMP SIGUIENTE_BIT
;Display un 1 si el bit numero 3 es UNO.
BIT_IZQUIERDO_UNO:
        MOV AL,'1'               ;Caracter a representar
        CALL PRESETA_EN_PANTALLA ;Llamada al procedimiento local
SIGUIENTE_BIT:
        SHL AH,1   ;Los bits en AH son desplazados hacia la
                   ;izquierda un lugar.
        LOOP COMPROBAR_BIT_IZQUIERDO
SALIDA_AL_DOS:
        MOV AX,4C00h
        INT 21H
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx PROCEDIMIENTOS xxxxxxxxxxxxxxxxxxxxxxxxxxx
PRESENTA_EN_PANTALLA PROC      NEAR
; Es un procedimiento para para presentar caracteres usando el servicio 14
; de la BIOS ------ INTERRUPCION 10H.
; Entrada al procedimiento             AL= Caracter ASCII a representar.
; Salida del procedimiento -Nada-      AX es conservado
        PUSH AX         ; Guardamos AX en el Stack
        MOV AH, 14      ; Servicio solicitado
        INT 10H
        POP AX          ; Recuperamos AX desde el Stack.
        RET             ; Fin del procedimiento
PRESENTA_EN_PANTALLA ENDP
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        END      ENTRADA_PRINCIPAL

\end{verbatim}
\normalsize
        
\section{Ejercicio Propuesto.}

Basandose en el ejemplo anterior, el alumno dise\~nar\'a un programa que haga lo siguiente:

\begin{enumerate}
\item Al ejecutarse, aparecer\'a en pantalla los dos Apellidos y Nombre del alumno.
\item A continuaci\'on, solicitar\'a que se pulse una tecla.
\item Si la tecla pulsada coincide con la inicial del primer apellido, en pantalla aparecer\'a su valor
en representaci\'on binaria (solo CEROS y UNOS) del ASCII correspondiente a la letra inicial.
En caso de pulsarse una tecla que no corresponda a la inicial, en pantalla debe aparecer el
mensaje: "Esa no es la inicial de mi apellido" (y un tono de error :beep)
\end{enumerate}

El programa fuente se debe llamar {\bf P21.asm} y {\bf P21.exe} el ejecutable.

\section*{Ap\'endice A: Pantalla de ayuda del turbo assembler.}

La siguente ventana de ayuda, aparece al teclear {\bf TASM /h} o {\bf TASM /?}

\footnotesize
\begin{verbatim}

Turbo Assembler Version 2.02 Copyright (c) 1988, 1990 Borland International

Syntax: TASM [options] source [,object] [,listing] [,xref]

OPCIONES:
/a,/s         Alphabetic or Source-code segment ordering.
              Controla la forma en que el ensamblador escribe segmentos dentro del archivo objeto (.OBJ)
              Algunos Linkers (enlazadores) necesitan que los segmentos esten en orden alfabetico. (No el TLink)
/c            Generate cross-reference in listing.
              En el archivo de listado, apareceria una colunna, haciendo referencia-cruzada sobre las 
	      etiquetas, variables,etc.
/dSYM[=VAL]   Define symbol SYM = 0, or = value VAL
/e,/r         Emulated or Real floating-point instructions.
              La opcion /e indica que sean emuladas,las capacidades de los coprocesadores (8087 al 80387).
              Son necesarias unas librerias matematicas de emulacion, que no vienen incluidas en TASM.
/h,/?         Aparece esta pantalla de ayuda.
/iPATH        Search PATH for include files
/jCMD         Jam in an assembler directive CMD (eg. /jIDEAL).
              Permite que una determinada directiva pueda ser establecida desde el DOS.
/kh#          Hash table capacity # symbols
/l,/la        Se crearia un archivo de listado (.LST): l=normal, la=expanded listina
/ml,/mx,/mu   Case sensitivity on symbols: ml=all, mx=globals, mu=none
/mv#          Set maximum valid length for symbols
/m#           Se indica el numero m de pases, para resolver posibles referencias.
/n            Suppress symbol tables in listing
/o,/op        Generate overlay object code, Phar Lap-style 32-bit fixups
/p            Check for code segment overrides in protected mode
/q            Suppress OBJ records not needed for linking
/t            Suppress messages if successful assembly
/w0,/wl,/w2   Set warning level: w0=none, wl=w2=warnings on.
              Para establecer el nivel de los AVISOS. A los novatos se recomienda un nivel maximo.
/w-xxx,/w+xxx Disable (-) or enable (+) warning xxx
/x            Include false conditionals in listing
/z            Display source line with error message.
              En pantalla aparecer1a la linea del fuente, que produce el mensaje de ERROR.
/zi,/zd       Debug info: zi=full, zd=line numbers only. La opcion /zi es la aconsajada para el principiante.

\end{verbatim}
\normalsize

\section*{Ap\'endice B: Resumen de servicios del DOS (Interrupci\'on 21h).}

\footnotesize
\begin{verbatim}

    Funcion      
HEX.       DEC.  Descripcion
===        ===   ===================================================
00H         0    Terminar
01H         1    Entrada de un caracter con eco
02H         2    Salida de un caracter
03H         3    Entrada auxiliar
04H         4    Salida auxiliar
05H         5    Salida por impresora
06H         6    Entrada/salida directa por teclado/consola
07H         7    Entrada directa sin eco por teclado
08H         8    Entrada por teclado sin eco
09H         9    Salida de una cadena de caracteres
0AH         10   Entrada por teclado con buffer
0BH         11   Comprobar el estado del teclado
0CH         12   Vaciar el buffer del teclado, leer del teclado
0DH         13   Vaciar los buffers del disco
0EH         14   Seleccionar la unidad de disco
0FH         15   Abrir un fichero
10H         16   Cerrar un fichero
11H         17   Encontrar la primera entrada de directorio que concuerde
12H         18   Encontrar la sig. entrada de directorio que concuerde
13H         19   Borrar un fichero
14H         20   Lectura secuencial
15H         21   Escritura secuencial
16H         22   Crear un fichero
17H         23   Renombrar un fichero
19H         25   Obtener disco actual
IAH         26   Establecer el area de transferencia del disco
IBH         27   Obtener informacion de la unidad por defecto
ICH         28   Obtener informacion de la unidad especificada
21H         33   Leer un registro aleatorio
22H         34   Escribir un registro aleatorio
23H         35   Obtener el tamaño del fichero
24H         36   Establecer el campo de registro aleatorio del FCB
25H         37   Establecer el vector de interrupcion
26H         38   Crear un nuevo prefijo de segmento de programa (PSP)
27H         39   Leer registros aleatorios
28H         40   Escribir registros aleatorios
29H         41   Analizar el nombre de un fichero
2AH         42   Obtener la fecha
2BH         43   Establecer la fecha
2CH         44   Obtener hora
2DH         45   Establecer la hora
2EH         46   Establecer el indicador de verificacion
2FH         47   Obtener la direccion del DTA
30H         48   Obtener el numero de version del DOS
31H         49   Terminar y quedar residente
33H         51   Obtener/establecer el indicador de Ctrl-C
35H         53   Obtener el vector de interrupcion
36H         54   Obtener espacio libre en el disco
38H         56   Obtener/establecer informacion dependiente del pais
39H         57   Crear un directorio
3AH         58   Borrar un directorio
3BH         59   Cambiar el directorio activo
3CH         60   Crear un fichero
3DH         61   Abrir un fichero
3EH         62   Cerrar un fichero
3FH         63   Leer desde un fichero o dispositivo
40H         64   Escribir en fichero o dispositivo
41H         65   Borrar un fichero
42H         66   Mover el puntero del fichero
43H         67   Obtener/establecer los atributos del fichero
44H         68   IOCTL: Control de E/S para dispositivos
45H         69   Duplicar el handle
46H         70   Forzar la duplicacion del handle
47H         71   Obtener el directorio activo
48H         72   Asignar un bloque de memoria
49H         73   Liberar un bloque de memoria
4AH         74   Cambiar el tamaño de un bloque de memoria
4BH         75   Cargar y ejecutar un programa
4CH         76   Terminar con codigo de retorno
4DH         77   Obtener el codigo de retorno
4EH         78   Encontrar la primera entrada de directorio que concuerde
4FH         79   Encontrar la siguiente entrada de directorio que concuerde
54H         84   Obtener el indicador de verificacion
56H         86   Renombrar un fichero
57H         87   Obtener/establecer la fecha y la hora del fichero
58H         88   Obtener/establecer una estrategia de asignacion de memoria
59H         89   Obtener informacion extendida de un error
5AH         90   rear un fichero transitorio
5BH         91   Crear un fichero nuevo
5CH         92   Bloquear/desbloquear la region de un fichero
5EH         94   Nombre de la maq. de la red y configuracion de la impresora
5FH         95   Redireccionamiento de la red
62H         98   Obtener la direccion del PSP
65H        101   Obtener informacion extendida del pais
66H        102   Obtener/establecer la pagina de codigo global
67H        103   Establecer la cuenta del handle
68H        104   Resguardar un fichero

\end{verbatim}
\normalsize

\section*{Ap\'endice C: Resumen de servicios de la ROM-BIOS.}

\footnotesize
\begin{verbatim}
                      INT
                   ==========
Objeto             Hex.   Dec  Servicio  Descripcion
=================  ===    ===  ========  ==================================
Imprimir pantalla  05H      5    NiA     Volcado de pantalla a la impresora
Video              10H     16    00H     Establecer el modo de video
Video              10H     16    01H     Establecer el tamaño del cursor
Video              10H     16    02H     Establecer la posicion del cursor
Video              10H     16    03H     Leer la posicion del cursor
Video              10H     16    04H     Leer la posicion del lapiz optico
Video              10H     16    05H     Establecer la pagina de visualizacion activa
Video              10H     16    06H     Deslizar la ventana hacia arriba
Video              10H     16    07H     Deslizar la ventana hacia abajo
Video              10H     16    08H     Leer caracter y atributo
Video              10H     16    09H     Escribir caracter y atributo
Video              10H     16    0AH     Escribir caracter
Video              10H     16    0BH     Establecer paleta de 4 colores
Video              10H     16    0CH     Escribir pixel
Video              10H     16    0DH     Leer pixel
Video              10H     16    0EH     Escribir caracter en modo teletipo
Video              10H     16    0FH     Obtener el modo de video actual
Video              10H     16    10H     Interfaz de la paleta de color EGA/VGA
Video              10H     16    11H     Interfaz del generador de caracteres EGA/VGA
Video              10H     16    12H     "Seleccion alternativa" EGA/VGA
Video              10H     16    13H     Escribir cadena de caracteres
Video              10H     16    1AH     Leer/esc. el codigo de combinacion de visualizacion
Video              10H     16    1BH     Informacion de operatividad de estado
Video              10H     16    ICH     Salvar/restaurar estado de video
Configuracion      11H     17    N/A     Obtener configuracion del equipo
Memoria            12H     18    N/A     Obtener el tamaño de la memoria base (en KB)
Disco              13H     19    00H     Reset del sistema de disco
Disco              13H     19    01H     Obtener el estado del disco
Disco              13H     19    02H     Leer sectores del disco
Disco              13H     19    03H     Escribir sectores del disco
Disco              13H     19    04H     Verificar sectores del dico
Disco              13H     19    05H     Formatear pista del disco
Disco              13H     19    06H     Formatear pista del disco y activar indicadores de sector defectuoso
Disco              13H     19    07H     Formatear la unidad comenzando en un cilindro especificado
Disco              13H     19    08H     Obtener los parametros de la unidad actual
Disco              13H     19    09H     Inicializar las tablas de parametros del disco duro
Disco              13H     19    0AH     Leer largo
Disco              13H     19    0BH     Escribir largo
Disco              13H     19    0CH     Buscar un cilindro
Disco              13H     19    0DH     Reset alternativo del disco
Disco              13H     19    10H     Test para unidad preparada
Disco              13H     19    11H     Recalibrar unidad
Disco              13H     19    14H     Diagnosticos del controlador
Disco              13H     19    15H     Obtener tipo de disco
Disco              13H     19    16H     Cambio de estado del diskette
Disco              13H     19    17H     Establecer tipo de diskette para formateo
Disco              13H     19    18H     Establecer tipo de media para formateo del diskette
Disco              13H     19    19H     Aparcar las cabezas
Disco              13H     19    1AH     Formatear unidad ESDI
Puerto serie       14H     20    00H     Inicializar el puerto serie
Puerto serie       14H     20    01H     Enviar un caracter
Puerto serie       14H     20    02H     Recibir un caracter
Puerto serie       14H     20    03H     Obtener el estado del puerto serie
Puerto serie       14H     20    04H     Inicializar el puerto serie extendido
Puerto serie       14H     20    05H     Control del puerto serie extendido
Sistema            15H     21    00H     Encender el motor del casete
Sistema            15H     21    01H     Apagar el motor del casete
Sistema            15H     21    02H     Leer bloques de datos
Sistema            15H     21    03H     Escribir bloques de datos
Sistema            15H     21    21H     Leer/escribir anotaciones de error POST
Sistema            15H     21    4FH     Intercepcion del teclado
Sistema            15H     21    80H     Dispositivo abierto
Sistema            15H     21    81H     Dispositivo cerrado
Sistema            15H     21    82H     Terminacion de programa
Sistema            15H     21    83H     Comenzar/cancelar el contador de intervalos de tiempo
Sistema            15H     21    84H     Soporte de joystick
Sistema            15H     21    85H     Pulsacion de la tecla Sys Req
Sistema            15H     21    86H     Esperar durante un intervalo especificado
Sistema            15H     21    87H     Mover datos en modo protegido
Sistema            15H     21    88H     Obtener el tamaño de la memoria extendida
Sistema            15H     21    89H     Cambiar a modo protegido
Sistema            15H     21    90H     Dispositivo ocupado
Sistema            15H     21    91H     Interrupcion completa
Sistema            15H     21    C0H     Obtener los parametros de la configuracion del sistema
Sistema            15H     21    C1H     Obtiene el segmento de datos del BIOS extendido
Sistema            15H     21    C2H     Interfaz del dispositivo apuntador
Sistema            15H     21    C3H     Activar/desactivar el contador de alarma
Sistema            15H     21    C4H     Interfaz de la seleccion de opcion programable
Teclado            16H     22    00H     Leer el siguiente caracter del teclado
Teclado            16H     22    01H     Informar si hay caracter preparado
Teclado            16H     22    02H     Obtener el estado de cambio
Teclado            16H     22    03H     Establecer el ratio y el retardo del typematic
Teclado            16H     22    05H     Escribir en el huffer del teclado
Teclado            16H     22    10H     Leer teclado extendido
Teclado            16H     22    11H     Estado del teclado extendido
Teclado            16H     22    12H     Estado de cambio extendido
Impresora          17H     23    00H     Envia un byte a la impresora
Impresora          17H     23    01H     Inicializar la impresora
Impresora          17H     23    02H     Obtener el estado de la impresora
BASIC              18H     24    N/A     Pasar control al BASIC de la ROM
Lanzador           19H     25    N/A     Rearrancar el ordenador
Hora               1AH     26    00H     Leer la cuenta actual del reloj
Hora               1AH     26    01H     Establecer la cuenta actual del reloj
Hora               1AH     26    02H     Leer el reloj de tiempo real
Hora               1AH     26    03H     Establecer el reloj de tiempo real
Hora               1AH     26    04H     Leer la fecha del reloj de tiempo real
Hora               1AH     26    05H     Establecer la fecha del reloj de tiempo real
Hora               1AH     26    06H     Establecer la alarma
Hora               1AH     26    07H     Desactivar la alarma
Hora               1AH     26    09H     Obtener el estado y la hora de la alarma

\end{verbatim}
\normalsize

\begin{thebibliography}{1}
\bibitem{Guia}
  Peter Norton, Richard Wilton, \newline
  {\em Gu\'{\i}a del Programador para el IBM PC y PS/2}, \newline
  Microsoft Press - Anaya Multimedia, 1988, \newline
  ISBN: 84-7614-226-9.

\bibitem{Turbo}
 {\em Turbo Assembler User and Reference Guide}. \newline
 Borland International, inc.

\end{thebibliography}

\def\mes{\ifcase\number\month\or Enero\or Febrero\or Marzo\or Abril\or Mayo\or Junio\or Julio\or Agosto\or Septiembre\or Octubre\or Noviembre\or Diciembre\fi}

\section*{Autores.}
\noindent {\em Vicente Gonz\'alez Ruiz.}\newline
{\em Jose Antonio Mart\'{\i}nez Garc\'{\i}a.}\newline
{\em Jos\'e Fern\'andez Vadillos.}\newline
Departamento de Arquitectura de Computadores y Electr\'onica.\newline
Universidad de Almer\'{\i}a.\newline
04120 La Ca\~nada de San Urbano, s/n.\newline
Almer\'{\i}a.

\bigskip
\small
GSE. Este documento fu\'e interpretado con {\LaTeX} el d\'{\i}a {\number\day} de {\mes} de {\number\year}.


\end{document}

