lab arqui 3 2013a

Upload: jesussierra

Post on 02-Nov-2015

249 views

Category:

Documents


1 download

DESCRIPTION

Lab Arqui 3 2013A

TRANSCRIPT

Arquitectura de Computadoras -Laboratorio

Laboratorio 03

NDICE

INDICE1introduccion2tamao de datos2almacenamiento de datos2registros2registros de propsito general4registro indice4registro apuntadores4registros de bandera4registros de segmentos5registros apuntador de instrucciones6acceso a memoria y a puertos6segmentacion6MODOS DE DIRECCIONAMIENTO8DIRECCIONAMIENTO INMEDIATO.9DIRECCIONAMIENTO A REGISTRO.91DIRECCIONAMIENTO DIRECTO.

01DIRECCIONAMIENTO DE REGISTRO INDIRECTO.

11DIRECCIONAMIENTO DE REGISTRO INDIRECTO CON DESPLAZAMIENTO

11DIRECCIONAMIENTO DE REGISTRO INDIRECTO CON UN REGISTRO BASE Y UN REGISTRO NDICE

21DIRECCIONAMIENTO DE REGISTRO INDIRECTO CON UN REGISTRO BASE Y UN REGISTRO NDICE Y UN REGISTRO CONSTANTE.

21PROGRAMACIN EN LENGUAJE ENSAMBLADOR

31Creacin de Archivos Fuente

41Procedimientos en ensamblador

61Procedimiento para exhibir nmeros decimales en el monitor

6Esqueleto de un programa en ensamblador18Obtener la suma de 10 datos y desplegar el resultado en la pantalla.19

conjunto de instrucciones del 8088/8086 20bibliografia45ENSAMBLADOR 8088/8086, direccionamiento y programacion, juego de instrucciones INTEL (Windows y Linux Ubuntu)INTRODUCCIN El lenguaje ensamblador como cualquier lenguaje de programacin es un conjunto de palabras

que le indican al ordenador lo que tiene que hacer. Sin embargo la diferencia fundamental es que

cada instruccin escrita en lenguaje ensamblador tiene una correspondencia exacta con una

operacin en el procesador. Por lo que son operaciones muy sencillas tales como: Cargar 32 en

el registro BX o Transferir el contenido del registro CL al CH. As pues, las palabras del lenguaje

ensamblador son nemotcnicos que representan el cdigo mquina, lenguaje que entiende el

procesador.

TAMAO DE LOS DATOS En el 8086/88 se definen los siguientes tamaos de datos:

4 bits :nibble

8 bits :byte

16 bits : word

32 bits : dword

ALMACENAMIENTO DE DATOS El 8086/88 usa el formato de almacenamiento denominado little endian, esto quiere decir que el

byte menos significativa (LSB) del dato es guardada en la parte baja de la memoria. Por ejemplo

el dato 0x1122 ser almacenado en memoria:

Es importante tener esto en cuanta a la hora de acceder a los datos para operar con ellos. REGISTROSRegistros de propsito general

AH

AL

AX (Acumulador)

BH

BL

BX (Base)

CH

CL

CX (Contador)

DH

DL

DX (Datos)

Registros ndices

SI

Source Index (ndice origen)

DI

Destination Index (ndice Destino)

BP

Base Pointer (Puntero Base)

SP

Stack Pointer (Puntero de Pila)

Registro de Bandera

-

-

-

-

O

D

I

T

S

Z

-

A

-

P

-

C

Flags (Banderas)

Registros de Segmentos

CS

Code Segment (Segmento de Cdigo)

DS

Data Segment (Segmento de Datos)

ES

ExtraSegment (Segmento Extra)

SS

Stack Segment (Segmento de Pila)

Registro apuntador de instrucciones

IP

Instruction Pointer

Modelo de los registros

Los registros del i8086 e i8088 se basaron en el diseo del Intel 8080 y el Intel 8085, y de hecho son compatibles a nivel de lenguaje ensamblador con el i8080. El conjunto de registros tambin es similar al del i8080, pero ampliados a 16 bits. Tanto el i8086 como el i8088 tienen cuatro registros de propsito general de 16 bits, que tambin pueden ser accedidos como ocho registros de 8 bits, y tienen cuatro registros ndices de 16 bits (incluyendo el puntero de pila). Los registros de datos se usan a veces de forma implcita por las instrucciones, haciendo ms difcil la organizacin de los registros para emplearlos con valores temporales.

Los registros del procesador, se usan para contener los datos con que se est trabajando ya que el acceso a los registros es mucho mas rpido que los accesos a memoria. Se pueden realizar operaciones aritmticas y lgicas, comparaciones, entre otras. Se pueden hacer estas operaciones con todos los registros excepto los de segmento, el IP, y los flags.

REGISTROS DE PROPSITO GENERALLos registros de propsito general son el AX, BX, CX, y DX, de 16 bits. Cada uno de ellos se divide en dos registros de 8 bits, llamados AH y AL, BH y BL, CH y CL, y, DH y DL, H significando Hight (alto) y L significando Low (bajo), indicando la parte alta o la parte baja del registro correspondiente de 16 bits (ver esquema). Un programa poda usar tanto los registros de 16 bits como los registros de 8 bits. Aparte del uso general de los registros para hacer clculos aritmticos y lgicos, existen instrucciones que usan estos registros con un uso particular especializado, como se indica a continuacin:

Registro AX: El registro AX es el registro acumulador, es utilizado para operaciones que implican entrada/salida, y multiplicacin y divisin (estas dos ltimas en conjunto con el registro DX)

Registro BX: El registro BX es el registro base, y es el nico registro de propsito general que puede ser un ndice para direccionamiento indexado

Registro CX: El registro CX es conocido como el registro contador. Puede contener un valor para controlar el nmero de veces que un ciclo se repite o un valor para corrimiento de bits

Registro DX: El registro DX es el registro de datos. En algunas operaciones se indica mediante este registro el nmero de puerto de entrada/salida, y en las operaciones de multiplicacin y divisin de 16 bits se utiliza junto con el acumulador AX

REGISTROS NDICELos registros SI y DI estn disponibles para direccionamiento indexado y para operaciones de cadenas de caracteres.

Registro SI: El registro ndice fuente de 16 bits es requerido por algunas operaciones con cadenas de caracteres. El SI est asociado con el segmento DS.

Registro DI: El registro ndice destino tambin es requerido por algunas operaciones con cadenas de caracteres. El DI est asociado con el segmento ES.

REGISTROS APUNTADORESLos registros SP (apuntador de pila) y BP (apuntador base) estn asociados con el registro SS y permiten al sistema acceder a datos en el segmento de la pila.

Registro SP: El apuntador de pila de 16 bits est asociado con el segmento SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que est siendo procesada en la pila. El sistema maneja de manera automtica este registro, aunque el programa puede hacer ciertas manipulaciones con l.

Registro BP: El apuntador base de 16 bits facilita la referencia de parmetros dentro de la pila.

REGISTROS DE BANDERASEs un registro de 16 bits, de los cuales nueve sirven para indicar el estado actual de la mquina y el resultado del procesamiento. Muchas instrucciones aritmticas y de comparacin cambian el estado de las banderas y apoyndose en ellas se pueden tomar decisiones para determinar la accin subsecuente.

La tabla contiene 16 posiciones (de 0 a 15), que son los 16 bits del registro de banderas, numeradas de derecha a izquierda. La posicin 0 la encontraremos a la derecha y la posicin 15 a la izquierda.

----OFDFIFTFSFZF-AF-PF-CF

Los bits de las banderas son las siguientes:

OF (overflow, desbordamiento): Indica desbordamiento del bit de mayor orden despus de una operacin aritmtica de nmeros con signo (1=existe overflow; 0=no existe overflow). Para operaciones sin signo, no se toma en cuenta esta bandera.

DF (direccin): Controla la seleccin de incremento o decremento de los registros SI y DI en las operaciones con cadenas de caracteres (1=decremento automtico; 0=incremento). La bandera DF se controla con las instrucciones STD y CLD.

IF (interrupcin): Controla el disparo de las interrupciones (1=habilita las interrupciones; 0=deshabilita las interrupciones). La interrupcin no enmascarable es la nica que no puede ser bloqueada por esta bandera. El estado de la bandera IF se controla con las instrucciones STI y CLI.

TF (trampa): Permite la operacin del procesador en modo de depuracin (paso a paso)

SF (signo): Contiene el signo resultante de una operacin aritmtica (0=positivo; 1=negativo).

ZF (cero): Indica el resultado de una operacin aritmtica o de comparacin (0=resultado diferente de cero; 1=resultado igual a cero).

AF (acarreo auxiliar): Contiene el acarreo del bit 3. Esta bandera se prueba con las instrucciones DAA y DAS para ajustar el valor de AL despus de una suma o resta BCD.

PF (paridad): Indica si el nmero de bits 1, del byte menos significativos de una operacin, es par (0=nmero de bits 1 es impar; 1=nmero de bits 1 es par).

CF (acarreo): Contiene el acarreo del bit de mayor orden despus de una operacin aritmtica; tambin almacena el contenido del ltimo bit en una operacin de desplazamiento o de rotacin.

REGISTROS DE SEGMENTODefinen reas de 64 Kb dentro del espacio de direcciones de 1 Mb del 8086. Estas reas pueden solaparse total o parcialmente. No es posible acceder a una posicin de memoria no definida por algn segmento: si es preciso, habr de moverse alguno.

Registro CS: El DOS almacena la direccin inicial del segmento de cdigo de un programa en el registro CS. Esta direccin de segmento, ms un valor de desplazamiento en el registro apuntador de instruccin (IP), indica la direccin de una instruccin que es buscada para su ejecucin. Para propsitos de programacin normal, no se necesita referenciar el registro CS.

Registro DS: La direccin inicial de un segmento de datos de programa es almacenada en el registro DS. Esta direccin, ms un valor de desplazamiento en una instruccin, genera una referencia a la localidad de un byte especfico en el segmento de datos.

Registro SS: El registro SS permite la colocacin en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS almacena la direccin de inicio del segmento de pila de un programa en el registro SS. Esta direccin de segmento, ms un valor de desplazamiento en el registro del apuntador de la pila (SP), indica la palabra actual en la pila que est siendo direccionada. Para propsitos de programacin normal, no se necesita referenciar el registro SS.

Registro ES: Algunas operaciones con cadenas de caracteres utilizan el registro extra de segmento para manejar el direccionamiento de memoria. El registro ES est asociado con el registro DI (ndice). Un programa que requiere el uso del registro ES puede inicializarlo con una direccin de segmento apropiada.

REGISTRO APUNTADOR DE INSTRUCCIONESEl registro IP de 16 bits contiene el desplazamiento de direccin de la siguiente instruccin que se ejecuta. El IP est asociado con el registro CS en el sentido de que el IP indica la instruccin actual dentro del segmento de cdigo que se est ejecutando actualmente en la memoria.

ACCESO A MEMORIA Y A PUERTOSAmbos microprocesadores tienen un rango de 65536 direcciones de entrada/salida que se pueden accesar como puertos de 8 16 bits. En la parte baja de la memoria hay 256 vectores de interrupcinEstos procesadores usaban 20 bits de direccin que les permita accesar hasta 1 MB de memoria. Sus registros internos eran de solo 16 bits, por lo que se desarroll un mecanismo usando registros de segmento para poder accesar el megabyte de memoria. El 8086 y el 8088 tenan cuatro registros de segmento de 16 bits (CS, DS, ES y SS). En lugar de suministrar los 4 bits faltantes para direccionar los 20 bits, como la mayora de los procesadores segmentados, el 8086 y el 8088 desplazan el contenido del registro de segmento 4 bits hacia la izquierda y lo suman a una direccin de memoria de 16 bits proveniente de registros ndice (BX, SI, DI, BP, SP, IP) y opcionalmente una constante, siendo el resultado la direccin efectiva. Esto suele ser considerado como un mal diseo, aunque puede ser aceptable, e incluso til en el lenguaje ensamblador. Por el contrario, provoca confusin cuando se hace un uso extensivo de los punteros (como en el lenguaje C), debido a que es posible que dos punteros con diferentes valores apunten a la misma direccin de memoria. Este esquema de segmentos se cambi en el Intel 80286 y luego en el Intel 80386.SEGMENTACIN

Clculo de la direccin efectiva mediante el uso de un segmento y un offset. El segmento (de 16 bits) se desplaza 4 bits a la izquierda (se multiplica por 16), y se le suma el registro de direccionamiento (de 16 bits), dando por resultado una direccin lineal de 20 bits.

Segmentacin de memoria del x86Haba tambin cuatro registros de 16 bits de segmento que permitan al 8086 y 8088 tener acceso a un megabyte de memoria de una manera inusual. En vez de concatenar el registro de segmento con el registro de direccin, como en la mayora de los procesadores cuyo espacio de direccin exceda su tamao de registro, el 8086 y el 8088 desplazaban el segmento de 16 bits solo cuatro bits hacia la izquierda antes de sumarlo un offset de 16 bits (16segmento + offset), produciendo una direccin externa (efectiva o fsica) de 20 bits a partir del par segmento:offset de 32 bits. Consecuentemente, cada direccin externa poda ser referida por 212 = 4096 diferentes pares segmento:offset. La separacin de 16 bytes entre las bases del segmento (debido al desplazamiento de 4 bits) fue llamada un prrafo. Aunque fue considerado complicado e incmodo por muchos programadores, este esquema tambin tena ventajas; un pequeo programa (menos de 64 KB) poda ser cargado comenzando en un offset fijo (como 0) en su propio segmento, evitando la necesidad de relocalizacin, con a lo ms 15 bytes de alineacin desperdiciados.

Los compiladores para la familia 8086 comnmente soportaban dos tipos de punteros, cerca y lejos (near y far). Los punteros near eran offset de 16 bits implcitamente asociados con el segmento del cdigo y/o de datos del programa y as podan ser usados solo dentro de partes de un programa suficientemente pequeo para caber en un segmento. Los punteros far eran pares segmento:offset de 32 bits que se resolvan en direcciones externas de 20 bits. Algunos compiladores tambin soportaban punteros enormes (huge), que eran como los punteros far salvo que la aritmtica de puntero en un puntero huge lo trataba como un puntero lineal de 20 bits, mientras que la aritmtica de puntero en un puntero huge daba vueltas (wrapped around) dentro de su offset de 16 bits sin tocar la parte del segmento de la direccin.

Para evitar la necesidad de especificar near y far en numerosos punteros, estructuras de datos, y funciones, los compiladores tambin soportan los "modelos de memoria" que especifican tamaos de puntero por defecto. Los modelos minsculo (tiny) (64K mximo), pequeo (small) (128K mximo), compacto (compact) (datos > 64K), medio (medium) (cdigo > 64K), grande (large) (cdigo y datos > 64K), y enorme (huge) (arreglos individuales > 64K), cubran las combinaciones de punteros near. far y enorme para cdigo y datos. El modelo tiny significaba que el cdigo y los datos estaban compartidos en un solo segmento, justo como en la mayora de los procesadores basados en 8 bits, y poda ser usado para construir archivos .com por ejemplo. Las bibliotecas precompiladas vinieron a menudo en varias versiones compiladas para diversos modelos de memoria.

Segn Morse y otros, los diseadores comtemplaban realmente usar un desplazamiento de 8 bits (en vez de 4 bits), para crear un espacio de direccin fsica de 16 MB. Sin embargo, pues que esto habra forzado a los segmentos comenzar lmites de 256 bytes, y, alrededor de 1976, 1 MB era considerado muy grande para un microprocesador, la idea fue descartada. Tambin, no haba suficientes pines disponibles en un paquete barato de 40 pines. En principio, el espacio de direccin de la serie x86 pudo haberse extendido en procesadores posteriores, aumentando el valor del desplazamiento, mientras las aplicaciones obtuvieran sus segmentos del sistema operativo y no hicieran asunciones sobre la equivalencia de diferentes pares segmento:offset. En la prctica el uso de punteros huge y de mecanismos similares era amplio y la direccin plana de 32 bits se hizo posible, con los registros de offset de 32 bits en el 80386, eventualmente extender el lmite del rango de direcciones en una forma ms general.Portando software viejoLos pequeos programas podan ignorar la segmentacin y solo usar la direccin plana de 16 bits. Este permita al software de 8 bits ser portado con bastante facilidad al 8086 y 8088. Los autores del MS-DOS tomaron ventaja de esto proporcionando una Interface de programacin de aplicaciones muy similar a la del CP/M as como incluyendo el simple formato de archivo ejecutable .com, idntico al del CP/M. Esto era importante cuando el 8086/8088 y el MS-DOS eran nuevos, porque permiti que muchas aplicaciones existentes de CP/M (y otros) hacerse rpidamente disponibles, facilitando grandemente la aceptacin de la nueva plataforma.

Direccin de la primera instruccin ejecutable: FFFF:0Los procesadores 8088 y 8086, por diseo de su hardware, ejecutaban su primera instruccin en la direccin FFFF:0 (16 bytes por abajo del tope de su capacidad de memoria de 1 MB con sus 20 bits de direccionamiento). En esta rea debe haber una ROM para poder ejecutar sus instrucciones al encender o reiniciar el computador (o dispositivo). En el caso del IBM PC, en esa rea estaba el IBM PC ROM BIOS, y la primera instruccin que ste ejecutaba era un salto (JMP) al inicio del cdigo del Power On Self Test (POST), donde haba cdigo para revisar el CPU y revisar e inicializar los diferentes componentes del hardware y el propio BIOS del computador, y al final se ejecutaba Boot Strap Loader, que iniciaba el Bootstrap. Los microprocesadores de la lnea x86 han heredado esta direccin de memoria (FFFF:0) para la primera instruccin ejecutable.

MODOS DE DIRECCIONAMIENTO

Generacin de la direccin de la instruccin:Todos los registros internos del 8086/8088 son de 16 bits. El bus de direccin es de 20 bits, por lo que se usa ms de un registro interno para generar la direccin de 20 bits.

Los 2 registros usados para la direccin de la instruccin son el IP y el CS. Se combinan en una forma especial para generar la direccin de 20 bits.

direccin de 20 bits = 1610 * CS + IP

Por ejemplo: Si los registros CS e IP contienen los valores:

CS = 1000H

IP = 0414 H

La direccin de 20 bits es:

1610 * 1000H + 0414H = 10000H + 0414H = 10414H

Esta es la direccin en memoria desde la cual la nueva instruccin debe buscarse.Al registro IP se le refiere como offset, el registro CS * 1610 apunta a la direccin de inicio o segmento en memoria desde el cual se calcula el offset. La Figura A muestra grficamente cmo se calcula la direccin de 20 bits.

Cada direccin generada por el 8086/8088 usa uno de los 4 registros de segmento. Este registro de segmento es recorrido 4 bits hacia la izquierda antes de ser sumado al offset.

La instruccin del CPU especfica cules registros internos se usa para generar el offset.

Vamos a ver los diferentes modos de direccionamiento tomando como ejemplo la instruccin MOV.

Instruccin MOV

Transfiere un byte desde el operando fuente al operando destino. Tiene el siguiente formato:MOVdestino, fuente

DIRECCIONAMIENTO INMEDIATO.El operando fuente aparece en la instruccin. Un ejemplo, es el que mueve un valor constante a un registro interno.

MOV AX, 568DIRECCIONAMIENTO A REGISTRO.Indica que el operando a ser usado est contenido en uno de los registros internos de propsito general del CPU. En el caso de los registros AX, BX, CX o DX los registros pueden ser de 8 a 16 bitsEjemplos:

MOV AX, BX; AX BX

MOV AL, BL; AL BL

Cuando usamos direccionamiento a registro, el CPU realiza las operaciones internamente, es decir, no se genera direccin de 20 bits para especificar el operando fuente.

DIRECCIONAMIENTO DIRECTO.Especifica en la instruccin la localidad de memoria que contiene al operando. En este tipo de direccionamiento, se forma una direccin de 20 bits.

Ejemplo:

MOV CX, COUNT

El valor de COUNT es una constante. Es usada como el valor offset en el clculo de la direccin de 20 bits

El 8086/8088 siempre usa un registro de segmento cuando calcula una direccin fsica. Cul registro se debe usar para esta instruccin? Respuesta: DS

En la Figura B, se muestra el clculo de la direccin desde la cual se tomar el dato que se carga en CX.

Cuando accedamos datos, el registro DS se usa con un offfset para calcular la direccin de 20 bits, ste es el segmento por omisin. Puede ser invalidado por usar un prefijo de segmento en la instruccin.

Ejemplo:

MOV CX, ES: COUNT

Uso del segmento de datos y una constante para desplazamiento

Este es el segmento por omisin que se usa. Sin embargo, cualquiera de los 4 segmentos puede usarse. Esto se efecta especificando el registro apropiado en la instruccin.

Por ejemplo, suponga que deseamos usar el registro ES en lugar del DS:

MOV CX, ES: COUNT

DIRECCIONAMIENTO DE REGISTRO INDIRECTO.Con el modo de direccionamiento de registro ndice, la direccin offset de 16 bits est contenida en un registro base o registro ndice. Esto es, la direccin reside en el registroBX, BP, SI o DI.

Ejemplo:

MOV AX, [SI]

El valor de 16 bits contenido en el registro SI debe ser el offset usado para calcular la direccin de 20 bits.

Otra vez, debe usarse un registro de segmento para generar la direccin final. El valor de 16 bits en SI se combina con el segmento apropiado para generar la direccin.DIRECCIONAMIENTO DE REGISTRO INDIRECTO CON DESPLAZAMIENTOEste tipo de direccionamiento incluye a los dos modos de direccionamiento anteriores. La direccin offset de 16 bits se calcula sumando el valor de 16 bits especificado en un registro interno y una constante.

Por ejemplo, si usamos el registro interno DI y el valor constante (desplazamiento), don-

de COUNT ha sido previamente definido, el nemotcnico para esta construccin es:

MOV AX, COUNT [DI]

Si:COUNT =0378H

DI =04FAH0872HEntonces, la direccin offset de 16 bits es 0872HDIRECCIONAMIENTO DE REGISTRO INDIRECTO CON UN REGISTRO BASE Y UN REGISTRO NDICEEste modo de direccionamiento usa la suma de dos registros internos para obtener la direccin offset de 16 bits a usarse en el clculo de la direccin de 20 bits.

Ejemplos:

MOV[BP] [DI], AX; el offset es BP + DI

MOVAX, [BX] [SI]; el offset es BX + SI

Este es el modo de direccionamiento ms complejo. Es idntico al modo de direccionamiento anterior, excepto que se suma una constante.

Ejemplo: Suponga que tenemos los siguientes valores en los registros:

DI =0367H

BX =7890H

COUNT =0012H

7C09H

DIRECCIONAMIENTO DE REGISTRO INDIRECTO CON UN REGISTRO BASE Y UN REGISTRO NDICE Y UN REGISTRO CONSTANTE.Este modo de direccionamiento indica que el offset especificado por la suma de DI + BX + COUNT sea usado para mover el dato en memoria en el registro AX.

MOV AX, COUNT [BX] [DI]

La direccin offset de 16 bits es 7C09H. La direccin completa en 20 bits se calcula de la expresin:

1610*DS + 7C09H

Si el DS contiene 3000H, la direccin completa de 20 bits es:

3000H + 7C09H = 37C09HPROGRAMACIN EN LENGUAJE ENSAMBLADOR

Los archivos deben terminar con la extensin ASM. Las letras minsculas trabajan

igual que las maysculas, pero durante el presente trabajo se utilizarn maysculas

para evitar confusin entre el nmero 1 y la minscula l, el 0 (cero) y la letra O.

Considrense las siguientes lneas de un programa:

.MODEL SMALL

.CODE

MOV AH, 2H

MOV DL, 2AH

INT 21H

INT 20H

END

Una H despus de cada nmero indica al ensamblador que los nmeros son

hexadecimales. Recuerde que DEBUG asume que todos los nmeros son hexadecimales

pero el ensamblador asume que todos los nmeros son decimales.

El ensamblador puede confundir nmeros con etiquetas, para evitar esto coloque

un 0 (cero) antes de un nmero hexadecimal que inicie con una letra.

Ejemplo:

MOV DL, ACH

; AC es una etiqueta

MOV DL, 0ACH

; AC es un nmero hexadecimal

Con el fin de hacer ms legibles los programas, usaremos el tabulador para el espaciado.

A las directivas del ensamblador se les llama tambin pseudo-operaciones.

Se les conoce como directivas porque en lugar de generar instrucciones, proporcionan informacin y direcciones al ensamblador. La pseudo-operacin END marca el fin del archivo fuente.

Creacin de Archivos Fuente

El ensamblador puede usar archivos fuente que contengan caracteres ASCII estndar. Considere que no todos los procesadores de texto escriben archivos en disco usando solamente los caracteres ASCII estndar. Antes de ensamblar un programa verifique que est en cdigo ASCII.

Puede ver caracteres extraos en el programa. Muchos procesadores de texto agregan informacin de formateo adicional en el archivo. El ensamblador los trata como errores. Utilice la versin no documento de su procesador de texto. Tambin se requiere una lnea en blanco despus de la instruccin END.

Para ensamblar el programa:

A>MASM PROGRAMA;

MICROSOFT MACRO ASSEMBLER VERSION 5.10

COPYRIGHT MICROSOFT CORP 1981, 1988. ALL RIGHTS RESERVED

49822 + 219323 BYTES SYMBOL SPACE FREE

0 WARNING ERRORS

0 SEVERE ERRORS

A>

El ensamblador crea un archivo intermedio *.OBJ el cual contiene nuestro programa

e informacin adicional usada por otro programa llamado LINKER .

Encadenar al archivo *.OBJ

A>LINK ARCHIVO;

Microsoft Overlay Linker Version 3.64

copyright microsoft corp 1983-1988. All rights reserved

LINK : warning L4021: No Stack Segment

Hemos creado nuestro archivo *.EXE. Ahora s necesitamos crear nuestra versin

*.COM. El archivo EXE2BIN.EXE del DOS convierte un archivo EXE a un archivo

BIN.

A>EXE2BIN ARCHIVO ARCHIVO.COM

A>

Si listamos los archivos que hemos creado, obtendramos:

A>DIR ARCHIVO.*

Volume in drive A has no label

directory of A:\

archivo.ASM 100

archivo.OBJ 200

archivo.EXE 600

archivo.COM 50

Recuerde los detalles del DEBUG.

A>DEBUG ARCHIVO.COM

- U

397F:0100 B402 MOV AH, 02

397F:0102 B22A MOV DL, 2A

397F:0104 CD21 INT 21

397F:0106 CD20 INT 20

Note que las dos primeras y la ltima lnea no aparecen en el listado. Se eliminan en la versin final del lenguaje de mquina porque son directivas y stas son para documentacin. El ensamblador toma en cuenta esta documentacin a costa de ms

lneas de cdigo.

Comentarios. Para comentar una lnea ponga el ;. Todo lo que est despus del ; el ensamblador lo considera como comentario.

Etiquetas. Pueden tener hasta 31 caracteres y pueden contener letras, nmeros y cualesquiera

de los siguientes smbolos:

interrogacin

. punto

@ arroba

_ subrayado

$ dlar

Las etiquetas no deben iniciar con un nmero decimal y el punto se utiliza solamente como el primer carcter.

Una de las principales diferencias entre el DEBUG y el ensamblador reside en las

etiquetas. Recuerde que con DEBUG debemos hacer el clculo nosotros. El ensamblador refiere a etiquetas y l calcula el desplazamiento.

Cuando ponemos : despus de una etiqueta, decimos que la etiqueta es cercana

(NEAR). El trmino NEAR tiene que ver con los segmentos.

Procedimientos en ensamblador

El ensamblador asigna direcciones a las instrucciones. Cada vez que hacemos un cambio al programa, debemos ensamblar nuevamente dicho programa. Considrese el siguiente programa:

.MODEL SMALL

.CODE

PRINT _A_J PROC

MOV DL, A

; inicia con el carcter A

MOV CX, 10

; imprime 10 caracteres

PRINT _LOOP:

CALL WRITE _CHAR ; imprime carcter

INC DL

; siguiente carcter del alfabeto

LOOP PRINT _LOOP

; continua

MOV AH, ACh

; retorna al DOS

INT 21h

PRINT _A_J ENDP

WRITE _CHAR PROC

MOV AH, 02

; activa el cdigo de la funcin para sacar CHAR

INT 21h

; imprime el carcter que est en DL

RET

; retorna de este procedimiento

WRITE _CHAR ENDP

END PRINT _A_J

PROC y ENDP son directivas para definir procedimientos. PROC define el inicio y

ENDP define el final.

En este ejemplo, tenemos 2 procedimientos; por lo tanto, necesitamos indicarle al ensamblador cul debe usar como el procedimiento principal (donde debe el microprocesador iniciar la ejecucin de nuestro programa) La directiva END indica al ensamblador cual es el procedimiento principal. El procedimiento principal puede estar en cualquier lugar del programa. Sin embargo como estamos tratando con archivos *.COM, debemos colocar primero el procedimiento principal.

NOTA: Si encuentras algn mensaje de error que no reconozcas, verifica que hayas digitado el programa adecuadamente. Si an falla, consulta el manual del ensamblador Despus, usa el DEBUG para desensamblar el programa y ver cmo el ensamblador pone los procedimientos juntos.

C> DEBUG PRINT:A_J.COM

Procedimiento para exhibir nmeros decimales en el monitor

Digitar el siguiente programa y nmbrarlo VIDEO_IO.ASM.

.MODEL SMALL

.CODE

TEST_WRITE_HEX PROC

MOV DL, 3Fh

; prueba con 3Fh

CALL WRITE_HEX

INT 20h

{MOV AH, 4Ch

TEST_WRITE_HEX ENDP ; retorna al

{DOS INT 21h

PUBLIC WRITE_HEX

;este procedimiento convierte el byte en el registro DL a hex

;y escribe los dos dgitos hexadecimales en la posicin corriente

;del cursor

; DL byte a ser convertido a hexadecimal

;usa a: WRITE_HEX_DIGIT

WRITE_HEX PROC

PUSH CX

; almacena registros usados en este procedimiento

PUSH DX

MOV DH, DL

; hacemos una copia del byte

MOV CX, 4

SHR DL, CX

CALL WRITE_HEX_DIGIT ;despliega el primer dgito hexadecimal

MOV DL, DH

; vamos con el nibble bajo

AND DL, 0Fh

; elimina el nibble alto

CALL WRITE_HEX_DIGIT ; despliega al segundo dgito hexadecimal

POP DX

POP CX

RET

WRITE_HEX ENDP

PUBLIC WRITE_HEX

;este procedimiento convierte los 4 bit menos significativos de DL a un dgito hexadecimal

;y lo escribe en la pantalla

; DL los 4 bits menos significativos contienen el nmero a ser impreso

;usa a: WRITE_CHAR

WRITE_HEX_DIGIT PROC

PUSH DX

CPM DL, 10

; es el nibble