70
M.C. Abel Díaz Olivares Lenguaje Ensamblador 1 UNIVERSIDAD AUTONOMA DE AGUASCALIENTES CENTRO DE CIENCIAS BASICAS DEPARTAMENTO DE SISTEMAS ELECTRONICOS ACADEMIA DE DIGITALES CARRERA: ING. EN SISTEMAS COMPUTACIONALES SEMESTRE: 5° PLAN DE ESTUDIOS: 2001 MATERIA: LENGUAJE ENSAMBLADOR CREDITOS: 7 HORAS T/P: 3/2 ULTIMA REVISION: ENERO 2009. REVISORES: LEAM, FJRD, ADO, ARL OBJETIVO GENERAL Introducir al estudiante a un lenguaje de bajo nivel. Al finalizar el curso, el estudiante deberá poder desarrollar una gran variedad de programas en este lenguaje los cuales serán para utilizar la computadora como una herramienta para el control de procesos e interfaces en general. EVALUACION La evaluación debe ser diagnóstica, formativa y sumaria bajo los siguientes lineamientos: 1. PARTE TEÓRICA : Se realizaran 3 exámenes escritos con la siguiente ponderación : 2 exámenes parciales 15% cada parcial 1 examen final 30% 2. PARTE PRÁCTICA: - Un trabajo final, con una ponderación del 30% - N tareas, con una ponderación del 10% NOTA 1: Para tener derecho al examen final es necesario que se entregue el proyecto final. NOTA 2: Para poder acreditar la materia es necesario aprobar la teoría tener promedio mínimo de 6 en los exámenes. NOTA 3: Lenguaje a manejar: Turbo Ensamblador PRIMERA UNIDAD: MICROPROCESADORES INTEL 80x86 Objetivo Específico : 1. Conocerá la historia de los microprocesadores, especialmente la serie 80x86 de INTEL. 2. Conocerá los registros del 8086 1. Evolución de los microprocesadores de INTEL. 2. Modelo de programación. 3. Registro del microprocesador. 4. Banderas del Registro Status. 5. Modos de direccionamiento. 6. Juego de instrucciones. 7. Organización de la memoria SEGUNDA UNIDAD: USO DEL TURBO ENSAMBLADOR Objetivo Específico : 1. Reconocerá las ventajas del Macroensamblador. 2. Escribirá programas sencillos directamente con Turbo Ensamblador. 1. Introducción al proceso de Ensamblado. 2. Estructura de programa. 3. Tipos y declaraciones. 4. Programas en línea recta. 5. Programas con lazos. 6. Problemas aritméticos. 7. Manipulación de datos. 8. Enmascaramiento con AND y OR. 9. Rotación.

Lenguaje Ensamblador 8086 Plan 2009

Embed Size (px)

Citation preview

Page 1: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

1

UNIVERSIDAD AUTONOMA DE AGUASCALIENTES CENTRO DE CIENCIAS BASICAS DEPARTAMENTO DE SISTEMAS ELECTRONICOS ACADEMIA DE DIGITALES

CARRERA: ING. EN SISTEMAS COMPUTACIONALES SEMESTRE: 5° PLAN DE ESTUDIOS: 2001

MATERIA: LENGUAJE ENSAMBLADOR CREDITOS: 7 HORAS T/P: 3/2

ULTIMA REVISION: ENERO 2009. REVISORES: LEAM, FJRD, ADO, ARL

OBJETIVO GENERAL

Introducir al estudiante a un lenguaje de bajo nivel. Al finalizar el curso, el estudiante deberá poder desarrollar una gran variedad de programas en este lenguaje los cuales serán para utilizar la computadora como una herramienta para el control de procesos e interfaces en general.

EVALUACION

La evaluación debe ser diagnóstica, formativa y sumaria bajo los siguientes lineamientos: 1. PARTE TEÓRICA : Se realizaran 3 exámenes escritos con la siguiente ponderación :

2 exámenes parciales 15% cada parcial 1 examen final 30%

2. PARTE PRÁCTICA: - Un trabajo final, con una ponderación del 30%

- N tareas, con una ponderación del 10% NOTA 1: Para tener derecho al examen final es necesario que se entregue el proyecto final. NOTA 2: Para poder acreditar la materia es necesario aprobar la teoría tener promedio mínimo de 6 en los exámenes.

NOTA 3: Lenguaje a manejar: Turbo Ensamblador

PRIMERA UNIDAD: MICROPROCESADORES INTEL 80x86

Objetivo Específico : 1. Conocerá la historia de los

microprocesadores, especialmente la serie 80x86 de INTEL.

2. Conocerá los registros del 8086

1. Evolución de los microprocesadores de INTEL. 2. Modelo de programación. 3. Registro del microprocesador. 4. Banderas del Registro Status. 5. Modos de direccionamiento. 6. Juego de instrucciones. 7. Organización de la memoria

SEGUNDA UNIDAD: USO DEL TURBO ENSAMBLADOR

Objetivo Específico : 1. Reconocerá las ventajas del

Macroensamblador. 2. Escribirá programas sencillos

directamente con Turbo Ensamblador.

1. Introducción al proceso de Ensamblado. 2. Estructura de programa. 3. Tipos y declaraciones. 4. Programas en línea recta. 5. Programas con lazos. 6. Problemas aritméticos. 7. Manipulación de datos. 8. Enmascaramiento con AND y OR. 9. Rotación.

Page 2: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

2

TERCERA UNIDAD: INTERFASE CON EL PUERTO PARALELO

Objetivo Especifico: Realizará interfaces sencillas con la computadora utilizando el puerto paralelo.

1. Ubicación del puerto paralelo. 2. Puerto Base, el puerto de salida. 3. Puerto Base +1 el puerto de entrada. 4. Puerto Base +2 el puerto E-S.

CUARTA UNIDAD: MANEJO DE PUNTO FLOTANTE

Objetivo Especifico: 1. Reconocerá la importancia del

manejo del punto flotante, en aplicaciones reales.

2. Escribirá programas en

ensamblador que manipulen

dispositivos, con punto flotante

1. Introducción al punto fijo y punto flotante. 2. Definición nef, punto fijo, punto flotante. 3. Punto fijo. 4. Punto flotante. 5. Uso del Coprocesador Aritmético.

QUINTA UNIDAD: INTERRUPCIONES DEL DOS Y BIOS

Objetivo Especifico: 1. Utilizará las funciones del MS-DOS.

2. Escribirá programas que empleen

los servicios de video. 3. Escribirá programas en

macroensamblador que generen sonido.

1. Estructura del MS-DOS. 2. Vector de interrupciones. 3. Interrupción 21H. a. Servicio 02 Display. b. Servicio 09 Display. c. Servicio 01 Keyboard Input. d. Servicio 0AH Buffered Keyboard Input. e. Servicio 05 Printer Output. f. Servicios para lectura del reloj de tiempo real.

4. Interrupción 10H, Servicios del video. 5. Interrupciones para el puerto serie. 6. Generación de sonido enviando pulsos a la bocina. 7. Generación de sonidos usando el Timer Programable.

SEXTA UNIDAD: INTERFACE CON LENGUAJE C

Objetivo Especifico: 1. Escribirá programas en Lenguaje C

con partes en Ensamblador. 2. Escribirá programas en

ensamblador y en lenguaje C que sirvan como drivers para la pc.

1. Interface sin pase de parámetros. 2. Interface con pase de parámetros. 3. Introducción a los drives. 4. Tipos de drivers. 5. Estructura de drivers.

BIBLIOGRAFÍA

FUNDAMENTAL: 1. Lenguaje Ensamblador y Programación para PC IBM y

compatibles. Peter Abel 3 ª Edición Prentice Hall

DE APOYO: 2. Using Assembly Language.

Wyatt 3ª Edition QUE

3. Pc Interno

Tischer Marcombo

Page 3: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

3

Primera Unidad: MICROPROCESADORES INTEL 80x86

Lenguajes de alto nivel vs. Lenguajes de bajo nivel.

o Visual Basic, Delphi, Visual fox, etc.

o Fortran, Basic, Pascal, Cobol.

o Java, C.

o Ensamblador.

o Hardware.

Lenguaje Ventaja Desventaja

Visual Basic, Visual

Fox, Delphi, etc.

Mejor presentación, buena relación

tiempo invertido / resultados.

Se requiere en

maquinas grandes.

Fortran, Basic, Pascal,

Cobol.

Balance adecuado entre complejidad y

facilidades del usuario. Realizados para

programar.

Dedicación especial a

ramas de la ciencia.

Java, C. Existe facilidad de crear nuevos

comandos.

Requiere ser

programador.

Ensamblador. Los lenguajes son cortos y rápidos.

Brecha semántica reducida. Todos los

recursos del sistema están disponibles.

No es transportable.

1. La evolución del microprocesador.

La historia dice que los antiguos babilonios empezaron a usar el ábaco (calculadora

primitiva hechas con esferas ahuecadas), alrededor del año 500 a.c. con el tiempo esta

calculadora, estimulo a la humanidad para perfeccionar una maquinaria calculadora en que

se utilizaba engranes y ruedas (Blas Pascal en 1642). Se continuaron los progresos con las

gigantescas maquinarias computadoras de las décadas de 1940 y 1950, construidos con

relevadores y tubos de vacío (bulbos). Más adelante se utilizaron los transistores y los

componentes electrónicos de estado sólido para construir las poderosas computadoras de la

década de 1960. Con el advertimiento de los circuitos integrados se llego al

perfeccionamiento del microprocesador y de los sistemas de microcomputadoras.

Más

amigable

con el

usuario,

facilidad de

programar.

Velocidad en

procesamiento

de instrucciones

Page 4: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

4

AÑO COMENTARIO 1671 Blas Pascal, inventa una maquina que hace sumas y restas.

1701 Gottfried wilhen Von Leibnitz, desarrolla una maquina que multiplica y divide.

1800 Jacquard, desarrolla una tejedora programable con tarjetas perforadas.

1834 Charles Babbage, concibe la maquina analítica con 4 secciones: almacén (memoria), Taller

(cpu), sección de entrada y sección de salida.

1943 Alan Touring crea la Colossus, la primera computadora, usaba bulbos y era de propósito militar.

1946 Eckert y Mauchely, en la universidad de pensilvania desarrollan ENIAC I con fines de

investigación.

1960 PDP I, de la compañía DEC para fines comerciales.

1971 Intel crea 4004, primer microprocesador para Bussicom una empresa Japonesa que vende

calculadoras de bolsillo.

Evolución de los microprocesadores.

AÑO PROCESADOR No. BITS MEMORIA INSTRUCCIONES VEL

1971 4004 / 4040 4 bits 4Kb (4096) 45 instrucciones 1 MHZ

1972 8008 (20us por Instr.) 8 bits 16Kb 48 instrucciones 1 MHZ

1973 8080( micro moderno) (2us por

instrucción) Era compatible con

TTL

8 bits 64Kb 256 instrucciones 1 MHZ

1973 F-8 (Fairchild), 6502 (MOS

Tecnology), 68000 (Motorola),

Z80 (Ziling)

8 bits 64Kb 256 instrucciones 1 MHZ

1977 8085 (1.3us por instrucción),

generador de reloj, y controlador

de sistema integrado.

8 bits 64Kb 256 instrucciones 1 MHZ

1978 8086 / 8088 (400ns inst) (carac a

evolucionar mult y div)

16 bits 1Mb 2.5MIP (millones de

instrucciones por seg)

4.7 MHZ

1982 80286 16 bits 16Mb 8 MIP (millones de

instrucciones por seg)

16 MHZ

80386 32 bits 64Mb 16 MIP (millones de

instrucciones por seg)

33 MHZ

80486 32 bits 4 Gb 54 MIP (millones de

instrucciones por seg)

66 MHZ

Pentium 32 / 64 bits 4 Gb 100 MIP (millones de

instrucciones por seg)

75 MHZ

Pentium MMX 64 bits 4 Gb 233 MHZ

Tarea: Investigar las características de 12 microprocesadores y describirlas.

Page 5: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

5

El microprocesador 8086 / 8088.

Se divide en dos partes funcionales:

Execution Unit (EU- Unidad de Ejecución).

Bus Interfase Unit (BIU- Unidad de Bus de Interfase).

EU BIU

AH AL

BH BL

CH CL

DH DL

SP

BP

SI

DI

ALU

CU

Flags

CS

DS

SS

ES

Unidad

de

control

del bus.

BUS

IP

1

2

3

n

Cola de

Instrucciones

Page 6: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

6

2. El modelo de programación.

Se describe la estructura de los registros del microprocesador y se explica la forma

en que se direcciona la memoria por medio de los registros de segmentos y de los

desplazamientos de dirección.

32 bits

16 bits

AH AX AL

BH BX BL

CH CX CL

DH DX DL

SP

BP

DI

SI

Nombre

32 bits

EAX

EBX

ECX

EDX

ESP

EBP

EDI

ESI

EIP EFLAGS

NOMBRE

Acumulador

Índice base

Contador

Datos

Apuntador de pila

Apuntador de base

Índice destino

Índice fuente

Apuntador de Inst

Banderas

Código

Datos

Extra

Pila

No se le dan

nombres especiales

IP

FLAGS

CS

DS

ES

SS

FS

GS

Page 7: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

7

3. Registros del microprocesador

Registros de propósito general.

Los registros de propósito general se utilizan en la forma en que se desee el

programador. Cada registro para uso general se puede direccionar como un registro de 32

bits (EAX, EBX, ECX y EDX), como un registro de 16 bits (AX, BX, CX y DX) o como

uno de 8 bits (AH,AL,BH,BL,CH,CL,DH yDL). Se debe tener en cuenta que solo el 80386

en adelante contienen el grupo de registros de 32 bits. Las funciones principales de los

registros de propósito general incluyen:

AX (Acumulador): Es el acumulador primario, posee dos características diferentes de los

otros acumuladores. Todas las operaciones de I/O deben pasar por la parte baja (AL) de

este acumulador, las instrucciones que utilizan este registro gastan menos espacio y se

ejecutan más rápido.

BX (Base): Es un acumulador de propósito general que puede ser utilizado para calcular

direcciones, a menudo conserva la dirección base (desplazamiento) de los datos que hay en

memoria. Si la memoria es accesada con este registro los programas serán más cortos y

correrán más rápidos.

CX (Contador): Puede ser utilizado para el conteo de ciertas instrucciones para

corrimientos (CL) y rotaciones del numero de bytes (CX) para las operaciones repetidas de

cadenas y un contador (CX o ECX) para la instrucción LOOP.

DX (Datos): Las instrucciones de I/O lo utilizan para definir la dirección del periférico,

algunas multiplicaciones y divisiones también lo necesitan.

Registros apuntadores e índices.

SP (Apuntador de pila): Se utiliza para direccionar datos en una pila de memoria LIFO,

esto ocurre mas a menudo cuando se ejecutan las instrucciones PUSH y POP, cuando se

llama CALL o cuando se regresa RET de una subrutina.

BP (Apuntador de base): Es un apuntador que se utiliza para referenciar parámetros,

especialmente cuando se programa en un ambiente de múltiples lenguajes.

SI (Índice de fuente): Se emplea para direccionar datos fuente en forma indirecta para

utilizarlos con las instrucciones de cadenas o arreglos.

DI (Índice destino): Se suele emplear para direccionar datos destino en forma indirecta

para utilizarlos con las instrucciones de cadenas o arreglos.

Page 8: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

8

IP (Apuntador de instrucciones): Se utiliza siempre para direccionar a la siguiente

instrucción que va a ejecutar el microprocesador. Esta relacionado con el registro CS que es

el segmento de código. Para formar la localidad real de la siguiente instrucción se suma el

contenido de IP con CS por 10H. Corresponde al contador de programas (Program Counter

o PC) de otros microprocesadores.

Registros con segmentos.

Unos registros adicionales, a los que se da el nombre de registros de segmentos,

generan direcciones en la memoria junto con otros registros en el microprocesador. A

continuación aparece una lista de cada registro de segmento junto con su función en el

sistema:

CS (Código): El segmento de código es una sección en la memoria que tiene los programas

y procedimientos utilizados por los programas. El registro de segmento de código define la

dirección inicial de la sección de memoria que tiene el código (Es un registro de 16 bits que

define el segmento de las instrucciones).

DS (Datos): El segmento de datos es una sección en la memoria que contiene la mayor

parte de los datos utilizados por un programa, (esto datos pueden ser variables, vectores,

matrices, etc).

ES (Extra o adicional): El segmento extra o adicional de datos lo utilizan algunas

instrucciones para cadenas.

SS (Pila): El segmento de pila define la superficie de la memoria utilizada para la pila. La

ubicación del punto inicial de entrada a la pila, se determina por el registro apuntador de la

pila. El registro BP también direcciona los datos que hay dentro del segmento de pila.

FS y GS: Estos registros de segmento adicionales están disponibles en los

microprocesadores 80386 en adelante a fin de contar con dos segmentos adicionales de

memoria para acceso con los programas.

4. Banderas de Registro Status (El registro de banderas).

Las banderas indican la condición del microprocesador a la vez que controlan su

funcionamiento.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 O D I T S Z A P C

Page 9: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

9

C (Acarreo): Indica un acarreo después de una suma o un préstamo después de una resta.

La bandera de acarreo también indica condiciones de error en ciertos programas y

procedimientos. También se utiliza en algunas instrucciones de rotación y desplazamiento.

P (Paridad): Es un cero para la paridad impar y un uno para la paridad par. La paridad es

un conteo de “unos” expresado en un número par o impar. Por ejemplo, si un número

contiene 3 bits con uno binario, tiene paridad impar. Si un numero contiene cero bits de uno

se considera que paridad par.

A (Acarreo Auxiliar): Indica un acarreo después de una suma o un préstamo después de

una resta entre las posiciones de los bits 3 y 4 en el resultado. Este indicador muy

especializado se prueba con las instrucciones DAA y DAS para ajustar el valor de AL

después de una suma o resta BCD. El microprocesador, no utiliza en otra forma el bit de

bandera A.

Z (Zero): Indica que el resultado de una operación aritmética o lógica es cero. Si Z=1, el

resultado es cero, si Z=0 entonces el resultado no es cero.

S (Signo): Indica el signo aritmético del resultado después de una suma o resta. Si S=1 la

bandera de signo se activa y el resultado es negativo. Si S=0 la bandera de signo se

desactiva y el resultado es positivo. Se debe tener en cuenta que el valor de la posición del

bit más significativo se coloca en el bit de signo para cualquier instrucción que afecte las

banderas.

T (Trampa): Cuando se activa la bandera de trampa se habilita la característica de

depuración del microprocesador. Mas adelante aparecen mayores detalles de esta

característica.

I (Interrupción): Controla el funcionamiento de la terminal de la entrada de INTR

(Interrupción externa). Si I=1 se habilita la interrupción y si I=0 se deshabilita la entrada

INTR.

D (Dirección): Controla la selección de incremento o decremento de los registros DI o SI

durante las instrucciones de cadenas o arreglos. Se utiliza para indicar si las operaciones

con string se ejecutaran en forma ascendente o descendente.

O (Sobreflujo): Es una condición que ocurre cuando se suman o restan números con signo.

Un sobreflujo indica que el resultado ha excedido de la capacidad de la maquina. Por

ejemplo, si se suma un 7FH (+127) a 01H (+1) el resultado es 80H (-128). Este resultado

representa una situación de sobreflujo señalado por la bandera para la suma con signo. Para

operaciones sin signo no se toma en cuenta esta bandera.

Page 10: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

10

5. Modos de direccionamiento.

Direccionamiento Inmediato: Transfiere n bytes o palabras de datos inmediatos

hacia el registro o localidad en la memoria en el destino. Ejemplo:

MOV AL, 22H

MOV EBX, 12345678H

MOV AL, 18H

MOV BX,1998H

MOV DS, 0B70H Error, no se puede en direccionamiento inmediato, solo por registro.

MOV AX, 0B70H

MOV DS, AX

MOV DL, 0B800H Error.

MOV CX, 1

MOV CX, 0001

Direccionamiento por Registro: Transfiere bytes o palabra desde el registro fuente

o localidad de memoria, hasta el registro o localidad destino en la memoria.

Ejemplo:

MOV CX, DX

MOV AH, DH

MOV BP, BX

MOV AX, BL Error

MOV AL, BL

MOV AH, 0

CBW Convierte de byte a word, si es positivo llena de ceros, si es neg llena de 1.

Direccionamiento Directo: Transfiere bytes o palabra entre una localidad de

memoria y un registro. Ejemplo:

MOV DL, [300]

MOV DX, [200]

Motorola Intel

Big Endían Little Endian

19

98

199

1

00

01

02

98

19

199

1

00

01

02

Si se tiene el número 1998, en los procesadores

Motorola se guarda de la forma Big Endían, en

los procesadores Intel se almacena de la forma

Little Endían.

Page 11: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

11

Direccionamiento Indirecto por Registro (Base): Transfiere bytes o palabra entre

un registro y una localidad de memoria direccionada por un registro índice o base.

Ejemplo:

MOV AX, [BX]

MOV [BX], AX

Direccionamiento Base mas Índice: Transfiere bytes o palabra entre un registro y

una localidad de memoria direccionada por un registro base mas un registro índice.

Ejemplo:

MOV AX, [BX + SI]

MOV [BX + DI], CX

Direccionamiento Relativo por Registro: Transfiere bytes o palabra entre un

registro y una localidad de memoria direccionada por un registro índice o base y

además un desplazamiento. Ejemplo:

MOV AX, [BX + 4]

Direccionamiento Relativo Base más Índice: Transfiere bytes o palabra entre un

registro y una localidad de memoria direccionada por un registro base más un índice

más un desplazamiento. Ejemplo:

MOV AX, [BX + DI + 4]

Direccionamiento de Índice Escalado: Esta disponible en microprocesadores

80386 en adelante, el segundo registro de un par de ellos, el índice se modifica por

el factor de escala para generar la dirección de la memoria del operando. Ejemplo:

MOV AX, [EBX + 4*EDI]

EJERCICIOS: Determine que tipo de direccionamiento es para cada instrucción.

MOV [BX + 4], AX Relativo por registro

MOV AX, [BX + SI + 4] Relativo base mas índice

MOV [EBX + 2*ESI], AX Índice escalado

MOV AX, BX Registro

MOV AX, [1234H] Directo

MOV [BX], AX Indirecto por registro

MOV BL, 3AH Inmediato

MOV [BX + SI], AX Base mas índice

Page 12: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

12

Ejercicio: Implementar un programa en ensamblador que sume la localidad de memoria

200 y la 201, el resultado lo deje en la localidad 202.

MOV BX, 200H

MOV AL, [BX]

INC BX

MOV DL, [BX]

ADD AL, BL

INC BX

MOV [BX], AL

INT 20H

MOV AL, [200H]

MOV BL, [201H]

ADD AL, BL

MOV [202H], AL

INT 20H

MOV AL, [200H]

ADD AL, [201H]

MOV [202H], AL

INT 20H

MOV AX, [200H]

ADD AL, AH

MOV [202H], AL

INT 20H

6. Juego de instrucciones.

Las categorías de instrucciones descritas en esta sección incluyen: Transferencia de

datos, aritméticas, manipulación de bits, cadenas o arreglos, transferencia de programa, etc.

Transferencia de datos: Incluye instrucciones para transferencia de datos que transfieren

bytes, palabras o dobles palabras de datos entre la memoria y los registros así como entre el

acumulador y los puertos de E/S.

Código Operación Función

IN Mete datos al acumulador desde un dispositivo de E/S.

LAHF Carga banderas en AH.

LEA Carga la dirección efectiva.

LDS Carga DS y registro de 16 bits con los datos de memoria de 32 bits.

LES Carga ES y registro de 16 bits con los datos de memoria de 32 bits.

MOV Carga byte, palabra o doble palabra.

OUT Saca datos del acumulador a un E/S.

POP Recupera una palabra de la pila.

POPF Recupera los indicadores de la pila.

PUSH Salva las palabras en la pila.

PUSHF Salva banderas en la pila.

SAHF Carga AH en las banderas.

XCHG Intercambia bytes, palabras o dobles palabras.

XLAT Emplea AL para entrar a una tabla de conversión.

Page 13: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

13

Aritmética: Instrucciones para sumar, restar, multiplicar y dividir datos como bytes,

palabras o dobles palabras. El sistema suma y resta con el empleo de datos con signo o sin

signo y datos BCD o de ASCII. Multiplica y divide números ASCII con signo o sin signo.

Código Operación Función

AAA Ajuste ASCII para la suma.

AAD Ajuste ASCII para la división.

AAM Ajuste ASCII para la multiplicación.

AAS Ajuste ASCII para la resta.

ADD Suma datos entre registros o la memoria y otro registro.

ADC Suma datos con la bandera de acarreo.

CBW Convierte byte a palabra.

CMP Compara los datos.

CWD Convierte palabra a doble palabra.

DAA Ajuste decimal de AL después de una suma de BCD:

DAS Ajuste decimal de AL después de una resta de BCD:

DEC Decremento.

DIV División sin signo.

IDIV División con signo.

IMUL Multiplicación con signo.

INC Incrementa.

MUL Multiplicación sin signo.

SBB Resta con acarreo.

SUB Resta datos entre los registros y la memoria u otro registro.

Manipulación de bits: Se utilizan para controlar los datos hasta el nivel bits. Estas

instrucciones incluyen operaciones lógicas, corrimientos y rotaciones.

Código Operación Función

AND Y lógica.

NOT Invertir (complemento a uno).

NEG Cambia el signo (complemento a dos).

OR O inclusiva lógica.

SAR Corrimiento aritmético a la derecha.

SHL/SAL Corrimiento a la izquierda.

SHR Corrimiento lógico a la derecha.

RCL Rotación a la izquierda con acarreo.

ROL Rotación a la izquierda.

RCR Rotación a la derecha con acarreo.

ROR Rotación a la derecha.

TEST Operación con el AND lógico, pero solo afectando banderas.

XOR O exclusivo lógica.

Page 14: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

14

Instrucciones para cadenas: Se emplean para manipular cadenas de datos en la memoria.

Cada cadena consta, ya sea de bytes o de palabras y tiene hasta 64K bytes de longitud.

Código Operación Función

CMPS Comparación entre memoria y memoria.

LODS Cargar el acumulador.

MOVS Mover de memoria a memoria.

SCAS Comparación entre la memoria y el acumulador.

STOS Almacenar en el acumulador.

Transferencia de programa: Incluyen brincos, llamadas (CALL) y para retorno.

Saltos basados en datos sin signo.

JE / JZ Salta si es igual / salta si es cero

JNE / JNZ Salta si no es igual / salta si no es cero

JA / JNBE Salta si es mayor / salta si no es menor o igual

JAE / JNB Salta si es mayor o igual / salta si no es menor

JB / JNAE Salta si es menor / salta si no es mayor o igual

JBE / JNA Salta si es menor o igual / salta si no es mayor

Saltos basados en datos con signo

JE / JZ Salta si es igual / salta si es cero

JNE / JNZ Salta si no es igual / salta si no es cero

JG / JNLE Salta si es mas grande / salta si no es mas pequeño o igual

JGE / JNL Salta si es mas grande o igual / salta si no es mas pequeño

JL / JNGE Salta si es mas pequeño / salta si no es mas grande o igual

JLE / JNG Salta si es mas pequeño o igual / salta si no es mas grande

Pruebas aritméticas especiales.

JS Salta si hay signo

JNS Salta si no hay signo

JC Salta si hay acarreo

JNC Salta si no hay acarreo

JO Salta si hay sobreflujo

JNO Salta si no hay sobreflujo

JP / JPE Salta si hay paridad / salta si la paridad es impar

JNP / JPO Salta si no hay paridad / salta si la paridad es par

Page 15: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

15

7. Organización de la memoria.

El espacio de direccionamiento de un sistema basado en un microprocesador, se

denomina memoria lógica o memoria física. La estructura de la memoria lógica es

diferente, en casi todos los casos, que la estructura de la memoria física. La memoria lógica

es el sistema de memoria tal como lo ve el programador, mientras que la memoria física es

la estructura real en el hardware en el sistema de memoria.

Memoria lógica.

El espacio básico de la memoria lógica es el mismo en todos los microprocesadores

Intel. La memoria lógica se enumera por bytes. En la siguiente ilustración se observa el

mapa de memoria lógica de algunos de los miembros de la familia Intel. Se vera que la

única diferencia es que algunos miembros contienen mas memoria que otros. Además, se

debe tener en cuenta que la memoria física puede diferir de la memoria lógica en muchos

sistemas.

8 bits

1M byte

(a)

8 bits

16M bytes

(b)

8 bits

4G bytes

(c) Ilustración: El mapa de memoria lógica de los microprocesadores: (a) 8086/8088/80186 (b) 80286/80386SX (c) 80386DX y 80486

Cuando estos microprocesadores direccionan una palabra de 16 bits en la memoria,

se accesan dos bytes consecutivos. Por ejemplo, la palabra en la localidad 00122H se

almacena en los bytes 00122H y 00123H; el byte menos significativo se almacena en la

localidad 00122H. Si se accesa a una palabra de 32 bits, esta palabra doble la contiene

cuatro bytes consecutivos. Por ejemplo. La doble palabra almacenada en la localidad

00120H, se almacena en los bytes 00120H, 00121H, 00122H y 00123H; el byte menos

significativo se almacena en 00120H y el byte más significativo en 00123H.

Memoria Física.

Las memorias físicas de los miembros de la familia Intel difieren del ancho. La

memoria del 8088 es de 8 bits de ancho; las memorias 8086, 80186, 80286 y 80386SX

tienen 16 bits de ancho; las memorias del 80386dx y 80486 son de 32 bits de ancho. Para la

programación, no hay diferencia en el ancho de la memoria porque la memoria lógica

siempre es de 8 bits de ancho; pero, como se puede ver en la siguiente ilustración, hay una

diferencia para el diseñador del hardware.

FFFF

FFFE

FFFD

0002

0001

0000

FFFFFF

FFFFFE

FFFFFD

000002

000001

000000

FFFFFFFF

FFFFFFFE

FFFFFFFD

00000002

00000001

00000000

Page 16: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

16

8 bits

1M bytes

Microprocesador

8088

Banco alto

banco impar

8 bits

8M bytes

D15-D8

Banco bajo

banco par

8 bits

8M bytes

D7-D0

MICROPROCESADOR 8086 (memoria de 1M byte)

MICROPROCESADOR 80186, 80286, 80386SX

MICROPROCESADOR 80386SL (memoria de 32M byte)

Banco 3

8 bits

1G bytes

D31-D24

Banco 2

8 bits

1G bytes

D23-D16

Banco 1

8 bits

1G bytes

D15-D8

Banco 0

8 bits

1G bytes

D7-D0

MICROPROCESADOR 80386DX MICROPROCESADOR 80486SX

MICROPROCESADOR 80486DX

La memoria esta organizada en bancos de memoria en todas las versiones del

microprocesador excepto el 8088 que tiene un solo banco de memoria. Un banco de

memoria es una sección de 8 bits de ancho. Los microprocesadores de 16 bits tienen dos

bancos de memoria para formar una sección de memoria de 16 bits de ancho, a la cual se

direcciona por bytes o por palabras. Los microprocesadores de 32 bits tienen cuatro bancos

de memoria, pero se les direcciona como bytes, palabras o dobles palabras.

FFFFF

FFFFE

FFFFD

00002

00001

00000

FFFFFF

FFFFFD

FFFFFB

000005

000003

000001

FFFFFE

FFFFFC

FFFFFA

000004

000002

000000

FFFFFFFC

FFFFFFF8

FFFFFFF4

00000008

00000004

00000000

FFFFFFFD

FFFFFFF9

FFFFFFF5

00000009

00000005

00000001

FFFFFFFE

FFFFFFFA

FFFFFFF6

0000000A

00000006

00000002

FFFFFFFF

FFFFFFFB

FFFFFFF7

0000000B

00000007

00000003

Page 17: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

17

Segunda Unidad: USO DEL TURBO ENSAMBLADOR

1. Introducción al Proceso de Ensamblado.

Cuando un programa en ensamblador es muy extenso es preferible escribirlo como

un archivo de texto y compilarlo. Se simplifica la edición, documentación y revisión de los

programas. Se requiere hacer el siguiente procedimiento:

Para ensamblar un programa debemos seguir los pasos anteriores, esto es realizar lo

siguiente:

c:\tasm\tasm myfirst.asm Debe tener la extensión asm.

c:\tasm\tlink myfirst /t Para crear un com.

c:\tasm\dir myfirst.*

myfirst.asm

myfirst.obj

myfirst.map

myfirst.com

Creando un bateador:

c:\tasm\edit a.bat Crear el bateador con extensión .bat

tasm %1

tlink %1 / t

del %1.obj

del %1.map

Page 18: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

18

2. Estructura de Programa.

; Definición de la estructura de un programa en Macro Ensamblador

Data segment ; Definición del segmento de datos

; Definición de igualaciones

nombre1 EQU valor1

nombre n EQU valor n

; Asignación de memoria

nombre1 tipo valor1

nombre n tipo valor n

ends

stack segment

dw 128 dup(0)

ends

code segment ; Definición del segmento de datos

start:

; definición de código

mov ax, data

mov ds, ax

mov es, ax

;Agregar el codigo

-------------

-------------

-------------

mov ax, 4C00h ; Servicio de Program Terminate

int 21h

ends

end start ; set entry point and stop the assembler.

3. Tipos y Declaraciones.

Pseudo Operaciones. Cuando se escribe un programa en ensamblador utilizando un editor de texto es

conveniente utilizar algunas pseudo instrucciones, las cuales son órdenes para el

compilador, no para el microprocesador. Esto es, no generan código.

Page 19: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

19

Equates (Igualaciones).

Son asignaciones que no definen espacio en memoria, el ensamblador las utiliza

para sustituir valores mas adelante.

Ejemplo:

Black EQU 0

Blue EQU 1

Green EQU 2

Cyan EQU 3

Red EQU 4

Margenta EQU 5

Brown EQU 6

Pseudo Operaciones de definición de datos. Esta orden la interpreta el ensamblador y se utiliza para asignar cantidad de

memoria. La siguiente tabla resume estas instrucciones.

Nemónico Definición Tamaño

DB Define byte 1 byte

DW Define word 2 bytes

DD Define double word 4 bytes

DQ Define quard word 8 bytes

DT Define ten bytes 10 bytes

Ejemplo: ORIG_DRIVE DB 0

ORIG_PATH DB 64 DUP (0)

PRE_PATH DB „\‟

PATH DB 64 DUP (0)

ANY_FILE DB „*,*‟,0

DIR_TABLE DB 256 DUP (19 DUP (0))

BREAK_INT_OFF DW 00

BREAK_INT_SEG DW 00

CMD_TABLE EQU THIS BYTE

DW OFFSET ACTION_CMD

DW OFFSET DOIT_CMD

DW OFFSET DRIVE_CMD

DW OFFSET PATH_CMD

DW OFFSET EXIT_CMD

ACTION_CMD DB „SELECT‟,0

DOIT_CMD DB „DELETE‟,0

DRIVE_CMD DB „DRIVE‟,0

PATH_CMD DB „PATH‟,0

EXIT_CMD DB „EXIT‟,0

ONE_MOMENT DB „Examining diskette . . one moment please !‟,0

MOV AL, ORIG_DRIVE

MOV AX, ORIG_DRIVE NO SE PUEDE PORQUE ES DE 8 BITS

Page 20: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

20

Cuando una localidad de memoria es asignada a 1 byte, se debe respetar esta

referencia, sin embargo es posible saltar esta restricción de la siguiente forma. MOV AX, WORD PTR ORIG_DRIVE

PROGRAMAS .COM

El nombre de COM viene de 'Copy Of Memory', y quiere decir algo asi como que el

contenido del fichero COM formado por las instrucciones y datos que componen el

programa, es una copia exacta del programa una vez cargado en memoria.

PROGRAMA: Es importante ensamblar en 100H, porque todos los accesos a variables,

saltos en el programa, etc, se harán teniendo en cuenta que el programa empieza en la

dirección 100h, y no en la 00h. Si no utilizaremos la instrucción ORG 100h, el código

ejecutable resultante estaría construido en base a una dirección de comienzo 00h. Al cargar

el programa en memoria para su ejecución (a partir de la dirección 100h), habría 100h bytes

de diferencia en todos los accesos a memoria, saltos, llamadas a procedimientos, etc.

4. Programas en línea recta.

Son programas sencillos que utilizan algunas instrucciones básicas del

microprocesador.

Por ejemplo:

Suma de dos bytes, tablas de búsqueda, corrimiento y rotación, enmascaramiento de datos,

encontrar el mayor de dos números.

Tarea: Escribir 4 programas en ensamblador que sumen los contenidos de las localidades

0200h y 0201h, el resultado debe quedar en la localidad 0202h. Salvar los 4 programas y

traer el disco.

Ejercicio: Implemente un programa que sume 10 localidades de memoria, comenzando en

la localidad 200h, el resultado dejarlo en la localidad 20Ah.

Solución:

Dir. Directo

MOV AL, [200h]

ADD AL, [201h]

ADD AL, [202h]

:

ADD AL, [209h]

MOV [20Ah], AL

INT 20h

Dir. Base

MOV BX, 200h

MOV AL, [BX]

INC BX

ADD AL, [BX]

:

ADD AL, [BX]

INC BX

MOV [20Ah], AL

INT 20h

Page 21: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

21

Direccionamiento Indirecto: Es muy común usar tablas de búsqueda cuando se desea

velocidad y no se tienen muchos recursos aritméticos. Por ejemplo:

Entrada Vel (Km/Hr) Vel (MPH) X2

1 30 19 1

2 58 40 4

3 90 70 9

Ejercicio: Implemente un programa que calcule el cuadrado del numero en una tabla, que

se encuentra en la localidad 200h y deje el resultado en la localidad 201h.

Solución:

210 0

211 1

212 4

213 9

:

219 81

MOV BX, 210h

ADD BL, [200h]

MOV AL, [BX]

MOV [201h], AL

INT 20h

MOV SI, 210h

MOV BL, [200h]

MOV BH, 0

MOV AL, [BX + SI]

MOV [201h], AL

INT 20h

Tarea: Escriba un programa que obtenga el cuadrado y el factorial de un numero ubicado

en la localidad 200h, deje el cuadrado en la localidad 201h y el factorial en la 202h. Use

tablas de búsqueda. Por ejemplo:

[200h] = 0 [200h] = 3

[201h] = 0 [201h] = 9

[202h] = 1 [202h] = 6

Instrucciones de Corrimiento y Rotación.

Rotaciones: Las instrucciones de rotación colocan los datos binarios porque hacen rotar la

información en un registro o localidad de memoria. RCL y RCR rotan los datos a través del

acarreo (C) y ROL y ROR solo hacen girar los datos a través del objetivo.

No pierde el valor

RCL Rotate trough Carry Left

RCR Rotate trough Carry Rigth

ROL Rotate Left

ROR Rotate Rigth

objetivo c

ROL

objetivo c

ROR

objetivo c

RCL

objetivo c

RCR

Page 22: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

22

Corrimientos: Las instrucciones para corrimiento colocan o mueven números a la

izquierda o derecha dentro de un registro o localidad de memoria.

Cuidan el signo

SAL Shift Aritmetic Left

SAR Shift Aritmetic Rigth

No cuidan el signo

SHL Shift Left

SHR Shift Rigth

Suponga que queremos desplazar un dato dos veces a la izquierda.

MOV AL, [300h]

MOV CL, 2

SHL AL, CL

Ejercicio: Se desea empacar dos números BCD en un solo byte. El primer digito esta en la

localidad 200h y el segundo en 201h, deje el resultado en 202h.

Por ejemplo:

[200h] = 02

[201h] = 07

Resultado: [202h] = 27

MOV AL, [200h]

MOV CL, 4

SHL AL, CL

ADD AL, [201h]

MOV [202h], AL

INT 20H

INICIO

Desplazar [200h] cuatro

bits a la izq.

Sumar [200h] + [201h]

Guardar suma en [202h]

Fin

Objetivo c

SHL

Objetivo c

SHR

Objetivo c

SAL

Objetivo c

SAR Aritmético a la derecha

0 Lógico a la izq

0 Lógico a la der S

0 Lógico a la izq

Page 23: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

23

Ejercicio: Se desea desempacar un número que esta en la localidad 200h. Coloque el

digito más significativo en la localidad 202h y el menos significativo en 201h.

Por ejemplo:

[200h] = 18h

Resultado:

[201h] = 08h

[202h] = 01h

MOV AL, [200h]

AND AL, 0Fh

MOV [201h], AL

MOV AL, [200h]

MOV CL, 4

SHR AL, CL

MOV [202h], AL

INT 20h

Programa uno.

MOV AL, [200h]

MOV CL, 4

SHR AL, CL

MOV DL, AL

ADD DL, 30h

MOV AH, 2

INT 21h

MOV AL, [200h]

AND AL, 0Fh

MOV DL, AL

ADD DL, 30h

MOV AH, 2

INT 21h

INT 20h

Programa dos

MOV AH, 2

INT 1Ah

MOV [200h], DH

Programa 1

MOV DL, 20h

MOV AH, 2

INT 21h

MOV DL, 20h

MOV AH, 2

INT 21h

JMP 100h

INT 20h

Real Times Clock Service

La interrupción 1AH con el servicio 2, regresa en DH los segundos MOV AH, 2

INT 1Ah

MOV [200h], DH

INT 20h

Instrucciones de Salto Condicional.

Existe una gran variedad de instrucciones que transfieren el control de un programa

dependiendo del estado de las banderas. Es posible comparar datos con signo y datos sin

signo, por lo cual se requiere especial cuidado al elegir una instrucción.

Saltos basados en datos sin signo. Bandera examinada

JE / JZ Jump if equal / jump if zero ZF

JNE / JNZ Jump if non equal / jump if non zero ZF

JA / JNBE Jump if above / jump if no below or equal CF, ZF

JAE / JNB Jump if above or equal / jump if not below CF

JB / JNAE Jump if below / jump if not above or equal CF

JBE / JNA Jump if below or equal / jump if not above CF, AF

Page 24: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

24

CMP AX, BX (compara ax con bx, no guarda resultado)

SUBB AX, BX (sustrae lo que tiene ax con bx, guarda resultado en ax)

Ejemplo:

CMP AX, BX (compara ax con bx)

JNE otro_lugar (salta si no son iguales a la etiqueta otro_lugar)

Saltos basados en datos con signo Bandera examinada.

JE / JZ Jump if equal / jump if zero ZF

JNE / JNZ Jump if non equal / jump if non zero ZF

JG / JNLE Jump if greater / jump if non less or equal ZF, SF, OF

JGE / JNL Jump if greater or equal / jump if non less SF, OF

JL / JNGE Jump if less / jump if not greater or equal SF, OF

JLE / JNG Jump if less or equal / jump if not greater ZF, SF, OF

Pruebas aritméticas especiales. Bandera examinada.

JS Jump if sign SF

JNS Jump if not sign SF

JC Jump if carry CF

JNC Jump if not carry CF

JO Jump if overflow OF

JNO Jump if not overflow OF

JP / JPE Jump if parity / jump if parity even PF

JNP / JPO Jump if not parity / jump if parity odd PF

Ejercicio: Escriba un programa que encuentre el mayor de dos números, uno de ellos esta

en la localidad 200h y el otro esta en la localidad 201h, guarde el mayor en la localidad

202h, asuma que los números no tienen signo. [200h]=43h

[201h]=07h

[202h]=43h

MOV BX, 200h

MOV AL, [BX]

INC BX

CMP AL, [BX]

JA mayor

MOV AL, [BX]

mayor: INC BX

MOV [BX], AL

INT 20h

Ejercicio: Escriba un programa que sume los contenidos de 100 localidades adyacentes,

guarde el resultado en la localidad 264h. Asuma que los números provocan un número de

8 bits, la serie empieza en la localidad 200h.

MOV DL, 0

MOV CL, 1

MOV BX, 200h

Inicio: ADD DL, [BX]

INC BX

INC CL

CMP CL, 64h

JB inicio

MOV [264h], DL

INT 20h

XOR AX, AX

MOV CL, 64h

MOV BX, 200h

Inicio: ADD AL, [BX]

INC BX

LOOP inicio

MOV [264h], AL

INT 20h

Page 25: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

25

5. Programas con lazos.

Un lazo es una estructura básica que forza a la cpu a repetir un número de instrucciones.

Los lazos constan de cuatro partes:

1. Sección de Inicialización: Aquí se definen los valores de contadores.

2. Sección de Procesamiento: Es donde ocurre la manipulación de los datos, es la

sección que realmente realiza el trabajo.

3. Sección de Control de Lazo: Actualiza los contadores y apuntadores para la siguiente

instrucción.

4. Sección Final: Aquí se analizan y se almacenan los resultados.

DIAGRAMA DE FLUJO DE UN LAZO.

Sección de

Inicialización

Sección de

Procesamiento

Sección de

Control

Sección

Final

Inicio

Fin

si

no Tarea Completa

¿?

Sección de

Inicialización

Sección de

Procesamiento

Sección de

Control

Sección

Final

Inicio

Fin

si

no

Tarea Completa

¿?

Page 26: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

26

Ejercicio: Escriba un programa que calcule la suma de una serie de números. La longitud

de la serie esta en la localidad 201h, y la serie en si se inicia el la localidad 202h. Guarde

la suma en la localidad 200h. Asuma que el resultado cabe en 8 bits, por lo que se pueden

ignorar los acarreos. Ejemplo:

[201]= 03h

[202]= 28h

[203]= 55h

[204]= 26h

[200]= A6h

MOV BX, 201h

MOV CL, [BX]

MOV CH, 0

MOV AL, CH

Sigue: INC BX

ADD AL, [BX]

LOOP Sigue

MOV [200h], AL

INT 20h

LOOP : decrementa CX

JNZ etiqueta

Apunta=201 Cuenta=[201]

Suma=0

Apunta + +

Suma+=[apuntador]

Cuenta--

Es

cuenta = 0

Inicio

[200] = suma Fin

si no

Page 27: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

27

Ejercicio: Escriba un programa que calcule cuantos bits de la localidad 200h son unos y coloque el resultado

en la localidad 201h. Ejemplo:

[200h]= 3Bh = 0011 1011

[201h]= 05h

MOV CL, 8

MOV CH, 0

MOV AL, [200h]

MOV DL, 0

Sigue: SHL AL, 1

JNC Aquí

INC DL

Aquí: LOOP Sigue

MOV [201h], DL

INT 20h

Ejercicio: Escriba un programa que encuentre el mayor de un bloque de datos. La longitud del bloque esta

en la localidad 201h y el bloque en si inicia en la localidad 202h. Guarde el resultado en la localidad 200h.

Asuma que los números en el bloque son todos de 8 bits sin signo. Ejemplo:

[201h]= 05h

[202h]= 67h

[203h]= 79h

[204h]= 15h

[205h]= E3h

[206h]= 72h

Resultado [201h]= E3h

MOV BX, 201h

MOV CL, [BX]

MOV CH, 0

MOV AL, CH

Sigue: INC BX

CMP AL, [BX]

JAE Aqui

MOV AL, [BX]

Aquí: LOOP Sigue

MOV [200h], AL

INT 20h

Cuenta=8

Suma=0

Dato=[200]

Mover dato un bit a

la izquierda

carry = 1

Inicio

Suma = Suma +1

Cuenta=Cuenta - 1

cuenta = 0

[201] = Suma si

no

si

no

Fin

Cuenta=[201]

Apunta=201

Mayor=0

Apunta = Apunta +

1

Es Mayor >

[apunta]

Inicio

Mayor = [apunta]

Cuenta=Cuenta - 1

Cuenta = 0

[200] = Mayor si

no

si

no

Fin

Page 28: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

28

Ejercicio: Escriba un programa que calcule la suma de una serie de números. La longitud de la serie esta en

la localidad 202h y la serie inicia en la localidad 203h. Guarde la suma en la localidad 200h y 201h en

formato little hendían, byte mas significativo en la localidad 201h. Ejemplo:

[202h]= 03h

[203h]= 0C8h

[204h]= 0FAh

[205h]= 96h

Resultado

[200h]= 58h

[201h]= 02h

MOV BX, 202h

MOV CL, [BX]

MOV CH, 0

MOV AL, CH

MOV DL, CH

Cambia: INC BX

ADD AL, [BX]

JNC Sigue

INC DL

Sigue: LOOP Cambia

MOV [200h], AL

MOV [201h], DL

INT 20

Tarea:

1. Implemente un programa en ensamblador que ordene de forma ascendente 100

localidades de memoria, comenzando en la localidad 200h.

2. Escriba un programa en ensamblador que multiplique dos números ubicados en las

localidades 202h y 203h, dejar el resultado en formato little hendían en las localidades 200h

y 201h. Aplicar el método de La Russe.

3. Escriba un programa en ensamblador que multiplique dos números ubicados en las

localidades 202h y 203h, dejar el resultado en formato little hendían en las localidades 200h

y 201h. Aplicar el método de divide y vencerás.

4. Escriba un programa en ensamblador que calcule la raíz cuadrada de un numero ubicado

en la localidad 201h, dejar el resultado en la localidad 200h. Aplique el método de la raíz

aproximada.

5. Se sabe que la suma de los cubos de números positivos es el cuadrado de un número.

Aplique este método para obtener el cuadrado de ese número, la sumatoria será hasta el

número ubicado en la localidad 200h. Escriba un programa en ensamblador que calcule el

resultado de la suma de los cubos después obtenga la raíz cuadrada, deje resultados en las

localidades 201h y 202h.

6. Problemas Aritméticos.

Existen cinco tipos de instrucciones aritméticas en el microprocesador 8086, y son:

1. Instrucciones de suma.

2. Instrucciones de resta.

3. Instrucciones de multiplicación.

4. Instrucciones de división.

5. Instrucciones de comparación.

Page 29: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

29

Instrucciones de Suma.

ADD: Suma un registro o localidad de memoria con otro registro o localidad de memoria,

pero no puede sumar dos localidades de memoria.

ADC: Suma un registro o localidad de memoria con otro registro o localidad de memoria,

aparte suma el valor del carry, pero no puede sumar dos localidades de memoria.

INC: Incrementa en uno a un registro.

Ejercicio: La siguiente rutina suma dos números de múltiples dígitos. Se asume que el registro SI y DI

contienen la dirección de inicio de los números a sumar y CX el numero de dígitos a sumar. (digito =

palabra)

CLC

Lazo_sumador: MOV AX, [SI]

ADC [DI], AX

INC SI

INC SI

INC DI

INC DI

DEC CX

JNZ Lazo_sumador

RET

AAA (Adjust Result of Ascii Addition): Las instrucciones aritméticas para ASCII funcionan con números codificados en ASCII. El

valor de estos números es entre 30H y 39H para los números 0 a 9.

Se usa para ajustar un resultado en AL, suponiendo que se genera al sumar dos caracteres

ASCII. El ajuste es hecho de la siguiente manera:

1. Si el nibble bajo de AL esta entre 0 y 9, y la bandera AF es 0, ir al paso 3.

2. Si el nibble bajo de AL esta entre A y F y/o la bandera AF es 1, entones suma 6 a AL,

suma 1 a AH y pone la bandera AF en 1.

3. Limpia el nibble alto de AL.

La suma de dos números de un digito codificados en ASCII no dará por resultado ningún

dato útil. Por ejemplo si se suman un 31H y un 39H, el resultado es un 6AH.esta suma en

ASCII (1 + 9) produciría un resultado ASCII de dos dígitos, equivalente a un 10 decimal, el

cual es un 31h y un 30H en código ASCII. Si se ejecuta la instrucción AAA después de esta

suma, el registro AX contendrá un 0100H que, aunque no es un código ASCII, se puede

convertir si se le suma 3030H, que genera 3130H. La instrucción AAA borra AH si el

resultado es menor de 10 y agrega 1 a AH si el resultado es mayor que 10. Ejemplo:

MOV AX, 31H

ADD AL, 39H

AAA

ADD AX, 3030H

DAA (Decimal After Addition): Se para convertir el contenido de AL a un numero BCD,

solo debe ser usada después de una suma de números de BCD.

LOOP

Page 30: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

30

Ejercicio: Escriba un programa que calcule la suma de una serie de números BCD. La longitud de la serie

esta en la localidad 202h, y la serie en si se inicia el la localidad 203h. Guarde la suma en la localidad 200h

y 201h formato little endian.. Ejemplo:

[202]= 28h

[203]= 55h

[204]= 26h

Resultado

[200]= 09h

[201]= 01h

XOR AX, AX

XOR DX, DX

MOV BX, 202h

XOR CX, CX

MOV CL, [BX]

Sigue: CLC

INC BX

ADD AL, [BX]

DAA

JNC Aquí

MOV AL, DL

ADD AL, 1

DAA

MOV DL, AL

Aquí: LOOP Sigue

MOV [200h], AL

MOV [201h], DL

INT 20h

Instrucciones de Resta.

SUB: Resta un registro o localidad de memoria con otro registro o localidad de memoria,

pero no puede restar dos localidades de memoria.

SBB: Resta un registro o localidad de memoria con otro registro o localidad de memoria,

aparte resta el valor del carry (borrow), pero no puede restar dos localidades de memoria.

DEC: Decrementa en uno a un registro.

AAS (Adjust Result of Ascii Substraction): Se usa para ajustar un resultado en AL,

suponiendo que se genera al restar dos caracteres ASCII.

Ajusta al registro AX después de una resta. Por ejemplo, supóngase que se resta un 35H de

un 39H. El resultado será 04H, que no requiere corrección; en este caso AAS no modificara

ni a AH ni a AL. Por otra parte si se resta 38H de 37H, entonces AL será igual a 09H y el

numero en AH se decrementara en 1.

DAS (Decimal After Substraction): Se para convertir el contenido de AL a un numero

BCD, solo debe ser usada después de una resta de números de BCD.

NEG: Se usa para realizar una negación, o bien es el complemento a 2.

Instrucciones de Multiplicación.

MUL: Se utiliza para obtener el producto en números de 8,16 y 32 bits. Si los números son

de 8 bits multiplica AL con otro registro o localidad de memoria, y deja el resultado en AX.

Si los números son de 16 bits multiplica AX con otro registro o localidad de memoria, y

deja el resultado en AX la parte baja y en DX deja la parte alta. Ejemplo:

AL

X

AX

MOV AL, [200h] MOV BL, [201h]

MUL BL

Page 31: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

31

Si es de 16 bits. Ejemplo:

IMUL: Se utiliza para obtener el producto en números de 8,16 y 32 bits, la multiplicación

es con signo.

AAM: La instrucción AAM sigue a la instrucción de multiplicar, después de multiplicar

dos números de un digito BCD no empacados. En el siguiente ejemplo se multiplica un 5

por un 5; el resultado después de la multiplicación es 0019H en el registro AX. Después de

ajustar el resultado con la instrucción AAM, AX contiene un 0205H, que es el resultado de

25 en BCD no empacado. Si se suma 3030H a 0205H, se convierte en un resultado en

ASCII 3235H. Ejemplo:

MOV AL, 5

MOV CL, 5

MUL CL

AAM

Para multiplicar por potencias de dos mejor usar corrimientos. Ejemplo: 0000 0011 = 3 para multiplicarlo por 10 sin usar MUL

0000 0110 recorremos guardamos temp 2

0000 1100 recorremos 4 0001 1000 recorremos y lo sumamos con temp 8

se toma el ultimo que no excede (8) y faltarían 2 para 10 por ello sumamos con el del valor 2

0000 0110 0001 1000

0001 1110 = 30

Ejemplo:

0000 0101 = 5 para multiplicarlo por 8 sin usar MUL

0000 1010 recorremos 2 0001 0100 recorremos 4

0010 1000 = 40 recorremos y como es 8 exacto ese es el numero 8

Ejemplo:

0000 0101 = 5 para multiplicarlo por 20 sin usar MUL

0000 1010 recorremos 2 0001 0100 recorremos guardamos temp 4

0010 1000 recorremos 8

0101 0000 recorremos 16

se toma el ultimo que no excede (16) y faltarían 4 para 20

0101 0000

0001 0100 0110 0100 = 100

Instrucciones de División.

DIV: Se utiliza para obtener la división en números enteros de 8,16 y 32 bits, dicha

división es sin signo.

AX

X

DX AX

Si se tiene: MUL BX, AX es como si tuviera MUL BX

Si tiene:

MUL AX es como si tuviera MUL AX, AX

Page 32: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

32

IDIV: Se utiliza para obtener la división en números enteros con signo de 8,16 y 32 bits.

Para la división de 8 bits utiliza el registro AX para almacenar el dividendo, que se divide

entre el contenido de cualquier registro o localidad de memoria de 8 bits. El cociente se

transfiere a AL después de la división y AH contiene el residuo de número entero. Ejemplo:

MOV AX, 0010H

MOV BL, 0FDH

IDIV BL

Quedaria

AX = 01FBH

AL= (-5) cociente

AH = 1 residuo

Para la división de 16 bits es semejante a la división de 8 bits, excepto que en lugar de

dividir entre AX un dividendo de 32 bits se divide entre DX-AX. El cociente aparece en

AX y el residuo en DX después de una división de 16 bits.

Para la división de 32 bits solo en los microprocesadores 80386 en adelante. El contenido

de 64 bits de EDX-EXA se divide entre el operando especificado por la instrucción y queda

un cociente de 32 bits en EAX y un residuo de 32 bits en EDX.

AAD: La instrucción AAD al contrario de todas las instrucciones para ajuste, aparece antes

de la división. La instrucción AAD requiere que el registro AX contenga un numero BCD

no empacado, de 2 dígitos (no ASCII) antes de que se ejecute. Después de ajustar el

registro AX con AAD se divide entre un numero BCD no empacado para generar un

resultado de un solo digito en AL y cualquier residuo quedara en AH. Ejemplo:

MOV BL, 9

MOV AX, 0702H

AAD

DIV BL

En el ejemplo anterior se forma un 72 en BCD y cambiado a hexadecimal es 48H, que se le pasa a AX al

momento de la instrucción AAD, después se divide 48H entre 9 y no regresa como resultado AH=00 y

AL=08.

CBW: Esta instrucción convierte el byte que esta en AL en un Word en AX. Se utiliza para

extender un número de 8 bits en otro de 16 bits con signo. Ejemplo:

MOV AX, 6545H

CBW

Quedaría AX=0045H

CWD: Esta instrucción convierte el Word en un numero doble Word (DX : AX). Ejemplo:

MOV AX, 6545H

MOV DX, 7987H

CWD

Quedaría AX=6545H DX=0000H

Page 33: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

33

Raíz Cuadrada.

Para encontrar y/o calcular la raíz cuadrada existen 2 métodos posibles los cuales

son los siguientes:

1. Método aproximado.

02 = 0

12 = 1 1

22 = 4 3

32 = 9 5

42 = 16 7

52 = 25 9

Ejemplo:

Raíz de 49 es 7

49 -1 = 48 – 3 = 45 – 5 = 40 – 7 = 33 – 9 = 24 – 11 = 13 – 13 = 0

Ejemplo:

Raíz de 30 es 5.5

30 -1 = 29 – 3 = 26 – 5 = 21 – 7 = 14 – 9 = 5 – 11 = – 6

11 / 2 = 5.5

Ejemplo:

Raíz de 24 es 4.5

24 -1 = 23 – 3 = 20 – 5 = 15 – 7 = 8 – 9 = – 1

9 / 2 = 4.5

Ejercicio: XOR AX, AX

MOV BL, [200h]

MOV DL, 1

SIGUE: CMP BL, DL

JB ADO

SUB BL, DL

INC DL

INC DL

INC AL

DAA

JMP SIGUE

ADO: SHR DL, 1

CMP BL, 0

JE ACA

MOV CL, 5

JMP FIN

ACA: MOV CL, 0

FIN: MOV [201h], AL

MOV [202h], CL

INT 20H

Page 34: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

34

2. Método Exacto.

Page 35: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

35

Ejercicio: Realice un programa que calcule la raíz cuadrada exacta de un numero ubicado el la localidad 200.

MOV BX, 200H

XOR AX, AX

MOV AL, [BX]

INC BX

NEW: MOV DX, 0

MOV DL, 40H

MOV CX, 0

MOV CL, 4

ACA: CMP AX, DX

JAE ADO

SHL DH, 1

JMP SIGUE

ADO: SUB AX, DX

SHL DH, 1

INC DH

SIGUE: SHL AX, 1

SHL AX, 1

LOOP ACA

MOV [BX], DH

INC BX

CMP BX, 203H

JNE NEW

INT 20H

7. Manipulación de Datos.

Números de AUTO – VERIFICACION.

Los dígitos de auto-verificación son utilizados como una inserción en números de

identificación por ejemplo tarjetas de crédito, números de inventario, equipaje, paquetería,

etc. Cuando estos números son manejados por sistemas computacionales. También se

pueden usar en mensajes, archivos de identidad y otras aplicaciones. El propósito de estos

dígitos es minimizar errores, por ejemplo dígitos transpuestos, dígitos desplazados o dígitos

perdidos.

Propósito minimizar errores en:

dígitos transpuestos (72 no se confunda 27).

dígitos desplazados (3891 en lugar de 8910).

dígitos perdidos (65 en lugar de 64).

ALGORITMO DOBLE SUMA DOBLE MODULO 10.

1. Limpiar el checksum.

2. Multiplicar el digito delantero por dos y sumar resultado al checksum.

3. Sumar el siguiente digito al checksum.

4. Continuar el proceso hasta usar todos los dígitos.

5. El digito menos significativo es el digito de auto-verificación.

Ejemplo: 549321

5x2+ 4 +9x2+ 3 +2x2+1 = 40

Ejemplo: 549320

5x2+ 4 +9x2+ 3 +2x2+0 = 39

Digito de Auto-Verificación

Digito de Auto-Verificación

Page 36: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

36

DOBLE SUMA DOBLE Ejercicio: Calcule el digito verificador de una cadena de dígitos BCD. La longitud de la cadena (numero de

bytes) esta en la localidad 201H. El string inicia en la 202H. Calcule el digito de checksum con la técnica

doble suma doble y guardarlo en la localidad 200H.

Ejemplo: [201] = 03

[202] = 36

[203] = 68

[204] = 51

[200] = 03

Ejemplo: [201] = 04

[202] = 50

[203] = 29

[204] = 16

[205] = 83

[200] = 00

MOV BX, 201H

MOV CL, [BX]

MOV CH, 0

XOR AX, AX

MOV DL, 4

ADO: INC BX

MOV AL, [BX]

SHR AL, DL

SHL AL, 1

ADD AH, AL

MOV AL, [BX]

AND AL, 0FH

ADD AH, AL

LOOP ADO

AND AH, 0FH

MOV [200], AL

INT 20H

Ejercicio: Escriba un programa que cuente los elementos nulos de una lista que inicia en la localidad 202h. El

total de elementos esta en la 201h. Guarde resultado en la localidad 200h.

Ejemplo: [201] = 04h

[202] = 21h

[203] = 0ADh

[204] = 00h

[205] = 32h

[200] = 01h

Ejemplo: [201] = 05h

[202] = 00h

[203] = 71h

[204] = 00h

[205] = 00h

[206] = 4Bh

[200] = 03h

MOV BX, 201h

MOV CL, [BX]

MOV CH, 0

XOR AX, AX

MOV DL, AL

SIGUE: INC BX

CMP AL, [BX]

JNE ADO

INC DL

ADO: LOOP SIGUE

MOV [200h], DL

INT 20H

Ejercicio: Escriba un programa que cuente los elementos de una serie. La serie en si inicia en la localidad

201h, el fin esta indicado con un “carriage return” (carácter 0DH). Guarde el total de elementos, sin contar

CR en la localidad 200h.

Ejemplo: [201] = 32h

[202] = 90h

[203] = 47h

[204] = 0Dh

[200] = 03h

MOV DL, 0

MOV AL, 0DH

MOV BX, 201h

SIGUE: CMP AL, [BX]

JE ADO

INC DL

INC BX

JMP SIGUE

ADO: MOV [200h], DL

INT 20H

Page 37: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

37

Ejercicio: Escriba un programa que ordene de forma descendente una serie de números

ubicados a partir de la localidad 201H, el número de elementos se encuentra en la localidad

200H.

MOV BX, 9

SIGUE: MOV DI, 200H

MOV CX, 9

OTRO: MOV AL, [DI]

CMP AL, [DI+1]

JB NO_CAMBIO

MOV DL, [DI+1]

MOV [DI+1], AL

MOV [DI], DL

NO_CAMBIO:

INC DI

LOOP OTRO

DEC BX

CMP BX, 0

JNE SIGUE

INT 20

Subrutinas: Los programas reales realizan tareas que pueden ser requeridas varias veces.

Por esta razón es conveniente escribirlas como subrutinas para que sean llamadas las veces

que sea necesario. ______

______

call 300

______

______

call 300

______

______

300

______

______

ret

Instrucciones para subrutinas:

CALL: NEARCALL (llamada cercana) FARCALL (llamada lejana)

RET: RETN (retorno cercano) RETF (retorno lejano)

PASE DE PARAMETROS. Algunas subrutinas como la conversión requieren de recibir parámetros como

entrada, también es posible que la subrutina genere parámetros de salida. En el 8086, los

parámetros se acostumbran pasar en el STACK y se recuperan con el registro BP.

_____

mov al, [400]

push ax

call hexade

_______

hexade

_______

push dx

ret

Cuando son muchos parámetros es preferible pasar el apuntador de los datos, esto

ahorra tiempo de ejecución y espacio en memoria.

Page 38: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

38

Subrutinas Re-entrantes: Son aquellas que se llaman así mismo sin crear conflictos. _____

_____

multiplica

_____

_____

call multiplica

_____

_____

ret

Documentación de subrutinas: Los listados de las subrutinas deben proporcionar

suficiente información de tal manera que el usuario no necesite revisar la estructura interna

de la subrutina. Debe incluir lo siguiente:

Una descripción del propósito de la subrutina.

Una lista de los parámetros de entrada y salida.

Registros y memoria usados.

Un ejemplo de cómo usarla.

Ejemplo:

HEXADE PROC NEAR

; subrutina que convierte un numero hexadecimal

; en el rango 0-FF a decimal (0 . . 255)

; Entrada numero a convertir AL

; Salida numero decimal DX

; Destruye AX, BX y CX.

Ordenamiento de datos de 8 bits.

Ejercicio: Implemente un programa que ordene una serie de números ubicados a partir de

la localidad 201h, el numero de elementos de la serie esta ubicado en la localidad 200h.

Cuenta =[200]-1 Apunta =201

Inter =0

Es [Apunta+1] >

[Apunta]

Inicio

Inter = 1

Temp = [Apunta] [Apunta]= [Apunta+1]

[Apunta+1]= Temp

Apunta= Apunta+1

Cuenta=Cuenta - 1

cuenta = 0 si

no

si

no

Fin

Inter = 0

si

no

Page 39: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

39

Hexadecimal a Decimal. Ejercicio: Escriba un programa que convierta el contenido del acumulador en carácter ASCII. Coloque el

resultado en el acumulador. Asuma que el acumulador contiene un digito a decimal. Ejemplo:

[A] = 0Ch

Resultado [A] = 43h

[A] = 06h

Resultado [A] = 36h

ORG 100H

MOV AL, [200H]

CALL 150H

MOV [201H], AL

INT 20H

ORG 150H

CMP AL, 0AH

JB ACA

ADD AL, 07H

ACA: ADD AL, 30H

RET

Tercera Unidad: INTERFASE CON EL PUERTO PARALELO

1. Ubicación del Puerto Paralelo.

El puerto paralelo puede ser utilizado como un grupo de entradas y salidas de propósito

general. Posee 8 salidas, 5 entradas y 4 líneas mixtas. Se ubica en 3 posibles direcciones

que pueden ser:

3BC

378

278

Se puede dividir en 3 partes denominados base, base + 1, base + 2.

Aplicaciones:

Puerto de captura de datos.

Centinelas de Hardware.

Adaptadores de red.

Comunicación de 2 computadoras: Laplink, Interlink, NC, UAAlink, Terminal.

Control industrial.

El sistema operativo guarda en la memoria baja la cantidad de puertos que tiene y la

ubicación de estos, en las siguientes localidades: 1er p.p 0000:0408

0000:0409

2do p.p 0000:040A

0000:040B

3er p.p 0000:040C

0000:040D

D0:408 - 78 03 78 02 . . . . .

LPT1 LPT2

A >= 10

Inicio

A = A + 7

si

no

Fin A = A + 30

Page 40: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

40

2. Puerto Base, Puerto de Salida. Se ubica en la dirección base, es un puerto de salida de 8 bits, utiliza la siguiente

distribución:

Bit Posición DB25

0 2

1 3

2 4

3 5

4 6

5 7

6 8

7 9

Page 41: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

41

3. Puerto Base + 1, Puerto de Entrada. Se ubica en la dirección base + 1, es un puerto de entrada de 5 bits, utiliza la siguiente:

Bit Nivel Leído Pin DB25 Señal

0 -- -- --

1 -- -- --

2 -- -- --

3 1 15 --

4 1 13 Select

5 1 12 Paperad

6 1 10 ACK

7 0 11 Busy

4. Puerto Base + 2, Puerto de Entrada-Salida. Se ubica en la dirección base + 2. Normalmente es un puerto de salida, pero es posible

utilizarlo como entrada pidiéndole previamente la letra b, esto es para que los transistores

no estén aterrizados. Las líneas se ubican de la siguiente manera:

Bit Nivel Leído Pin DB25 Señal

0 0 1 Strobe

1 0 14 Autofeed

2 1 16 Init printer

3 0 17 Select in

4 -- -- --

5 -- -- --

6 -- -- --

7 -- -- --

Programa para escribir en el puerto paralelo:

El siguiente programa asume que en las ocho líneas de datos existe algún dispositivo que

lee los datos, por ejemplo led‟s que se encienden y apagan según los datos.

7E

BD

DB

E7

E7

DB

BD

7E

- D0:408

- O378, FF

- O378, 0

Page 42: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

42

PUSH DS

XOR AX, AX

MOV DS, AX

MOV BX, 408h

MOV DX, [BX]

POP DS

MOV AL, 7E

CALL 300h

MOV AL, BD

CALL 300h

MOV AL, DB

CALL 300h

MOV AL, E7

CALL 300h

MOV AL, E7

CALL 300h

MOV AL, DB

CALL 300h

MOV AL, BD

CALL 300h

MOV AL, 7E

CALL 300h

INT 20h

ORG 300h

MOV CX, 0FFFFh

AQUI: LOOP AQUI

RET

ORG 300h

MOV BX, 0FFh

ABC: MOV CX, 0FFFFh

AQUI: LOOP AQUI

DEC BX

JNZ ABC

RET

Ejercicio: Implemente un programa que envíe una secuencia de datos por el Puerto paralelo. En la localidad

200h se encuentran el número de veces que se repite la secuencia, en la localidad 201h indica el número de

bytes de la tabla y en la localidad 202h se encuentra el tiempo de espera.

MANEJO DE CARGAS GRANDES POR EL PUERTO PARALELO.

Para que un dispositivo de control sea útil, debe poder accionar componentes de

consumo alto de energía. Debido al bajo voltaje y baja corriente de las líneas del puerto se

requiere “amplificar” esta señal.

Existen tres formas de amplificar:

- Drivers integrados.

- Transistores

- Relevadores.

Page 43: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

43

Drivers integrados.

Transistores.

Relevadores.

Ejercicio: Implemente un programa que lea un byte de datos por el Puerto paralelo. Una vez capturado ese

byte, dejarlo reflejado en la dirección base del puerto paralelo.

PUSH DS

XOR AX, AX

MOV DS, AX

MOV BX, 408h

MOV DX, [BX]

POP DS

INC DX

INC DX

MOV AL, 4h

OUT DX, AL ; Forza al puerto para que sea entrada

IN AL, DX ; Lee B+2

AND AL, 0FH ; Elimina nibble alto

MOV BL, AL

DEC DX ; Apunta B+1

IN AL, DX ; Lee B+1

AND AL, 0F0H ; Apaga nibble bajo

ADD AL, BL ; Concatena

XOR AL, 1000 1011b ; Regresa líneas invertidas a normal

DEC DX ; Apunta Base

OUT DX, AL

INT 20h

Page 44: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

44

Cuarta Unidad: MANEJO DE PUNTO FLOTANTE

1. Introducción al punto fijo y punto flotante. Las computadoras no almacenan los números con precisión infinita sino de forma

aproximada empleando un número fijo de bits (Binary Digit) o bytes (grupos de ocho bits).

Prácticamente todos las computadoras permiten al programador elegir entre varias

representaciones o 'tipos de datos'. Los diferentes tipos de datos pueden diferir en el número

de bits empleados, pero también en cómo el número representado es almacenado: en

formato fijo (también denominado 'entero') o en punto flotante (denominado 'real').

Aritmética de punto fijo

Un entero se puede representar empleando todos los bits de una palabra de

computadora, con la salvedad de que se debe reservar un bit para el signo. Por ejemplo, en

una máquina con longitud de palabra de 32 bits, los enteros están comprendidos entre -(231

- 1) y 231

- 1 = 2147483647. Un número representado en formato entero es 'exacto'. Las

operaciones aritméticas entre números enteros son también 'exactas' siempre y cuando:

1. La solución no esté fuera del rango del número entero más grande o más pequeño que se

puede representar (generalmente con signo). En estos casos se dice que se comete un error

de desbordamiento por exceso o por defecto (en inglés: Overflow y Underflow) y es

necesario recurrir a técnicas de escalado para llevar a cabo las operaciones.

2. La división se interpreta que da lugar a un número entero, despreciando cualquier resto.

Por estos motivos, la aritmética de punto fijo se emplea muy raramente en cálculos no

triviales.

2. Definición de NEF, Punto fijo y Punto flotante.

NEF: Es la representación estructural de un número en punto fijo, el cual indica el tamaño

del número (cantidad de bits), así como la cantidad de bits de la parte entera y la cantidad

de bits de la parte fraccional, la representación es la siguiente:

NEF (cantidad total de bits, no. de bits de la parte entera, no. de bits de la parte fraccional).

NEF (n, n1. n2).

Por ejemplo:

NEF (16, 8, 8): Indica que la cantidad total de bits de un numero en representación en punto

fijo es de 16 bits, 8 bits para la parte entera y 8 bits para la parte fraccional.

3. Punto fijo. La representación en punto fijo aplica para sistemas de numeración con signo o

sistemas de numeración sin signo.

Page 45: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

45

Números sin signo: Son números positivos y toman la cantidad de bits para la parte entera

positiva con un rango de (0.0 hasta 2n1

-1.2

21

1

2

n

n para n2>=1).

Números con signo: Son números que toman el bit mas significativo para el signo, 0 para

números positivos y 1 para números negativos con un rango de (-2n1-1

.2

21

1

2

n

n hasta 2

n1-1-1.

2

21

1

2

n

n para n2>=1). Si el número es negativo recuerde aplicar el complemento a dos a

todos los bits.

Recordemos que la representación en binario con punto fijo es la siguiente:

24 2

3 2

2 2

1 2

0 punto 2

-1 2

-2 2

-3 2

-4 2

-5

16 8 4 2 1 . 0.5 0.25 0.125 0.0625 0.03125

TRUCO RANCHERO PARA CONVERTIR LA PARTE FRACCIONAL:

Se debe multiplicar por dos el numero fraccional, si el resultado es mayor o igual a

1, se resta 1 y se coloca un bit 1, en la posición, se repite la operación tomando el resultado

de la resta anterior, y así sucesivamente hasta completar el numero de bits de la parte

fraccional. Al realizar las multiplicaciones por 2, puede darse el caso que nos arroje un

valor 1, en este caso la serie terminaría y colocamos un 1 en la posición del bit, ya que nos

indica que el valor ya esta representado.

Ejemplo:

Obtener en binario el numero 0.8125

2(0.8125) 1.625 0.625 1

2(0.625) 1.25 0.25 1

2(0.25) 0.5 0.5 0

2(0.5) 1 0 1

Para este ejemplo el numero seria: 0.1101

Ejemplo: Represente los siguientes números en decimal, a una representación en punto fijo,

utilizando un nef (8,4,4).

Números sin signo:

14.625 = 1110.1010

12.76 = 1100.1100

5.87 = 0101.1101

Números con signo

-5.75 = 1010.0100 ya que

5.75 = 0101.1100 con complemento a dos es 1010.0100

Page 46: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

46

-7.375 = 1000.1010

7.375 = 0111.0110 con complemento a dos es 1000.1010

Ejemplo suma en punto fijo (-5.75 + 5.8125)

1010.0100 + 0101.1101 = 0000.0001

En decimal seria 0. 0625

4. Punto flotante. En una computadora típica los números en punto flotante se representan de la

manera descrita en el apartado anterior, pero con ciertas restricciones sobre el número de

dígitos de q y m impuestas por la longitud de palabra disponible (es decir, el número de bits

que se van a emplear para almacenar un número). Para representar un número en punto

flotante, los bits se acomodan del siguiente modo:

Signo del número real x: 1 bit

Signo del exponente m: 1 bit

Exponente (entero |m|): 7 bits

Mantisa (número real |q|): 23 bits

En la mayoría de los cálculos en punto flotante las mantisas se normalizan, es decir,

se toman de forma que el bit más significativo (el primer bit) sea siempre '1'.

Dado que la mantisa siempre se representa normalizada, el primer bit en q es

siempre 1, por lo que no es necesario almacenarlo proporcionando un bit significativo

adicional. Esta forma de almacenar un número en punto flotante se conoce con el nombre

de técnica del 'bit fantasma'.

Además puede representarse exactamente con |m| ocupando 7 bits y |q| ocupando 24

bits. La restricción de que |m| no requiera más de 7 bits significa que:

Ya que , puede manejar números tan pequeños como 10-38

y tan

grandes como 1038

. Este no es un intervalo de valores suficientemente generoso, por lo que

en muchos casos debemos recurrir a programas escritos en aritmética de doble precisión e

incluso de precisión extendida.

Como q debe representarse empleando no más de 24 bits significa que nuestros

números de máquina tienen una precisión limitada cercana a las siete cifras decimales, ya

que el bit menos significativo de la mantisa representa unidades de . Por

tanto, los números expresados mediante más de siete dígitos decimales serán objeto de

aproximación cuando se almacenen en el ordenador.

Page 47: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

47

Ejemplo: Convertir los siguientes números decimales a punto flotante de 32 bits.

Recordemos que la estructura del punto flotante es de la siguiente manera:

Signo (1 bit) Signo Exponente (1 bit) Exponente (7 bits) Mantisa (23 bits)

También recordemos que el exponente base es 127.

35.8125 =

100011.1101

Normalizando nos queda: 1.000111101 se recorrió el punto 5 veces hacia la izquierda

entonces se debe de sumar al exponente base.

Exponente: 127+5 = 132 en binario seria: 10000100

Ahora como el número es positivo seria 0 en el signo y tomando la parte fraccional para la

mantisa nos quedaría:

0 10000100 000111101 00000000000000 en hexadecimal seria

420F4000

0.375 =

0.011

Normalizando nos queda: 1.1 se recorrió el punto 2 veces hacia la derecha entonces se debe

de restar al exponente base.

Exponente: 127-2 = 125 en binario seria: 01111101

Ahora como el número es positivo seria 0 en el signo y tomando la parte fraccional para la

mantisa nos quedaría:

0 01111101 10000000000000000000000 en hexadecimal seria

3EC00000

-35.8125 =

100011.1101 es 35.8125

Normalizando nos queda: 1.000111101 se recorrió el punto 5 veces hacia la izquierda

entonces se debe de sumar al exponente base.

Exponente: 127+5 = 132 en binario seria: 10000100

Ahora como el número es negativo seria 1 en el signo y tomando la parte fraccional para la

mantisa nos quedaría:

1 10000100 000111101 00000000000000 en hexadecimal seria

C20F4000

-0.375 =

0.011 es 0.375

Normalizando nos queda: 1.1 se recorrió el punto 2 veces hacia la derecha entonces se debe

de restar al exponente base.

Exponente: 127-2 = 125 en binario seria: 01111101

Ahora como el número es negativo seria 1 en el signo y tomando la parte fraccional para la

mantisa nos quedaría:

1 01111101 10000000000000000000000 en hexadecimal seria

BEC00000

Page 48: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

48

Quinta Unidad: INTERRUPCIONES DEL DOS Y BIOS

Para hacer uso de los recursos de una computadora es posible utilizar subrutinas del

sistema operativo siempre y cuando estén documentadas. Las primeras computadoras no

permitían que los programadores hicieran uso de están facilidades.

1. Estructura del MS-DOS.

Rutinas de ROM (Trabajadores): Es quien realmente trabaja, y se encuentran las rutinas

que mueven datos de hardware al software y viceversa, manejan bytes y están ubicadas en

una memoria física de la computadora (BIOS EPROM).

IBMBIOS (Capataz): Esta parte viene en los discos como un archivo oculto, cualquier

llamada a la rutina de ROM debe pasar por aquí. Si hubiera alguna falla en las rutinas aquí

se corrige, también se incluye un mapa de la ubicación y finalidad de cada rutina de ROM.

IBMDOS (Gerente): Es el otro archivo oculto, no atiende detalles de bytes, trabaja con

sectores cuando llama al disco, principalmente ve todo como archivos. También incluye

algunas subrutinas al sistema operativo.

Command (Gerente General): Es la interfaz con el usuario, se encarga de recibir las

órdenes, validarlas y pasarlas a las capas de más abajo. Por ejemplo, es quien mantiene el

mensaje c:\>_.

En las rutinas del DOS son 256, las cuales se invocan con la interrupción 21H y se eligen

en el número adecuado en AH.

MOV AH, 00H MOV AH, 0FFH

INT 21H INT 21H

Page 49: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

49

2. Vector de Interrupciones.

Una interrupción es una llamada generada por el hardware (derivada en el exterior

por una señal de hardware) o una llamada generada por el software (derivada en el interior

por una instrucción). Cualquiera de ella interrumpirá el programa porque llamara a un

procedimiento para servicio de interrupción o un manejador de interrupción.

Numero Función 0 Error al dividir.

1 Paso a paso.

2 Terminal de interrupción (depurar).

3 Punto de ruptura.

4 Sobre flujo aritmético.

5 Imprimir clave de pantalla e instrucción BOUND.

6 Error por instrucción ilegal.

7 Interrupción por coprocesador no presente.

8 Tictac de reloj (hardware).

9 Teclado (hardware).

A Interrupción 2 de hardware (bus del sistema)

B-F Interrupciones de hardware 3 a 7 en hardware.

10 BIOS de video.

11 Entorno del equipo.

12 Memoria de tamaño normal.

13 Servicio directo al disco.

14 Servicio al puerto COM serial.

15 Servicio diverso.

16 Servicio al teclado.

17 Servicio LPT a puerto paralelo.

18 ROM BASIC.

19 Borrar y restaurar.

1A Servicios al reloj.

1B Manejador de control de ruptura.

1C Servicio a temporizador del usuario.

1D Apuntador para tabla de parámetros para monitor.

1E Apuntador para tabla de parámetros de unidad de disco.

1F Apuntador para tabla de patrón de caracteres gráficos.

20 Terminar el programa.

21 Servicio DOS.

22 Manejador de terminación del programa.

23 Manejador de control C.

24 Manejador de error critico.

25 Leer disco.

26 Escribir disco.

27 Terminar y permanecer residente.

28 DOS ocioso.

2F Manejador múltiple.

70-77 Interrupciones 8 a 15 en el hardware.

Page 50: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

50

3. Interrupción 21H.

Las interrupciones de servicio DOS, es por medio de la interrupción 21H, donde se

deja el servicio en el registro AH, y seguido de esto la instrucción INT 21H, la cual ejecuta

la interrupción del servicio DOS.

3.1 Servicio 02 Display. El servicio 2 de la interrupción 21H es:

Output Character (Salida de carácter a pantalla):

Registro al entrar:

AH = 2

DL = carácter (valor ASCII).

Registro al regresar:

Sin cambios.

Sintaxis: Solo en TASM

MOV DL, „*‟ ; Imprime

MOV AH, 2 ; un

INT 21H ; asterisco

Ctrl – Break : Interrumpe al estar imprimiendo.

Ejercicio: Escriba en ensamblador un programa que limpia la pantalla.

MOV CX, 07D0H

ACA: MOV DL, „b‟

MOV AH, 2

INT 21H

LOOP ACA

INT 20H

3.2 Servicio 09 Display. El servicio 9 de la interrupción 21H es:

Output Character String (Salida de una cadena de caracteres a pantalla):

Registro al entrar:

AH = 9

DX = Offset de la dirección del string.

DS = Segmento de la dirección del string.

Registro al regresar:

Sin cambios.

El string debe terminar con $.

Page 51: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

51

Ejercicio: Escriba en ensamblador un programa que despliegue en pantalla “arriba las

chivas”.

MOV DX, CAD

MOV AH, 9

INT 21H

INT 20H

CAD: db „arriba las chivas $‟

DATA SEGMENT

MENS DB „ARRIBA LAS CHIVAS‟,10,13,‟$‟

MEN1 DB „VIVA LA REVOLUCION $‟

ENDS

STACK SEGMENT

DW 128 DUP (0)

ENDS

CODE SEGMENT

MOV AX, DATA

MOV DS, AX

MOV DX, OFFSET MENS

MOV AH, 9

INT 21H

MOV DX, OFFSET MEN1

INT 21H

MOV AH, 4CH

INT 21H

ENDS

3.3 Servicio 01 Keyboard Input. El servicio 1 de la interrupción 21H es:

Character Input With Echo (Entrada de carácter con eco):

Registro al entrar:

AH = 1

Registro al regresar:

AL = carácter

SINTAXIS:

MOV AH, 1

INT 21H

OTRO: MOV AH, 1

INT 21H

JMP OTRO

El servicio 8 de la interrupción 21H es:

Character Input Without Echo (Entrada de carácter sin eco):

Registro al entrar:

AH = 8

Registro al regresar:

AL = carácter

SINTAXIS:

MOV AH, 8

INT 21H

OTRO: MOV AH, 8

INT 21H

JMP OTRO

Page 52: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

52

3.4 Servicio 0AH Buffered Keyboard Input. El servicio 0AH de la interrupción 21H es:

Buffered Input (Entrada de una cadena de caracteres):

Registro al entrar:

AH = 0AH

DX = Offset del buffer.

DS = Segmento del buffer.

Registro al regresar:

Sin cambios.

Comentario:

Primer byte del buffer es la cuenta máxima de caracteres.

Segundo byte del buffer es el número real de caracteres escritos.

Ejemplo: MOV DX, CAD

MOV AH, 0AH

INT 21H

INT 20H

CAD: db 20H

3.5 Servicio 05 Printer Output. El servicio 05H de la interrupción 21H es:

Printer Output (Salida de caracteres a impresora):

Registro al entrar:

AH = 05H

DL = Carácter valor ASCII.

Registro al regresar:

Sin cambios.

Comentario:

Primer byte del buffer es la cuenta máxima de caracteres.

Segundo byte del buffer es el número real de caracteres escritos.

SINTAXIS:

MOV DL, „_‟

MOV AH ,5

INT 21H

Page 53: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

53

Ejercicio: Escriba en ensamblador un programa que imprima UAA <CR> <LF>.

MOV DL, „U‟

MOV AH ,5

INT 21H

MOV DL, „A‟

MOV AH ,5

INT 21H

MOV DL, „A‟

MOV AH ,5

INT 21H

MOV DL, 0DH

MOV AH ,5

INT 21H

MOV DL, 0AH

MOV AH ,5

INT 21H

INT 20H

3.6 Servicios para lectura del reloj de tiempo real. GET SYSTEM DATE (Servicio 2Ah)

Este servicio obtiene la fecha del sistema:

Registro al entrar:

AH = 2Ah

Registro al regresar:

AL = Día de la semana (0 = Domingo, 1 = Lunes, . . )

CX = Año

DH = Mes

DL = Día

SINTAXIS:

MOV AH ,2Ah

INT 21H

SET SYSTEM DATE (Servicio 2Bh)

Este servicio ingresa una fecha determinada al sistema:

Registro al entrar:

AH = 2Bh

CX = Año (1980 - 2099)

DH = Mes (1 - 12)

DL = Día (1 - 31)

Registro al regresar:

AL = Byte de estado (status byte)

(Si AL = 0 se ingreso fecha correcta, AL = 0FFh se ingreso fecha incorrecta)

SINTAXIS:

MOV AH ,2Bh

MOV CX, 2004

MOV DH, 6

MOV DL, 23

INT 21H

Page 54: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

54

GET SYSTEM TIME (Servicio 2Ch)

Este servicio obtiene el tiempo del sistema:

Registro al entrar:

AH = 2Ch

Registro al regresar:

CH = Hora (formato militar 0 – 23)

CL = Minuto (0 - 59)

DH = Segundo (0 - 59)

DL = Centésima de segundo (0 - 99)

SINTAXIS:

MOV AH ,2Ch

INT 21H

SET SYSTEM TIME (Servicio 2Dh)

Este servicio ingresa una hora determinada al sistema:

Registro al entrar:

AH = 2Dh

CH = Hora (0 – 23)

CL = Minuto (0 - 59)

DH = Segundo (0 - 59)

DL = Centésima de segundo (0 - 99)

Registro al regresar:

AL = Byte de estado (status byte)

(Si AL = 0 se ingreso fecha correcta, AL = FFh se ingreso fecha incorrecta)

NOTA: No actualiza el reloj de tiempo real.

SINTAXIS:

MOV AH ,2Dh

MOV CH, 12

MOV CL, 46

MOV DH, 35

MOV DL, 5

INT 21H

Existen otras interrupciones que no son muy utilizadas, pero es posible consultar el manual

de IBM llamado DOS INTERRUPTS.

Page 55: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

55

INTERRUPCIONES DEL BIOS

Subrutinas del BIOS.

Conforman el nivel mas bajo del DOS, se puede clasificar como las siguientes

categorías.

Servicio del teclado.

Servicio del video.

Servicio del disco.

Servicio de la impresora.

Servicio de comunicaciones.

Servicio de la fecha y hora.

Servicio del sistema.

Servicios del teclado.

Scan-Code: Es un código que genera el microcontrolador del teclado para indicar que hay

alguna tecla presionada. Todas las teclas excepto cuatro: Shift, Caps Lock, Alt y ctrl.

Tienen scan code, pero no todas las teclas producen código ASCII. Las rutinas del BIOS

regresan ambos códigos, el código ASCII y el scan-code.

Read Keyboard Carácter (Servicio 0, Interrupción 16h)

Este servicio lee un carácter desde teclado:

Registro al entrar:

AH = 0

Registro al regresar:

AH = Scan code

AL = Código ASCII SINTAXIS:

MOV AH , 0

INT 16H

MOV SCAN_CODE, AH

MOV ASCII_KEY, AL

Read Keyboard Status (Servicio 1, Interrupción 16h)

Este servicio lee un carácter desde teclado:

Registro al entrar:

AH = 1

Registro al regresar:

AH = scan code

AL = código ASCII

SINTAXIS:

MOV AH , 1

INT 16H

JZ NO_KEY

MOV SCAN_CODE, AH

MOV ASCII_KEY, AL

NO_KEY:

Page 56: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

56

Este servicio es similar al anterior, examina el buffer de teclado. Pero además afecta

la bandera cero. Si hay una tecla pendiente de leer la bandera cero se limpia, en caso

contrario la bandera cero se pone en 1. Tampoco detecta las teclas que no generan código

de scan-code.

Read Keyboard Shift Status (Servicio 2, Interrupción 16h)

Este servicio regresa el estado de la tecla presionada:

Registro al entrar:

AH = 2

Registro al regresar:

AL = Shift status (ver tabla)

SINTAXIS:

MOV AH , 2

INT 16H

Existen otros servicios que no son muy útiles, por ejemplo ajustar la velocidad de

repetición, verificar si el teclado es extendido o no, escribir en el buffer del teclado y otras

mariguanadas.

Servicios de la impresora.

Print Character (Servicio 0, Interrupción 17h)

Este servicio imprime un carácter en una impresora determinada:

Registro al entrar:

AH = 0

AL = Carácter

DX = Impresora a usar

Registro al regresar:

AH = Printer status (ver tabla)

SINTAXIS:

MOV AL, „*‟

MOV DX, 0

MOV AH , 0

INT 17H

Printer Status

Page 57: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

57

Initialize Printer (Servicio 1, Interrupción 17h)

Este servicio inicializa la impresora:

Registro al entrar:

AH = 1

DX = Impresora a usar (0 = LPT1, 1 = LPT2, 2 = LPT3)

Registro al regresar:

AH = Printer status (ver tabla)

SINTAXIS:

MOV DX, 0 ; Al inicializar mandamos 08 y 0C

MOV AH , 1 ; La misma interrupción manda los dos valores

INT 17H

Printer Status

4. Interrupción 10h, Servicios del video.

La interrupción 10h permite manipular la tarjeta de video para desplegar texto y

graficas, otros servicios permiten definir el tamaño del cursor, leer lápiz óptico, definir

ventana, etc.

Atributos de un carácter.

B800 Segmentos de

B000 memoria de video

Page 58: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

58

Ejercicio: Escriba en ensamblador un programa que despliegue un A con un atributo de destello normal,

fondo negro, intenso y el frente blanco.

MOV AX, B800h

MOV DS, AX

MOV BX, 0

MOV AL, 41h ; Ascii de la letra A

MOV [BX], AL

INC BX

MOV AL, 0Fh

MOV [BX], AL

INT 20h

Ejercicio: Escriba en ensamblador un programa limpie la pantalla utilizando el segmento de video.

MOV AX, B800h

MOV DS, AX

MOV BX, 0

MOV CX, 07D0h ; 2000 localidades

aca: MOV AX, 07 20h ; 07 porque es el atributo y 20 porque es el Ascii de la barra espaciadora.

MOV [BX], AX

INC BX

INC BX

LOOP aca

INT 20h

Scroll Active Page Up (Servicio 6, Interrupción 10h)

Este servicio roda la pantalla a una configuración determinada:

Registro al entrar:

AH = 0

CH = Renglón superior izquierdo

CL = Columna superior izquierdo

DH = Renglón inferior derecho

DL = Columna inferior derecho

AL = 0 ; Cuando AL=0 limpia la pantalla

Registro al regresar:

Sin cambios.

Ejercicio: Escriba en ensamblador un programa espejo.

MOV DX, aca

MOV AH, 0Ah

INT 21h

MOV DL, 0Dh

MOV AH, 2

INT 21h

MOV DL, 0Ah

MOV AH, 2

INT 21h

MOV DX, aca + 2

MOV AH, 9

INT 21h

INT 20h

aca: DB 20h

Page 59: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

59

Existen servicios para rodar la ventana hacia abajo, escribir caracteres gráficos,

cambiar el tamaño y la forma del cursor, escribir píxeles, colocar el cursor en alguna

localidad, leer la posición actual del cursor, etc.

Write Dot (Servicio 0Ch, Interrupción 10h)

Este servicio imprime un punto en una coordenada específica:

Registro al entrar:

AH = 0Ch

CX = Columna

DX = Renglón

Registro al regresar:

Sin cambios.

Ejercicio: Escriba en ensamblador un programa para dibujar una línea horizontal, de puntos.

MOV DX, 0 ; Primer renglón

MOV CX, 0 ; Inicio de la línea horizontal

otro: MOV AL, 1 ; Define el color

MOV AH, 0Ch ; Funcion write dot

INT 10h ; Llamada al BIOS

INC CX ; Siguiente punto

CMP CX, 300h ; Lista todos los puntos

JL otro ; Aun no

INT 20h

5. Interrupciones para el puerto serie.

Conector DB25 y Conector DB9.

Page 60: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

60

CONECTOR DB9

1. Carrier Detect (Portador detector)- Determina si el modem está conectado a una

línea telefónica en funcionamiento.

2. Receive Data (Receptor)- La computadora recibe la información enviada por el

modem.

3. Transmit Data (Transmisor)- La computadora envía información al modem.

4. Data Terminal Ready - La computadora le dice al modem que está listo para hablar.

5. Signal Ground (Tierra)- Este pin es aterrizado.

6. Data Set Ready - El Modem le dice a la computadora que esta listo para hablar.

7. Request To Send (Solicitar para envió)- La computadora le pregunta al modem si

esta puede enviar información.

8. Clear To Send - El modem le dice a la computadora que ya le puede enviar

información.

9. Ring Indicator - Una vez que una llamada ha tomado lugar, la computadora

reconoce por esta señal (enviada por el modem) que una llamada es detectada.

CONECTOR DB25

1. No utilizado.

2. Transmit Data (Transmisor)- La computadora envía información al modem.

3. Receive Data (Receptor)- La computadora recibe la información enviada por el

modem.

4. Request To Send (Solicitar para envío)- La computadora le pregunta al modem si

esta puede enviar información.

5. Clear To Send - El modem le dice a la computadora que ya le puede enviar

información.

6. Data Set Ready - El Modem le dice a la computadora que esta listo para hablar.

7. Signal Ground - Este pin es aterrizado.

8. Received Line Signal Detector - Determina si el modem está conectado a una línea

telefónica en funcionamiento.

9. No utilizado.

10. No utilizado.

11. No utilizado.

12. No utilizado.

13. No utilizado.

14. No utilizado.

15. No utilizado.

16. No utilizado.

17. No utilizado.

18. No utilizado.

19. No utilizado.

20. Data Terminal Ready - La computadora le dice al modem que está lista para hablar.

21. No utilizado.

22. Ring Indicator - Una vez que una llamada ha tomado lugar, la computadora

reconoce por esta señal (enviada por el modem) que una llamada es detectada.

23. No utilizado.

24. No utilizado.

25. No utilizado.

Page 61: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

61

Los voltajes enviados por los pines pueden ser en 2 estados, Encendido o Apagado.

Encendido (valor binario de "1") significa que el pin está transmitiendo una señal entre -3 y

-25 volts, mientras que Apagado (valor binario de "0") quiere decir que está transmitiendo

una señal entre +3 y +25 volts.

Velocidades de la transmisión y recepción. /* Default 0x03 = 38,400 BPS */

/* 0x01 = 115,200 BPS */

/* 0x02 = 56,700 BPS */

/* 0x06 = 19,200 BPS */

/* 0x0C = 9,600 BPS */

/* 0x18 = 4,800 BPS */

/* 0x30 = 2,400 BPS */

/* 0x60 = 1,200 BPS */

/* 0xC0 = 600 BPS */

PROGRAMA QUE ENVIA Y RECIBE DATOS POR EL PUERTO SERIE

CONFIGURADO A UNA VELOCIDAD DE 9600BPS, 8 BITS, SIN PARIDAD Y 1 BIT

DE PARADA.

PROGRAMA ENSAMBLADOR

code segment

call init_port

otro: mov ah,1H

int 16H

jz no_key

mov ah,0H

int 16H

cmp al,1BH

jz fin

mov dx,3F8H

out dx,al

mov ah,2H

mov dl,al

int 21H

no_key: mov dx,3FDH ;direcciona a base+5

in al,dx

and al,01

cmp al,01

jnz otro

mov dx,3F8H

in al,dx

mov dl,al

mov ah,2H

int 21H

jmp otro

fin: mov ah,4CH

int 21H

;------------------inicializa el puerto a 2400 Bd----------------------------

init_port: mov dx,3FBH

mov al,80H

out dx,al

mov dx,3F8H

Page 62: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

62

mov al,0CH

out dx,al

mov dx,3F9H

mov al,0H

out dx,al

mov dx,3FBH

mov al,3H

out dx,al

mov dx,3FAH

mov al,0C7H

out dx,al

mov dx,3FCH

mov al,0BH

out dx,al

ret

ends

PROGRAMA ENSAMBLADOR Y C

#include "stdio.h"

#include "conio.h"

#include "dos.h"

void inicia();

void enviar(char car);

void lectura();

int dbase=0x3F8;

int base1=0x3F9;

int base2=0x3FA;

int base3=0x3FB;

int base4=0x3FC;

int base5=0x3FD;

int est=0, salir=0;

char car;

void main()

{

inicia();

clrscr();

do

{

if (kbhit())

{

textcolor(1);

car=getche();

if (car==27)

salir=1;

enviar (car);

}

lectura();

}while(salir!=1);

}

void inicia()

{ /* PORT 1 - ESPECIFICACIONES DEL PUERTO SERIE */

asm{

mov dx,base3

mov al,0x80 /*SET DLAB ON*/

Page 63: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

63

out dx,al

mov dx,dbase

mov al,0x0C /*SET BAUD RATE DIVISOR LATCH LOW BYTE*/

out dx,al

mov dx,base1

mov al,0x00 /*SET BAUD RATE DIVISOR LATCH HIGH BYTE*/

out dx,al

mov dx,base3

mov al,0x03 /* 8 BITS, NO PARITY,1 STOP BIT*/

out dx,al

mov dx,base2

mov al,0xc7 /* FIFO CONTROL REGISTER*/

out dx,al

mov dx,base4

mov al,0x0b /*TURN ON DTR, RTS, AND OUT2*/

out dx,al

}

}

void enviar(char car)

{

while(est==0)

{

asm{

mov dx,base5

in al,dx

and al,0x20

mov ah,0x00

mov est,ax

}

}

asm{

mov dx,dbase

mov al,car

out dx,al

}

}

void lectura()

{

asm{

mov dx,base5

in al,dx

and al,0x01

mov car,al

}

if (car)

{

asm{

mov dx,dbase

in al,dx

mov car,al

}

textcolor(4);

cprintf("%c",car);

}

}

Page 64: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

64

6. Generación de sonido enviando pulsos s la bocina. Es el método fácil, se escriben ceros y unos en el bit 1 del puerto 61h.

Ejercicio: Escriba en ensamblador un programa que genere un sonido llamado “Ruido Blanco”.

IN AL, 61h

ADD AL, 0FCh

toggle: XOR AL, 2

OUT 61h, AL

MOV CX, 140h

aquí: LOOP aquí

JMP toggle

INT 20h

Ejercicio: Escriba en ensamblador un programa que genere sonido en todas las frecuencias.

; RUIDO BLANCO

; Genera un sonido en todas las frecuencias

; No se detiene, solo con RESET

stack segment

Dw 128 dup(0)

ends

code segment

inicio: MOV DX, 140h ; Valor inicial de espera

IN AL, 61h ; Lee el puerto 61h

ADD AL, 11111100b ; Apaga bits 0 y 1

sound: XOR AL, 2 ; Realiza el toggle al bit 1

OUT 61h, AL ; Salida al puerto 61h

ADD DX, 9248h ; Suma patron aleatoria

MOV CL, 3 ; Define rotación en 3 bits

ROR DX, CL ; Lo rota

MOV CX, DX ; Lo copia en cx

AND CX, 1FFh ; Apaga 7 bits altos

OR CX, 10h ; Se asegura que no sea muy corto

aquí: LOOP aquí

JMP sound

MOV AH, 4Ch ; Program Terminate

INT 21h

ends

Page 65: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

65

7. Generación de sonidos usando el Timer Programable. Las PC‟s incluyen un chip con tres TIMERS, se usan para las siguientes funciones:

1. DMA.

2. Reloj del sistema.

3. Generación de sonidos.

Ejercicio: Escriba en ensamblador un programa que genere un tono de sonido.

Stack segment

Dw 128 dup(0)

Ends

Code segment

MOV BX, 777h ; Valor del tono

MOV AL, 10110110b ; Número mágico

OUT 43h, AL ; Lo pasa al Timer 2

MOV AX, BX ; Carga tono

OUT 42h, AL ; Parte baja del puerto 42h

MOV AL, AH

OUT 42h, AL ; Parte alta del puerto 42h

IN AL, 61h ; Lee puerto 61h

OR AL, 3 ; Prende bit 0 y 1

OUT 61h, AL ; Salida del puerto 61h

MOV AH, 4Ch ; Program Terminate

INT 21h

ends

Ejercicio: Escriba en ensamblador un programa que genere un sonido como SIRENA.

; SIRENA

; Usa el Timer 2 para sumar la sirena

Stack segment

Dw 128 dup(0)

ends

Code segment

MOV BX, 0FFFFh ; Valor del tono

MOV AL, 10110110b ; Número mágico

OUT 43h, AL ; Lo pasa al Timer 2

tono: MOV AX, BX ; Carga tono

OUT 42h, AL ; Parte baja del puerto 42h

MOV AL, AH

Page 66: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

66

OUT 42h, AL ; Parte alta del puerto 42h

IN AL, 61h ; Lee puerto 61h

OR AL, 3 ; Prende bit 0 y 1

OUT 61h, AL ; Salida del puerto 61h

DEC BX ; Cambia de tono

MOV CX, 100d ; Carga un valor para retardo

aquí: LOOP aquí ; Genera un retardo

JMP tono

MOV AH, 4Ch ; Program Terminate

INT 21h

ends

Programa Piano

El siguiente programa genera tonos de frecuencia fija, que corresponden a la octava

4 de un piano. (El libro PC Interno de Tischer pag 747 contiene un programa con 8

octavas). Se usan las siguientes frecuencias:

Tecla Nota Frecuencia

1 DO 262

2 RE 294

3 MI 330

4 FA 347

5 SOL 392

6 LA 440

7 SI 494

8 DO 524

Nota: Teclas de los números que están en la parte superior, no las del teclado numérico.

; PIANO

; Usa el Timer 2 del 8253 para generar notas de la escala musical

Data segment

nota DW 262, 294, 330, 347, 392, 440, 494

ends

stack segment

dw 128 dup(0)

ends

code segment

mov ax, data

mov ds, ax

read_key:

lea bx, nota

mov ah, 8

Page 67: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

67

int 21h

cmp al, 1bh

jz exit

sub al, 31h

shl al, 1

cbw

add bx, ax

mov al, 10110110b

out 43h, al

mov ax, [bx]

out 42h, al

mov al, ah

out 42h, al

in al, 61h

or al, 3

out 61h, al

jmp read_key

exit:

in al, 61h

and al, 11111100b

out 61h, al

mov ah, 4ch

int 21h

ends

Sexta Unidad: INTERFASE CON LENGUAJE C

1. Introducción a la interface con Ensamblador. La interface del lenguaje de programación C con ensamblador es de suma

importancia ya que con ello podemos manipular dispositivos y/o hardware, ya que con solo

ensamblador es un poco mas tedioso, al realizar esto podemos realizar procedimientos y/o

funciones las cuales son utilizadas con mayor facilidad, también es conveniente utilizarla

para dar una mejor estética a los programas realizados e implementados también con

código en ensamblador, se recomiendo utilizar lenguaje ensamblador en rutinas para

obtener una buena precisión, o bien para tener una buena y rapida respuesta (velocidad),

por ejemplo en rutinas de tiempo .

2. Interface sin pase de parámetros.

La interface sin pase de parámetros es la implementación de código en ensamblador sobre

el lenguaje de programación C, la cual utilizamos funciones y/o procedimientos en el cual

no enviamos datos a las funciones y/o procedimientos invocados. Veremos unos ejemplos

para que quede un poco mas claro:

Page 68: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

68

Ejemplo 1:

//Declaracion de librerias

#include "iostream.h"

#include "conio.h"

//Declaracion de prototipos

void obtiene_puerto();

//Declaracion de variables globales

int puerto=0;

void main()

{

clrscr();

obtiene_puerto();

getch();

}

void obtiene_puerto()

{

asm{

push ds

xor ax, ax

mov ds, ax

mov bx, 408h

mov dx, [bx]

pop ds

mov puerto, dx

}

cout<<"El valor del puerto paralelo es "<<puerto;

}

Ejemplo 2:

//Declaracion de librerias

#include "iostream.h"

#include "conio.h"

//Declaracion de prototipos

int obtiene_puerto();

//Declaracion de variables globales

int puerto=0;

void main()

{

clrscr();

Page 69: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

69

puerto=obtiene_puerto();

cout<<"El valor del puerto paralelo es "<<puerto;

getch();

}

int obtiene_puerto()

{

asm{

push ds

xor ax, ax

mov ds, ax

mov bx, 408h

mov dx, [bx]

pop ds

mov puerto, dx

}

return (puerto);

}

3. Interface con pase de parámetros.

El pase de parámetros de las funciones hasta que vamos a utilizar se conoce como "por

valor". Esto quiere decir que cuando el control pasa a la función, los valores de los

parámetros en la llamada se copian a "variables" locales de la función, estas "variables" son

de hecho los propios parámetros.

Ejemplo 1:

//Declaracion de librerias

#include "iostream.h"

#include "conio.h"

//Declaracion de prototipos

void obtiene_suma(int n1, int n2);

//Declaracion de variables globales

int num1, num2, res;

void main()

{

clrscr();

cout<<"Introduce un numero ";

cin>>num1;

cout<<"Introduce otro numero ";

cin>>num2;

obtiene_suma(num1, num2);

cout<<"El resultado de la suma es "<<res;

Page 70: Lenguaje Ensamblador 8086 Plan 2009

M.C. Abel Díaz Olivares Lenguaje Ensamblador

70

getch();

}

void obtiene_suma(int n1, int n2)

{

asm{

mov ax, n1

mov bx, n2

add ax, bx

mov res, ax

}

}

Ejemplo 2:

//Declaración de librerias

#include "iostream.h"

#include "conio.h"

//Declaración de prototipos

int obtiene_suma(int n1, int n2);

//Declaración de variables globales

int num1, num2, res;

void main()

{

clrscr();

cout<<"Introduce un numero ";

cin>>num1;

cout<<"Introduce otro numero ";

cin>>num2;

res=obtiene_suma(num1, num2);

cout<<"El resultado de la suma es "<<res;

getch();

}

int obtiene_suma(int n1, int n2)

{

asm{

mov ax, n1

mov bx, n2

add ax, bx

mov res, ax

}

return (res);

}