%
% GSE 1994.
% Arquitectura de Computadores.
% Practica 1. Introduccion al ensamblador. 1994-1995.
%

\typeout{}
\typeout{Arquitectura de Computadores. Pract1. Intro al ensamblador.}
\typeout{}

\documentstyle[twoside]{IEEEtran}

\begin{document}

\title{Pr\'actica 1. Introducci\'on al ensamblador. Instrucciones y directivas.}
\author{}
\markboth{Pr\'actica 1. Introducci\'on al ensamblador.}{Pr\'actica 1. Introducci\'on al ensamblador.}
\maketitle

\section{Archivos fuente.}

Son todos los documentos ASCII, que contienen el texto del programa.
Normalmente se identifican por su extensi\'on {\bf .ASM} para el Macroassembler de
Microsoft, y Turbo Assembler de Borland. El sistema ASM86 de Intel, usa como
extensi\'on {\bf .SRC}. Un programa fuente en ensamblador consiste en una serie de 
l\'{\i}neas de instrucci\'on. En estas l\'{\i}neas, se pueden distinguir cuatro 
campos:

\begin{enumerate}
 \item Campo de s\'{\i}mbolo. Tambi\'en se le llama, campo de etiqueta, "label".
       Una etiqueta, (...depende del ensamblador) debe tener menos de 31
       caracteres. Se terminar\'a en {\bf :} (dos puntos) si afecta a una 
       instrucci\'on. No se terminar\'a en {\bf :} si se trata de una
       "pseudoinstrucci\'on".

 \item Campo de c\'odigo de operaci\'on. Donde se indica la operaci\'on a ejecutar.
 \item Campo de operando o direcci\'on.
 \item Campo de comentarios.\newline
\end{enumerate}

\noindent La siguiente, puede ser una l\'{\i}nea de un programa.

\footnotesize
\begin{verbatim}

ETIQUETA OPERACION OPERANDO COMENTARIO
======== ========= ======== ==============================
VIP:     MOV       AH,76    ;Codigo de un servicio del DOS

\end{verbatim}
\normalsize

Donde {\bf MOV} es el c\'odigo de operaci\'on, {\bf AH} es operando destino y 
{\bf 76} el operando fuente. Los operandos fuente y destino deben ir separados 
por una coma. De los cuatro campos anteriores, s\'olo el campo de operaci\'on es 
obligatorio. Este campo puede contener:
\begin{enumerate}
 \item una instrucci\'on del microprocesador o 
 \item una directiva para el programa ensamblador.
\end{enumerate}

El campo de operaci\'on, es el \'unico que ser\'a procesado por el programa ensamblador para generar el "c\'odigo m\'aquina".

\section{Instrucciones.}

Llamaremos instrucci\'on a cada operaci\'on elemental del
microprocesador. (Unas 115 para el 8086). Cada instrucci\'on, en lenguaje
ensamblador se representa por unas letras llamadas "mnem\'onico" del c\'odigo de
operaci\'on. Estos c\'odigos de operaci\'on pueden tener entre dos a cinco letras
que identifican la operaci\'on a realizar. Por ejemplo {\bf DIV} es el 
nm\'onico que representa al c\'odigo de operaci\'on de divisi\'on aritm\'etica, 
e {\bf INC} identifica al c\'odigo de operaci\'on de un incremento.

\section{Operandos.}

Algunas instrucciones (no todas) del 8086, contendr\'an este campo.
Si el c\'odigo de operaci\'on viene a representar una acci\'on, el campo del
operando, determinar\'a sobre qu\'e  se har\'a esa acci\'on. En lenguaje ensamblador, los operandos pueden ser:

\begin{enumerate}
 \item Un componente de la CPU (un registro o un "puerto").
 \item Una posici\'on de memoria.
 \item Un valor (inmediato).
\end{enumerate}

Por ejemplo, el operando de la instrucci\'on {\bf MOV AH,76} especifica el
registro {\bf AH} de la CPU y un valor inmediato {\bf 76}. Cuando esta
instrucci\'on se ejecute, se "cargar\'a" el valor {\bf 76} dentro del registro
{\bf AH}. Evidentemente, no todas las instrucciones necesitan un operando 
expl\'{\i}cito. Por ejemplo, {\bf AAA} (ASCII Adjust for Addition) es una 
instrucci\'on empleada para efectuar una forma determinada de suma y que s\'olo 
afecta al contenido del registro {\bf AL}, por lo que no es necesario especificarlo. 
Por esto, la instrucci\'on {\bf AAA} no tiene campo de operando. Una "coma" 
(delimitador) separa el campo operando en dos partes, destino y fuente, cuando 
exista, y sean distintos. No todas las instrucciones tendr\'an distinto origen y 
destino. Por ejemplo: {\bf INC AL} es una instrucci\'on, que incrementa en uno el
contenido del registro {\bf AL}.

\section{Directivas.}

Las directivas son instrucciones para controlar el "programa ensamblador". Por
lo tanto, dependiendo del programa ensamblador que estemos usando, emplearemos
uno u otro repertorio de directivas. Ver la diferencia entre instrucci\'on y 
directiva, la primera es un "comando" sobre un elemento hardware, mientras que la 
segunda es un comando sobre un elemento software. Las instrucciones est\'an 
determinadas por las caracter\'{\i}sticas del microprocesador, mientras que las
directivas, depender\'an y ser\'an distintas de acuerdo con el programa ensamblador 
que estemos usando. Por ejemplo, la siguiente declaraci\'on, contiene la directiva 
{\bf DB} (Define Bytes):

\footnotesize
\begin{verbatim}

SALUDOS              DB                'Hola , mi nombre es DB$'

\end{verbatim}
\normalsize

La palabra {\bf SALUDOS}, es el nombre de la variable de cadena, cuyo fin se
indica con el caracter {\bf \$}. La cantidad de directivas de los programas 
ensambladores, cada vez es mayor. Actualmente el Turbo Assembler, admite unas... 220 directivas. !` El doble del repertorio de instrucciones del 8086 !. Tan importante es conocer el repertorio de instrucciones, como el de directivas. Afortunadamente, las
principales de directivas son "casi" iguales para los ensambladores mas
usados. (Esto es cierto s\'olo para las fundamentales, ya que continuamente, los
fabricantes aumentan el numero de directivas, agregando "conjuntos propios"
que dificultan la "transportabilidad" de sus programas). Usaremos solo las 
principales, que iremos comentando seg\'un las vamos usando. Una de las directivas es {\bf .8086} que indica al ensamblador que utilice
s\'olo instrucciones de este microprocesador. De acuerdo con la "compatibilidad
ascendente" de la familia Intel, cualquier programa escrito usando s\'olo
instrucciones del 8086, se ejecutar\'a correctamente en cualquier otro
microprocesador posterior (un 80486 por ejemplo). Las etiquetas son simplemente "marcadores de posici\'on" en un programa en ensamblador. Igual que los nombres de las variables, las etiquetas son usadas por los programas ensambladores para definir una posici\'on en el programa. Una diferencia entre nombre de variable y etiqueta es que la primera se usar\'a para identificar datos, mientras que la segunda, marca posiciones del c\'odigo objeto del programa. Las etiquetas, deben terminar en dos puntos ({\bf :})
. En el siguiente fragmento, {\bf DOS EXIT} es una etiqueta.

\footnotesize
\begin{verbatim}

; ********************************
;           SALIDA AL DOS
; ********************************
DOS_EXIT:	MOV AH,76 ; Codigo de peticion de servicio al DOS.
		MOV AL,0  ; No devolver codigo de error.
		INT 21H   ; Sale al DOS.

\end{verbatim}
\normalsize

Evidentemente, el fragmento anterior, se puede escribir tambi\'en:

\footnotesize
\begin{verbatim}

; ********************************
;           SALIDA AL DOS
; ********************************
DOS_EXIT:	MOV AX,4C00H ; AX <- 16 bits. (AX= conjunto de AH y AL).
		INT 21H

\end{verbatim}
\normalsize

\section{Identificadores.}

Tanto los nombres de las variables, como las etiquetas, se consideran
"identificadores". La sintaxis para los identificadores, var\'{\i}a seg\'un el programa ensamblador. Las siguientes caracter\'{\i}sticas, son v\'alidas para la mayor\'{\i}a de los
programas comerciales.

\begin{enumerate}
 \item Un identificador, puede tener letras y n\'umeros, pero el primer car\'acter
       debe ser una letra o un s\'{\i}mbolo.

 \item La mayor\'{\i}a de los ensambladores convierten las letras 
       min\'usculas en
       may\'usculas, por lo que {\bf Saludos} y {\bf SALUDOS} 
       representan la misma variable. En el caso del TASM, se puede hacer que 
       el ensamblador sea "sensible" al tama\~no de las letras (s\'{\i}mbolos).
       (Opciones {\bf /ml}, {\bf /mx} y {\bf /mu}).

 \item Los s\'{\i}mbolos, actualmente admitidos por los ensambladores son 
       muchos (m\'as de 30 en el MASM). No obstante, los programadores que
       escriben fuentes facilmente transportables a distintos ensambladores, 
       incluidos los mas elementales (QA, FastA, etc,) limitan el empleo de 
       s\'{\i}mbolos a los cinco siguientes:  {\bf ? \_ @ \$ .}.

 \item Los espacios son caracteres ilegales, ya que son usados por el
       ensamblador para detectar el final de un identificador. Por otro lado,
       es necesario que cada campo est\'e separado de otro sucesivo por al menos
       un espacio.
\end{enumerate}

\section{Segmentos y procedimientos.}

En definitiva, un programa se compone de una serie de instrucciones, lo cual
se denomina de forma simple: c\'odigo. La direcci\'on del principio del segmento de c\'odigo, es la almacenada en el registro {\bf CS} (Code Segment). Al ensamblador hay que indicarle donde empieza el segmento de c\'odigo, y donde termina. Esto \'ultimo, se realiza con la l\'{\i}nea {\bf CODE ENDS} (final del segmento de c\'odigo). Los distintos procedimientos (subprogramas) de un programa, se identifican por un nombre. Por ejemplo {\bf SUMA} es el nombre del procedimiento incluido en el fragmento de progra
ma siguiente. Adem\'as del nombre, se debe indicar al ensamblador, si este
procedimiento puede compartir el mismo segmento de c\'odigo que el procedimiento
anterior (directiva {\bf NEAR}), o bi\'en, que hay que cambiar de segmento.
(directiva {\bf FAR}). Esta \'ultima directiva es muy importante, ya que es 
aconsjable utilizar la directiva {\bf FAR} cuando el programa posee sus propios 
segmentos de c\'odigo y distintos a los que maneja el DOS. El fin de un 
procedimiento, se indicar\'a mediante {\bf ENDP} [procedimiento]. Por ejemplo:

\footnotesize
\begin{verbatim}

CODE SEGMENT    ; Principio del segmento de codigo
SUMA PROC FAR   ; Un procedimiento calificado FAR con el 
                ; criterio indicado en el parrafo anterior.
MOV DL,5
ADD DL,3        ; En DL se realiza la suma 5+3

ADD DL,48       ; Es una conversion a ASCII.(Los codigos
                ; numericos comienzan a partir de 48)

MOV AH,2
INT 21H         ; Llamada al servicio 2,de la INT 21,para visualizar
                ; en pantalla, el caracter contenido de DL
SUMA  ENDP
CODE  ENDS
END nombre_programa_principal

...........
...........

\end{verbatim}
\normalsize

\section{Estructura de un programa.}

Si observamos el listado de un programa en ensamblador, veremos que "lo
normal".... es que aparezca dividido en tres a\'ereas distintas.

\footnotesize
\begin{verbatim}

        STACK   SEGMENT stack
                ....
                ....
        STACK   ENDS

        DATA    SEGMENT
                ....
                ....
        DATA    ENDS

        CODE    SEGMENT
                ....
                ....
        CODE    ENDS

\end{verbatim}
\normalsize

Estas tres areas, estan asociadas a la estructura de memoria de los
microprocesadores 80x86. La palabra {\bf SEGMENT} que aparece en las tres areas,
se refiere a la "memoria segmentada" que es una caracteristica de los sistemas
80x86.

\begin{enumerate}
 \item {\bf Area de datos.}
       Es en este espacio donde los programadores situan las
       variables num\'ericas y constantes, textos de los mensajes, cadenas de
       caracteres, etc, y reservan espacio para datos generados por el usuario
       o por el mismo programa al ser ejecutado.

 \item {\bf Area de c\'odigo.}
       Esta parte, contiene sentencias con las instrucciones que debe ejecutar
       el microprocesador. Con otras palabras, el area de c\'odigos contiene las
       operaciones que lleva a cabo el programa.

 \item {\bf Area de stack.}
       En todos los sistemas 80x86, el stack es una estructura auxiliar
       localizada en una posici\'on reservada dentro de la memoria principal. Su
       modo de funcionamiento corresponde a una estructura de almacenamiento
       tipo LIFO (Last In First Out). Se usa para el almacenamiento temporal
       de direcciones de memoria y datos. Una interesante caracteristica del
       stack es que es establecida por el programador, pero que tambi\'en es
       usada por el microprocesador y por el software del sistema. No todos
       los programas tienen su propia area de stack.Ver que en el area de 
       stack, aparece la directiva {\bf DB} de esta forma:

       \footnotesize
       \begin{verbatim}

DB      1024 DUP (?) ; El Stack por defecto es de 1k byte.

       \end{verbatim}
       \normalsize

       La palabra {\bf DUP} (Duplicate) le comunica al ensamblador que repita
       1024 veces el caracter encerrado entre parentesis. Por lo tanto, se
       crear\'a un area de stack de 1 KByte, que inicialmente estar\'a lleno de
       simbolos {\bf ?}.

\end{enumerate}

\section{Uso de la plantilla.}

Ya que los programas en ensamblador deben estar bien estructurados, es \'util
disponer de un programa plantilla, que nos ayude y que nos sirva de base para
cualquier otro programa.

\section {Servicios BIOS y MS-DOS.}

Tanto la BIOS (Basic Input/Output System) de cualquier "compatible", como el
MS-DOS, ofrecen numerosos "servicios" muy \'utiles para el programador. Estos
servicios son directamente accesibles en ensamblador, simplificando el uso de
subrutinas en un programa. El programa {\bf intro.ASM} usa dos servicios del MS-DOS. El primero es el servicio n\'umero 9 de la interrupci\'on 21H que es empleado para sacar por pantalla un mensaje que termina con el caracter {\bf \$}. Este servicio DOS, requiere que el programa que lo use, establezca un "puntero" al elemento que contiene el principio del mensaje que debe presentar (en otras palabras, hay que poner
en uno de los registros punteros la direcci\'on efectiva del principio del
mensaje). Para saber la direcci\'on efectiva del principio del mensaje, usaremos
la instrucci\'on {\bf LEA} (Load Effective Address).

\footnotesize
\begin{verbatim}

LEA DX, SALUDOS ; Hace que DX sea un puntero que senhale la
                ; direccion efectiva del principio del trozo etiquetado SALUDOS

\end{verbatim}
\normalsize

Una vez inicializado el puntero hacia el mensaje, el programa debe informar
al MS-DOS sobre cual es el servicio requerido. Esto se hace con la instrucci\'on:

\footnotesize
\begin{verbatim}

MOV AH,9        ; Carga en AH el numero del servicio solicitado.

\end{verbatim}
\normalsize

Finalmente, el programa debe acceder al servicio MS-DOS. En los compatibles
IBM, el mecanismo mediante el cual se accede a los servicios MS-DOS, se
denomina "interrupci\'on software". La siguiente sentencia, es usada para
acceder a los servicios MS-DOS.

\footnotesize
\begin{verbatim}

INT 21H         ; Se transfiere el control al MS-DOS Interrupcion 21H

\end{verbatim}
\normalsize

Los microprocesadores 80x86 tienen un total de 256 interrupciones software.
Alguna de estas interrupciones son usadas por elementos hardware y otras son
t\'{\i}picas subrutinas de utilidad general. (Muchas tienen un uso reservado para
futuras aplicaciones). Para servicios de MS-DOS se han dedicado varias de estas interrupciones, la m\'as \'util de ellas es la 21H. Bajo esta interrupci\'on, actualmente se disponen en las \'ultimas versiones del DOS de m\'as de 100 servicios distintos. El ejemplo siguente, es un programa que emplea "directivas estandar".
Mas adelante se ver\'a detalladamente las diferencias entre las directivas
estandar y simplificadas.

\section{Programa ejemplo.}

\footnotesize
\begin{verbatim}

;********************* intro.ASM ******************************
; TITULO:intro.ASM
; AUTOR:
; FECHA:
; MODIFICADO:
; Descripcion del programa:
;  1.Inicializa el segmento de datos.
;  2.Visualiza un mensaje usando el servicio numero 9 de la 
;    interrupcion 21H.
,  3.Devuelve el control al MS-DOS usando el servicio 76 de 
;    la interrupcion 21H.

DOSSEG          ; Directiva, para que se use una ordenacion de 
                ; segmentos Intel.
.MODEL SMALL    ; Tamanho del modelo (se usa con directivas 
                ; simplificadas)
.8086           ; Usar instrucciones para este microprocesador.

;************************** SEGMENTO DE STACK *****************
STACK SEGMENT PARA STACK 'Stack'
DB       100H DUP (?)   ;se indica el tamanho de la zona de pila
STACK ENDS

;************************ SEGMENTO DE DATOS *******************
DATA SEGMENT WORD 'Data'
SALUDOS           DB 'Tu primer programa en ensamblador',13,10,'$'
DATA ENDS

;*********************** SEGMENTO DE CODIGO  *****************
CODE SEGMENT WORD 'CODE'
     ASSUME CS:Code, DS: DATA

ENTRADA:
; Se inicializa el segmento de datos para que el programa pueda 
; acceder a los datos almacenados usando el registro de segmento DS.
MOV AX,DATA          ; La direccion del seg de datos se carga en AX
MOV DS,AX            ; y en DS

;************************** PROGRAMA ******************************
LEA DX,SALUDOS
MOV AH,9
INT 2lH

;************************ SALIDA AL DOS ***************************
SALIDA:
MOV AH,76            ; Peticion de servicios al DOS
MOV AL,0             ; No devolver error
INT 21H              ; Salir al DOS (Interrupcion 21 Hexa)

CODE ENDS

END ENTRADA          ; Se indica la etiqueta en la que el programa 
                     ; comenzo.

\end{verbatim}
\normalsize

\section {Desarrollo de la practica.}

\begin{enumerate}
 \item En la "memoria de la practica" el alumno contestar\'a a las siguientes
       preguntas. (dentro del archivo ASCII llamado {\bf R.txt})
       \begin{enumerate}
         \item ?` Con qu\'e otro nombre se conoce al c\'odigo de operaci\'on ?.
         \item ?` Cu\'ales son las diferencias entre instrucciones y directivas ?.
       \end{enumerate}
       Una vez entendido el funcionamiento del programa {\bf INTRO.ASM} lo ejecutar\'a
       y comprobar\'a. ?` Eres capaz de eliminar el mensaje de aviso ?. ?` Tienes
idea de que significa la directiva PARA ?.

 \item Escribir un programa que muestre en pantalla el siguente mensaje:

       \footnotesize
       \begin{verbatim}

ALUMNO/A: Aqui debe aparecer los apellidos y nombre.
D.N.I...: el numero del alumno/a.

       \end{verbatim}
       \normalsize

\end{enumerate}

(Ayuda: Los n\'umeros 10 y 13 que apompa\~nan al mensaje...sirven para algo.)
El programa se llamar\'a {\bf INTRO.EXE} y {\bf INTRO.ASM} ...el fuente.

\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}

