You are on page 1of 59

M.C.

Abel Daz Olivares

Lenguaje Ensamblador

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 sern para utilizar la computadora como una herramienta para el control de procesos e interfaces en general.

EVALUACION La evaluacin debe ser diagnstica, formativa y sumaria bajo los siguientes lineamientos: 1. PARTE TERICA : Se realizaran 3 exmenes escritos con la siguiente ponderacin : 2 exmenes parciales 15% cada parcial 1 examen final 30% 2. PARTE PRCTICA: - Un trabajo final, con una ponderacin del 30% - N tareas, con una ponderacin 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 teora tener promedio mnimo de 6 en los exmenes. NOTA 3: Lenguaje a manejar: Turbo Ensamblador

PRIMERA UNIDAD: MICROPROCESADORES INTEL 80x86 Objetivo Especfico : 1. Conocer la historia de los 1. Evolucin de los microprocesadores de INTEL. microprocesadores, especialmente 2. Modelo de programacin. la serie 80x86 de INTEL. 3. Registro del microprocesador. 4. Banderas del Registro Status. 2. Conocer los registros del 8086 5. Modos de direccionamiento. 6. Juego de instrucciones. 7. Organizacin de la memoria

SEGUNDA UNIDAD: USO DEL TURBO ENSAMBLADOR Objetivo Especfico : 1. Reconocer las ventajas del 1. Introduccin al proceso de Ensamblado. Macroensamblador. 2. Estructura de programa. 3. Tipos y declaraciones. 2. Escribir programas sencillos 4. Programas en lnea recta. directamente con Turbo 5. Programas con lazos. Ensamblador. 6. Problemas aritmticos. 7. Manipulacin de datos. 8. Enmascaramiento con AND y OR. 9. Rotacin. TERCERA UNIDAD: INTERFASE CON EL PUERTO PARALELO Objetivo Especifico: Realizar interfaces sencillas con la 1. Ubicacin del puerto paralelo. computadora utilizando el puerto 2. Puerto Base, el puerto de salida. paralelo. 3. Puerto Base +1 el puerto de entrada. 4. Puerto Base +2 el puerto E-S.

M.C. Abel Daz Olivares

Lenguaje Ensamblador

CUARTA UNIDAD: INTERRUPCIONES DEL DOS Y BIOS Objetivo Especifico: 1. Estructura del MS-DOS. 1. Utilizar las funciones del MS-DOS. 2. Vector de interrupciones. 3. Interrupcin 21H. 2. Escribir programas que empleen a. Servicio 02 Display. los servicios de video. b. Servicio 09 Display. c. Servicio 01 Keyboard Input. 3. Escribir programas en d. Servicio 0AH Buffered Keyboard Input. macroensamblador que generen e. Servicio 05 Printer Output. sonido. f. Servicios para lectura del reloj de tiempo real. 4. Interrupciones para el puerto serie. 5. Generacin de sonido BIBLIOGRAFA FUNDAMENTAL: DE APOYO: 1. Lenguaje Ensamblador y Programacin para PC IBM y 2. Using Assembly Language. compatibles. Wyatt Peter Abel 3 Edition 3 Edicin QUE Prentice Hall 3. Pc Interno Tischer Marcombo

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Primera Unidad: MICROPROCESADORES INTEL 80x86


Lenguajes de alto nivel vs. Lenguajes de bajo nivel.

Ms amigable con el usuario, facilidad de programar.

o o o o

Visual Basic, Delphi, Visual fox, etc. Fortran, Basic, Pascal, Cobol. Java, C. Ensamblador.

Velocidad en procesamiento de instrucciones

o Hardware.

Lenguaje Visual Basic, Visual Fox, Delphi, etc. Fortran, Basic, Pascal, Cobol. Java, C. Ensamblador.

Ventaja Mejor presentacin, buena relacin tiempo invertido / resultados. Balance adecuado entre complejidad y facilidades del usuario. Realizados para programar. Existe facilidad de crear nuevos comandos. Los lenguajes son cortos y rpidos. Brecha semntica reducida. Todos los recursos del sistema estn disponibles.

Desventaja Se requiere en maquinas grandes. Dedicacin especial a ramas de la ciencia. Requiere ser programador. No es transportable.

1. La evolucin del microprocesador.


La historia dice que los antiguos babilonios empezaron a usar el baco (calculadora primitiva hechas con esferas ahuecadas), alrededor del ao 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 dcadas de 1940 y 1950, construidos con relevadores y tubos de vaco (bulbos). Ms adelante se utilizaron los transistores y los componentes electrnicos de estado slido para construir las poderosas computadoras de la dcada de 1960. Con el advertimiento de los circuitos integrados se llego al perfeccionamiento del microprocesador y de los sistemas de microcomputadoras.

M.C. Abel Daz Olivares

Lenguaje Ensamblador

AO
1671 1701 1800 1834 1943 1946 1960 1971

COMENTARIO
Blas Pascal, inventa una maquina que hace sumas y restas. Gottfried wilhen Von Leibnitz, desarrolla una maquina que multiplica y divide. Jacquard, desarrolla una tejedora programable con tarjetas perforadas. Charles Babbage, concibe la maquina analtica con 4 secciones: almacn (memoria), Taller (cpu), seccin de entrada y seccin de salida. Alan Touring crea la Colossus, la primera computadora, usaba bulbos y era de propsito militar. Eckert y Mauchely, en la universidad de pensilvania desarrollan ENIAC I con fines de investigacin. PDP I, de la compaa DEC para fines comerciales. Intel crea 4004, primer microprocesador para Bussicom una empresa Japonesa que vende calculadoras de bolsillo.

Evolucin de los microprocesadores.

AO 1971 1972 1973

1973

1977

1978 1982

PROCESADOR 4004 / 4040 8008 (20us por Instr.) 8080( micro moderno) (2us por instruccin) Era compatible con TTL F-8 (Fairchild), 6502 (MOS Tecnology), 68000 (Motorola), Z80 (Ziling) 8085 (1.3us por instruccin), generador de reloj, y controlador de sistema integrado. 8086 / 8088 (400ns inst) (carac a evolucionar mult y div) 80286 80386 80486 Pentium Pentium MMX

No. BITS 4 bits 8 bits 8 bits

MEMORIA 4Kb (4096) 16Kb 64Kb

INSTRUCCIONES 45 instrucciones 48 instrucciones 256 instrucciones

VEL 1 MHZ 1 MHZ 1 MHZ

8 bits

64Kb

256 instrucciones

1 MHZ

8 bits

64Kb

256 instrucciones

1 MHZ

16 bits 16 bits 32 bits 32 bits

1Mb 16Mb 64Mb 4 Gb

32 / 64 bits 4 Gb 64 bits 4 Gb

2.5MIP (millones de instrucciones por seg) 8 MIP (millones de instrucciones por seg) 16 MIP (millones de instrucciones por seg) 54 MIP (millones de instrucciones por seg) 100 MIP (millones de instrucciones por seg)

4.7 MHZ 16 MHZ 33 MHZ 66 MHZ 75 MHZ 233 MHZ

Tarea: Investigar las caractersticas de 12 microprocesadores y describirlas.

M.C. Abel Daz Olivares

Lenguaje Ensamblador

El microprocesador 8086 / 8088.

Se divide en dos partes funcionales: Execution Unit (EU- Unidad de Ejecucin). Bus Interfase Unit (BIU- Unidad de Bus de Interfase).

EU
AH BH CH DH SP BP SI DI AL BL CL DL CS DS SS ES

BIU

Unidad de control del bus.

BUS

ALU CU Flags

1 2 3 n
Cola de Instrucciones

IP

M.C. Abel Daz Olivares

Lenguaje Ensamblador

2. El modelo de programacin.
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 direccin.

Nombre 32 bits

NOMBRE

EAX EBX ECX EDX ESP EBP EDI ESI

AH AX AL BH BX BL CH CX CL DH DX DL SP BP DI SI

Acumulador ndice base Contador Datos Apuntador de pila Apuntador de base ndice destino ndice fuente

32 bits 16 bits
EIP
EFLAGS

IP FLAGS CS DS ES SS FS GS

Apuntador de Inst Banderas

Cdigo Datos Extra Pila No se le dan nombres especiales

M.C. Abel Daz Olivares

Lenguaje Ensamblador

3. Registros del microprocesador


Registros de propsito general. Los registros de propsito 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 propsito general incluyen: AX (Acumulador): Es el acumulador primario, posee dos caractersticas 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 ms rpido. BX (Base): Es un acumulador de propsito general que puede ser utilizado para calcular direcciones, a menudo conserva la direccin base (desplazamiento) de los datos que hay en memoria. Si la memoria es accesada con este registro los programas sern ms cortos y corrern ms rpidos. 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 instruccin LOOP. DX (Datos): Las instrucciones de I/O lo utilizan para definir la direccin del perifrico, algunas multiplicaciones y divisiones tambin 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 parmetros, especialmente cuando se programa en un ambiente de mltiples 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.

M.C. Abel Daz Olivares

Lenguaje Ensamblador

IP (Apuntador de instrucciones): Se utiliza siempre para direccionar a la siguiente instruccin que va a ejecutar el microprocesador. Esta relacionado con el registro CS que es el segmento de cdigo. Para formar la localidad real de la siguiente instruccin 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 continuacin aparece una lista de cada registro de segmento junto con su funcin en el sistema: CS (Cdigo): El segmento de cdigo es una seccin en la memoria que tiene los programas y procedimientos utilizados por los programas. El registro de segmento de cdigo define la direccin inicial de la seccin de memoria que tiene el cdigo (Es un registro de 16 bits que define el segmento de las instrucciones). DS (Datos): El segmento de datos es una seccin 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 instrucciones para cadenas. lo utilizan algunas

SS (Pila): El segmento de pila define la superficie de la memoria utilizada para la pila. La ubicacin del punto inicial de entrada a la pila, se determina por el registro apuntador de la pila. El registro BP tambin direcciona los datos que hay dentro del segmento de pila. FS y GS: Estos registros de segmento adicionales estn 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 condicin 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

D I T S

M.C. Abel Daz Olivares

Lenguaje Ensamblador

C (Acarreo): Indica un acarreo despus de una suma o un prstamo despus de una resta. La bandera de acarreo tambin indica condiciones de error en ciertos programas y procedimientos. Tambin se utiliza en algunas instrucciones de rotacin 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 nmero par o impar. Por ejemplo, si un nmero 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 despus de una suma o un prstamo despus 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 despus 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 operacin aritmtica o lgica es cero. Si Z=1, el resultado es cero, si Z=0 entonces el resultado no es cero. S (Signo): Indica el signo aritmtico del resultado despus 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 posicin del bit ms significativo se coloca en el bit de signo para cualquier instruccin que afecte las banderas. T (Trampa): Cuando se activa la bandera de trampa se habilita la caracterstica de depuracin del microprocesador. Mas adelante aparecen mayores detalles de esta caracterstica. I (Interrupcin): Controla el funcionamiento de la terminal de la entrada de INTR (Interrupcin externa). Si I=1 se habilita la interrupcin y si I=0 se deshabilita la entrada INTR. D (Direccin): Controla la seleccin 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 condicin que ocurre cuando se suman o restan nmeros 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 situacin de sobreflujo sealado por la bandera para la suma con signo. Para operaciones sin signo no se toma en cuenta esta bandera.

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 memoria y un registro. Ejemplo: bytes o palabra entre una localidad de

MOV DL, [300] MOV DX, [200] 00 01 02 19 98 00 01 02 98 19 Si se tiene el nmero 1998, en los procesadores Motorola se guarda de la forma Big Endan, en los procesadores Intel se almacena de la forma Little Endan.

Motorola Big Endan

Intel Little Endian

10

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 adems un desplazamiento. Ejemplo:

MOV AX, [BX + 4] Direccionamiento Relativo Base ms ndice: Transfiere bytes o palabra entre un registro y una localidad de memoria direccionada por un registro base ms un ndice ms 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 direccin de la memoria del operando. Ejemplo:

MOV AX, [EBX + 4*EDI]

EJERCICIOS: Determine que tipo de direccionamiento es para cada instruccin. MOV [BX + 4], AX MOV AX, [BX + SI + 4] MOV [EBX + 2*ESI], AX MOV AX, BX MOV AX, [1234H] MOV [BX], AX MOV BL, 3AH MOV [BX + SI], AX Relativo por registro Relativo base mas ndice ndice escalado Registro Directo Indirecto por registro Inmediato Base mas ndice

11

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 categoras de instrucciones descritas en esta seccin incluyen: Transferencia de datos, aritmticas, manipulacin 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.

Cdigo Operacin IN LAHF LEA LDS LES MOV OUT POP POPF PUSH PUSHF SAHF XCHG XLAT

Funcin Mete datos al acumulador desde un dispositivo de E/S. Carga banderas en AH. Carga la direccin efectiva. Carga DS y registro de 16 bits con los datos de memoria de 32 bits. Carga ES y registro de 16 bits con los datos de memoria de 32 bits. Carga byte, palabra o doble palabra. Saca datos del acumulador a un E/S. Recupera una palabra de la pila. Recupera los indicadores de la pila. Salva las palabras en la pila. Salva banderas en la pila. Carga AH en las banderas. Intercambia bytes, palabras o dobles palabras. Emplea AL para entrar a una tabla de conversin.

12

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Aritmtica: 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 nmeros ASCII con signo o sin signo. Cdigo Operacin AAA AAD AAM AAS ADD ADC CBW CMP CWD DAA DAS DEC DIV IDIV IMUL INC MUL SBB SUB Funcin Ajuste ASCII para la suma. Ajuste ASCII para la divisin. Ajuste ASCII para la multiplicacin. Ajuste ASCII para la resta. Suma datos entre registros o la memoria y otro registro. Suma datos con la bandera de acarreo. Convierte byte a palabra. Compara los datos. Convierte palabra a doble palabra. Ajuste decimal de AL despus de una suma de BCD: Ajuste decimal de AL despus de una resta de BCD: Decremento. Divisin sin signo. Divisin con signo. Multiplicacin con signo. Incrementa. Multiplicacin sin signo. Resta con acarreo. Resta datos entre los registros y la memoria u otro registro.

Manipulacin de bits: Se utilizan para controlar los datos hasta el nivel bits. Estas instrucciones incluyen operaciones lgicas, corrimientos y rotaciones. Cdigo Operacin AND NOT NEG OR SAR SHL/SAL SHR RCL ROL RCR ROR TEST XOR Funcin Y lgica. Invertir (complemento a uno). Cambia el signo (complemento a dos). O inclusiva lgica. Corrimiento aritmtico a la derecha. Corrimiento a la izquierda. Corrimiento lgico a la derecha. Rotacin a la izquierda con acarreo. Rotacin a la izquierda. Rotacin a la derecha con acarreo. Rotacin a la derecha. Operacin con el AND lgico, pero solo afectando banderas. O exclusivo lgica.

13

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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. Cdigo Operacin CMPS LODS MOVS SCAS STOS Funcin Comparacin entre memoria y memoria. Cargar el acumulador. Mover de memoria a memoria. Comparacin entre la memoria y el acumulador. Almacenar en el acumulador.

Transferencia de programa: Incluyen brincos, llamadas (CALL) y para retorno. Saltos basados en datos sin signo. Salta si es igual / salta si es cero JE / JZ Salta si no es igual / salta si no es cero JNE / JNZ Salta si es mayor / salta si no es menor o igual JA / JNBE Salta si es mayor o igual / salta si no es menor JAE / JNB Salta si es menor / salta si no es mayor o igual JB / JNAE Salta si es menor o igual / salta si no es mayor JBE / JNA

Saltos basados en datos con signo Salta si es igual / salta si es cero JE / JZ Salta si no es igual / salta si no es cero JNE / JNZ Salta si es mas grande / salta si no es mas pequeo o igual JG / JNLE Salta si es mas grande o igual / salta si no es mas pequeo JGE / JNL Salta si es mas pequeo / salta si no es mas grande o igual JL / JNGE Salta si es mas pequeo o igual / salta si no es mas grande JLE / JNG

Pruebas aritmticas especiales. Salta si hay signo JS Salta si no hay signo JNS Salta si hay acarreo JC Salta si no hay acarreo JNC Salta si hay sobreflujo JO Salta si no hay sobreflujo JNO Salta si hay paridad / salta si la paridad es impar JP / JPE Salta si no hay paridad / salta si la paridad es par JNP / JPO

14

M.C. Abel Daz Olivares

Lenguaje Ensamblador

7. Organizacin de la memoria.
El espacio de direccionamiento de un sistema basado en un microprocesador, se denomina memoria lgica o memoria fsica. La estructura de la memoria lgica es diferente, en casi todos los casos, que la estructura de la memoria fsica. La memoria lgica es el sistema de memoria tal como lo ve el programador, mientras que la memoria fsica es la estructura real en el hardware en el sistema de memoria. Memoria lgica. El espacio bsico de la memoria lgica es el mismo en todos los microprocesadores Intel. La memoria lgica se enumera por bytes. En la siguiente ilustracin se observa el mapa de memoria lgica de algunos de los miembros de la familia Intel. Se vera que la nica diferencia es que algunos miembros contienen mas memoria que otros. Adems, se debe tener en cuenta que la memoria fsica puede diferir de la memoria lgica en muchos sistemas.

8 bits
FFFFFF FFFFFE

FFFFFFFF FFFFFFFE FFFFFFFD

8 bits

FFFF FFFE FFFD 0002 0001

8 bits

FFFFFD

16M bytes 1M byte


000002 000001 000000 00000002 00000001 00000000

4G bytes

0000

(a)

(b)

(c)

Ilustracin: El mapa de memoria lgica 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 ms significativo en 00123H. Memoria Fsica. Las memorias fsicas 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 programacin, no hay diferencia en el ancho de la memoria porque la memoria lgica siempre es de 8 bits de ancho; pero, como se puede ver en la siguiente ilustracin, hay una diferencia para el diseador del hardware.

15

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Banco alto banco impar


FFFFF FFFFE FFFFD FFFFFF FFFFFD FFFFFB FFFFFE FFFFFC FFFFFA

Banco bajo banco par

8 bits 1M bytes
00002 00001 00000 000005 000003 000001

8 bits 8M bytes
000004 000002 000000

8 bits 8M bytes

Microprocesador 8088

D15-D8

D7-D0

MICROPROCESADOR 8086 (memoria de 1M byte) MICROPROCESADOR 80186, 80286, 80386SX MICROPROCESADOR 80386SL (memoria de 32M byte)

Banco 3
FFFFFFFF FFFFFFFB FFFFFFF7 FFFFFFFE FFFFFFFA FFFFFFF6

Banco 2
FFFFFFFD FFFFFFF9 FFFFFFF5

Banco 1
FFFFFFFC FFFFFFF8 FFFFFFF4

Banco 0

8 bits 1G bytes
0000000B 00000007 00000003 0000000A 00000006 00000002

8 bits 1G bytes
00000009 00000005 00000001

8 bits 1G bytes
00000008 00000004 00000000

8 bits 1G bytes

D31-D24

D23-D16
MICROPROCESADOR 80386DX MICROPROCESADOR 80486SX MICROPROCESADOR 80486DX

D15-D8

D7-D0

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 seccin de 8 bits de ancho. Los microprocesadores de 16 bits tienen dos bancos de memoria para formar una seccin 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.

16

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Segunda Unidad: USO DEL TURBO ENSAMBLADOR 1. Introduccin 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 edicin, documentacin y revisin 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 c:\tasm\tlink myfirst /t c:\tasm\dir myfirst.* myfirst.asm myfirst.obj myfirst.map myfirst.com Creando un bateador: c:\tasm\edit a.bat tasm %1 tlink %1 / t del %1.obj del %1.map Debe tener la extensin asm. Para crear un com.

Crear el bateador con extensin .bat

17

M.C. Abel Daz Olivares

Lenguaje Ensamblador

2. Estructura de Programa.
; Definicin de la estructura de un programa en Macro Ensamblador Data segment ; Definicin del segmento de datos ; Definicin de igualaciones nombre1 EQU valor1 nombre n EQU valor n ; Asignacin de memoria nombre1 tipo valor1 nombre n ends tipo valor n

stack segment dw 128 dup(0) ends code segment ; Definicin del segmento de datos start: ; definicin de cdigo 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 cdigo.

18

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 definicin de datos. Esta orden la interpreta el ensamblador y se utiliza para asignar cantidad de memoria. La siguiente tabla resume estas instrucciones. Nemnico DB DW DD DQ DT Ejemplo:
ORIG_DRIVE DB ORIG_PATH PRE_PATH PATH ANY_FILE DIR_TABLE BREAK_INT_OFF BREAK_INT_SEG CMD_TABLE 0 DB DB DB DB DB DW DW EQU DW DW DW DW DW DB DB DB DB DB DB 64 DUP (0) \ 64 DUP (0) *,*,0 256 DUP (19 DUP (0)) 00 00 THIS BYTE OFFSET OFFSET OFFSET OFFSET OFFSET

Definicin Define byte Define word Define double word Define quard word Define ten bytes

Tamao 1 byte 2 bytes 4 bytes 8 bytes 10 bytes

ACTION_CMD DOIT_CMD DRIVE_CMD PATH_CMD EXIT_CMD

ACTION_CMD DOIT_CMD DRIVE_CMD PATH_CMD EXIT_CMD ONE_MOMENT

SELECT,0 DELETE,0 DRIVE,0 PATH,0 EXIT,0 Examining diskette . . one moment please !,0

MOV AL, ORIG_DRIVE MOV AX, ORIG_DRIVE

NO SE PUEDE PORQUE ES DE 8 BITS

19

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Cuando una localidad de memoria es asignada a 1 byte, se debe respetar esta referencia, sin embargo es posible saltar esta restriccin 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 harn teniendo en cuenta que el programa empieza en la direccin 100h, y no en la 00h. Si no utilizaremos la instruccin ORG 100h, el cdigo ejecutable resultante estara construido en base a una direccin de comienzo 00h. Al cargar el programa en memoria para su ejecucin (a partir de la direccin 100h), habra 100h bytes de diferencia en todos los accesos a memoria, saltos, llamadas a procedimientos, etc.

4. Programas en lnea recta.


Son programas sencillos que utilizan algunas instrucciones bsicas del microprocesador. Por ejemplo: Suma de dos bytes, tablas de bsqueda, corrimiento y rotacin, enmascaramiento de datos, encontrar el mayor de dos nmeros. 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. Solucin: 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

20

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Direccionamiento Indirecto: Es muy comn usar tablas de bsqueda cuando se desea velocidad y no se tienen muchos recursos aritmticos. 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. Solucin: MOV BX, 210h MOV SI, 210h 210 0 ADD BL, [200h] MOV BL, [200h] 211 1 MOV AL, [BX] MOV BH, 0 212 4 MOV [201h], AL MOV AL, [BX + SI] 213 9 INT 20h MOV [201h], AL : INT 20h 219 81 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 bsqueda. Por ejemplo: [200h] = 0 [200h] = 3 [201h] = 0 [201h] = 9 [202h] = 1 [202h] = 6 Instrucciones de Corrimiento y Rotacin. Rotaciones: Las instrucciones de rotacin colocan los datos binarios porque hacen rotar la informacin en un registro o localidad de memoria. RCL y RCR rotan los datos a travs del acarreo (C) y ROL y ROR solo hacen girar los datos a travs del objetivo. No pierde el valor RCL Rotate trough Carry Left RCR Rotate trough Carry Rigth ROL Rotate Left ROR Rotate Rigth
c ROL objetivo RCL c objetivo

c ROR

objetivo RCR

objetivo

21

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Corrimientos: Las instrucciones para corrimiento colocan o mueven nmeros 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
c SHL Objetivo 0 Lgico a la izq SAL c Objetivo 0 Lgico a la izq

Objetivo SHR 0 Lgico a la der

c SAR Aritmtico a la derecha

Objetivo

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 nmeros 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: INICIO [200h] = 02 [201h] = 07 Resultado: [202h] = 27 MOV AL, [200h] MOV CL, 4 SHL AL, CL ADD AL, [201h] MOV [202h], AL INT 20H
Desplazar [200h] cuatro bits a la izq.

Sumar [200h] + [201h]

Guardar suma en [202h]

Fin

22

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Ejercicio: Se desea desempacar un nmero que esta en la localidad 200h. Coloque el digito ms 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 interrupcin 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 instruccin. Saltos basados en datos sin signo. Bandera examinada Jump if equal / jump if zero ZF JE / JZ ZF JNE / JNZ Jump if non equal / jump if non zero Jump if above / jump if no below or equal CF, ZF JA / JNBE CF JAE / JNB Jump if above or equal / jump if not below Jump if below / jump if not above or equal CF JB / JNAE CF, AF JBE / JNA Jump if below or equal / jump if not above

23

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 Jump if equal / jump if zero JE / JZ JNE / JNZ Jump if non equal / jump if non zero JG / JNLE Jump if greater / jump if non less or equal JGE / JNL Jump if greater or equal / jump if non less JL / JNGE Jump if less / jump if not greater or equal JLE / JNG Jump if less or equal / jump if not greater Pruebas aritmticas especiales. Jump if sign JS Jump if not sign JNS Jump if carry JC Jump if not carry JNC Jump if overflow JO Jump if not overflow JNO Jump if parity / jump if parity even JP / JPE JNP / JPO Jump if not parity / jump if parity odd

Bandera examinada. ZF ZF ZF, SF, OF SF, OF SF, OF ZF, SF, OF Bandera examinada. SF SF CF CF OF OF PF PF

Ejercicio: Escriba un programa que encuentre el mayor de dos nmeros, 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 nmeros 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 nmeros provocan un nmero 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

24

M.C. Abel Daz Olivares

Lenguaje Ensamblador

5. Programas con lazos.


Un lazo es una estructura bsica que forza a la cpu a repetir un nmero de instrucciones. Los lazos constan de cuatro partes: 1. Seccin de Inicializacin: Aqu se definen los valores de contadores. 2. Seccin de Procesamiento: Es donde ocurre la manipulacin de los datos, es la seccin que realmente realiza el trabajo. 3. Seccin de Control de Lazo: Actualiza los contadores y apuntadores para la siguiente instruccin. 4. Seccin Final: Aqu se analizan y se almacenan los resultados. DIAGRAMA DE FLUJO DE UN LAZO.
Inicio Inicio

Seccin de Inicializacin

Seccin de Inicializacin

Seccin de Procesamiento

Seccin de Control

Seccin de Control

Tarea Completa ?

si

Seccin Final

Fin

no

Tarea Completa ?

no
Seccin de Procesamiento

si
Seccin Final

Fin

25

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Ejercicio: Escriba un programa que calcule la suma de una serie de nmeros. 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 Inicio


Apunta=201 Cuenta=[201] Suma=0

Apunta + + Suma+=[apuntador]

Cuenta--

no

Es cuenta = 0

si

[200] = suma

Fin

26

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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

Inicio
Cuenta=8 Suma=0 Dato=[200]

Mover dato un bit a la izquierda

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

no
carry = 1

si no

Suma = Suma +1

Cuenta=Cuenta - 1

cuenta = 0

si

[201] = Suma

Fin 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 nmeros 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

Inicio
Cuenta=[201] Apunta=201 Mayor=0

Apunta = Apunta + 1

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

no
Es Mayor > [apunta]

si no

Mayor = [apunta]

Cuenta=Cuenta - 1

Cuenta = 0

si

[200] = Mayor

Fin

27

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Ejercicio: Escriba un programa que calcule la suma de una serie de nmeros. 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 hendan, byte mas significativo en la localidad 201h. Ejemplo: MOV BX, 202h [202h]= 03h MOV CL, [BX] [203h]= 0C8h MOV CH, 0 [204h]= 0FAh MOV AL, CH [205h]= 96h MOV DL, CH Resultado Cambia: INC BX [200h]= 58h ADD AL, [BX] [201h]= 02h 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 nmeros ubicados en las localidades 202h y 203h, dejar el resultado en formato little hendan en las localidades 200h y 201h. Aplicar el mtodo de La Russe. 3. Escriba un programa en ensamblador que multiplique dos nmeros ubicados en las localidades 202h y 203h, dejar el resultado en formato little hendan en las localidades 200h y 201h. Aplicar el mtodo de divide y vencers. 4. Escriba un programa en ensamblador que calcule la raz cuadrada de un numero ubicado en la localidad 201h, dejar el resultado en la localidad 200h. Aplique el mtodo de la raz aproximada. 5. Se sabe que la suma de los cubos de nmeros positivos es el cuadrado de un nmero. Aplique este mtodo para obtener el cuadrado de ese nmero, la sumatoria ser hasta el nmero ubicado en la localidad 200h. Escriba un programa en ensamblador que calcule el resultado de la suma de los cubos despus obtenga la raz cuadrada, deje resultados en las localidades 201h y 202h.

6. Problemas Aritmticos.
Existen cinco tipos de instrucciones aritmticas en el microprocesador 8086, y son: 1. Instrucciones de suma. 2. Instrucciones de resta. 3. Instrucciones de multiplicacin. 4. Instrucciones de divisin. 5. Instrucciones de comparacin.

28

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 nmeros de mltiples dgitos. Se asume que el registro SI y DI contienen la direccin de inicio de los nmeros a sumar y CX el numero de dgitos 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 LOOP RET

AAA (Adjust Result of Ascii Addition): Las instrucciones aritmticas para ASCII funcionan con nmeros codificados en ASCII. El valor de estos nmeros es entre 30H y 39H para los nmeros 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 nmeros de un digito codificados en ASCII no dar por resultado ningn dato til. Por ejemplo si se suman un 31H y un 39H, el resultado es un 6AH.esta suma en ASCII (1 + 9) producira un resultado ASCII de dos dgitos, equivalente a un 10 decimal, el cual es un 31h y un 30H en cdigo ASCII. Si se ejecuta la instruccin AAA despus de esta suma, el registro AX contendr un 0100H que, aunque no es un cdigo ASCII, se puede convertir si se le suma 3030H, que genera 3130H. La instruccin 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 despus de una suma de nmeros de BCD.

29

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Ejercicio: Escriba un programa que calcule la suma de una serie de nmeros 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: 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 LOOP Sigue MOV [200h], AL MOV [201h], DL INT 20h

[202]= 28h [203]= 55h [204]= 26h Resultado [200]= 09h [201]= 01h

Aqu:

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 despus de una resta. Por ejemplo, supngase que se resta un 35H de un 39H. El resultado ser 04H, que no requiere correccin; 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 despus de una resta de nmeros de BCD. NEG: Se usa para realizar una negacin, o bien es el complemento a 2.

Instrucciones de Multiplicacin. MUL: Se utiliza para obtener el producto en nmeros de 8,16 y 32 bits. Si los nmeros son de 8 bits multiplica AL con otro registro o localidad de memoria, y deja el resultado en AX. Si los nmeros 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 MOV AL, [200h] MOV BL, [201h] MUL BL

AX

30

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Si es de 16 bits. Ejemplo:
AX X Si se tiene: MUL BX, AX es como si tuviera MUL BX Si tiene: MUL AX es como si tuviera MUL AX, AX

DX

AX

IMUL: Se utiliza para obtener el producto en nmeros de 8,16 y 32 bits, la multiplicacin es con signo.

AAM: La instruccin AAM sigue a la instruccin de multiplicar, despus de multiplicar dos nmeros de un digito BCD no empacados. En el siguiente ejemplo se multiplica un 5 por un 5; el resultado despus de la multiplicacin es 0019H en el registro AX. Despus de ajustar el resultado con la instruccin 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 0000 0110 0000 1100 0001 1000 0000 0110 0001 1000 0001 1110 = 30 Ejemplo: 0000 0101 = 5 0000 1010 0001 0100 0010 1000 = 40 Ejemplo: 0000 0101 = 5 0000 1010 0001 0100 0010 1000 0101 0000 0101 0000 0001 0100 0110 0100 = 100 para multiplicarlo por 10 sin usar MUL recorremos guardamos temp 2 recorremos 4 recorremos y lo sumamos con temp 8 se toma el ultimo que no excede (8) y faltaran 2 para 10 por ello sumamos con el del valor 2

para multiplicarlo por 8 sin usar MUL recorremos recorremos recorremos y como es 8 exacto ese es el numero

2 4 8

para multiplicarlo por 20 sin usar MUL recorremos recorremos guardamos temp recorremos recorremos se toma el ultimo que no excede (16) y faltaran 4 para 20

2 4 8 16

Instrucciones de Divisin. DIV: Se utiliza para obtener la divisin en nmeros enteros de 8,16 y 32 bits, dicha divisin es sin signo.

31

M.C. Abel Daz Olivares

Lenguaje Ensamblador

IDIV: Se utiliza para obtener la divisin en nmeros enteros con signo de 8,16 y 32 bits. Para la divisin 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 despus de la divisin y AH contiene el residuo de nmero entero.
Ejemplo: MOV AX, 0010H MOV BL, 0FDH IDIV BL Quedaria AX = 01FBH AL= (-5) cociente AH = 1 residuo

Para la divisin de 16 bits es semejante a la divisin 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 despus de una divisin de 16 bits. Para la divisin 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 instruccin y queda un cociente de 32 bits en EAX y un residuo de 32 bits en EDX. AAD: La instruccin AAD al contrario de todas las instrucciones para ajuste, aparece antes de la divisin. La instruccin AAD requiere que el registro AX contenga un numero BCD no empacado, de 2 dgitos (no ASCII) antes de que se ejecute. Despus 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 instruccin AAD, despus se divide 48H entre 9 y no regresa como resultado AH=00 y AL=08.

CBW: Esta instruccin convierte el byte que esta en AL en un Word en AX. Se utiliza para extender un nmero de 8 bits en otro de 16 bits con signo.
Ejemplo: MOV AX, 6545H CBW Quedara AX=0045H

CWD: Esta instruccin convierte el Word en un numero doble Word (DX : AX).
Ejemplo: MOV AX, 6545H MOV DX, 7987H CWD Quedara AX=6545H

DX=0000H

32

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Raz Cuadrada. Para encontrar y/o calcular la raz cuadrada existen 2 mtodos posibles los cuales son los siguientes: 1. Mtodo aproximado. 02 = 0 1 12 = 1 2 3 2 =4 32 = 9 5 7 42 = 16 2 5 = 25 9
Ejemplo: Raz de 49 es 7 49 -1 = 48 3 = 45 5 = 40 7 = 33 9 = 24 11 = 13 13 = 0 Ejemplo: Raz de 30 es 5.5 30 -1 = 29 3 = 26 5 = 21 7 = 14 9 = 5 11 = 6 11 / 2 = 5.5 Ejemplo: Raz 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

33

M.C. Abel Daz Olivares

Lenguaje Ensamblador

2. Mtodo Exacto.

34

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Ejercicio: Realice un programa que calcule la raz 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. Manipulacin de Datos.
Nmeros de AUTO VERIFICACION. Los dgitos de auto-verificacin son utilizados como una insercin en nmeros de identificacin por ejemplo tarjetas de crdito, nmeros de inventario, equipaje, paquetera, etc. Cuando estos nmeros son manejados por sistemas computacionales. Tambin se pueden usar en mensajes, archivos de identidad y otras aplicaciones. El propsito de estos dgitos es minimizar errores, por ejemplo dgitos transpuestos, dgitos desplazados o dgitos perdidos. Propsito minimizar errores en: dgitos transpuestos (72 no se confunda 27). dgitos desplazados (3891 en lugar de 8910). dgitos 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 dgitos. 5. El digito menos significativo es el digito de auto-verificacin.
Ejemplo: 549321 5x2+ 4 +9x2+ 3 +2x2+1 = 40 Ejemplo: 549320 5x2+ 4 +9x2+ 3 +2x2+0 = 39
Digito de Auto-Verificacin Digito de Auto-Verificacin

35

M.C. Abel Daz Olivares

Lenguaje Ensamblador

DOBLE SUMA DOBLE


Ejercicio: Calcule el digito verificador de una cadena de dgitos 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 tcnica 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 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

ADO:

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 (carcter 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

36

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Ejercicio: Escriba un programa que ordene de forma descendente una serie de nmeros ubicados a partir de la localidad 201H, el nmero de elementos se encuentra en la localidad 200H.
SIGUE: OTRO: MOV BX, 9 MOV DI, 200H MOV CX, 9 MOV AL, [DI] CMP AL, [DI+1] JB NO_CAMBIO MOV DL, [DI+1] MOV [DI+1], AL MOV [DI], DL INC DI LOOP OTRO DEC BX CMP BX, 0 JNE SIGUE INT 20

NO_CAMBIO:

Subrutinas: Los programas reales realizan tareas que pueden ser requeridas varias veces. Por esta razn 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) RET: RETN (retorno cercano)

FARCALL (llamada lejana) RETF (retorno lejano)

PASE DE PARAMETROS. Algunas subrutinas como la conversin requieren de recibir parmetros como entrada, tambin es posible que la subrutina genere parmetros de salida. En el 8086, los parmetros 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 parmetros es preferible pasar el apuntador de los datos, esto ahorra tiempo de ejecucin y espacio en memoria.

37

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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

Documentacin de subrutinas: Los listados de las subrutinas deben proporcionar suficiente informacin de tal manera que el usuario no necesite revisar la estructura interna de la subrutina. Debe incluir lo siguiente: Una descripcin del propsito de la subrutina. Una lista de los parmetros de entrada y salida. Registros y memoria usados. Un ejemplo de cmo 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 nmeros ubicados a partir de la localidad 201h, el numero de elementos de la serie esta ubicado en la localidad 200h. Inicio
Cuenta =[200]-1 Apunta =201 Inter =0

no
Es [Apunta+1] > [Apunta]

no si
Inter = 0

si no

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

Apunta= Apunta+1 Cuenta=Cuenta - 1

cuenta = 0

si
Fin

38

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Hexadecimal a Decimal.
Ejercicio: Escriba un programa que convierta el contenido del acumulador en carcter 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

Inicio

A >= 10

si no

A=A+7

A = A + 30

Fin

ACA:

ORG 100H MOV AL, [200H] CALL 150H MOV [201H], AL INT 20H ORG 150H CMP AL, 0AH JB ACA ADD AL, 07H ADD AL, 30H RET

Tercera Unidad: INTERFASE CON EL PUERTO PARALELO 1. Ubicacin del Puerto Paralelo.
El puerto paralelo puede ser utilizado como un grupo de entradas y salidas de propsito general. Posee 8 salidas, 5 entradas y 4 lneas 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. Comunicacin 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 ubicacin de estos, en las siguientes localidades:
1er p.p 2do p.p 3er p.p 0000:0408 0000:0409 0000:040A 0000:040B 0000:040C 0000:040D

D0:408

- 78 03 78 02 . . . . . LPT1 LPT2

39

M.C. Abel Daz Olivares

Lenguaje Ensamblador

2. Puerto Base, Puerto de Salida.


Se ubica en la direccin base, es un puerto de salida de 8 bits, utiliza la siguiente distribucin: Bit 0 1 2 3 4 5 6 7 Posicin DB25 2 3 4 5 6 7 8 9

40

M.C. Abel Daz Olivares

Lenguaje Ensamblador

3. Puerto Base + 1, Puerto de Entrada.


Se ubica en la direccin base + 1, es un puerto de entrada de 5 bits, utiliza la siguiente: Bit 0 1 2 3 4 5 6 7 Nivel Ledo ---1 1 1 1 0 Pin DB25 ---15 13 12 10 11 Seal ----Select Paperad ACK Busy

4. Puerto Base + 2, Puerto de Entrada-Salida.


Se ubica en la direccin base + 2. Normalmente es un puerto de salida, pero es posible utilizarlo como entrada pidindole previamente la letra b, esto es para que los transistores no estn aterrizados. Las lneas se ubican de la siguiente manera: Bit 0 1 2 3 4 5 6 7 Nivel Ledo 0 0 1 0 ----Pin DB25 1 14 16 17 ----Seal Strobe Autofeed Init printer Select in -----

Programa para escribir en el puerto paralelo: El siguiente programa asume que en las ocho lneas de datos existe algn dispositivo que lee los datos, por ejemplo leds que se encienden y apagan segn los datos.

7E BD DB E7 E7 DB BD 7E

- D0:408 - O378, FF - O378, 0

41

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 enve una secuencia de datos por el Puerto paralelo. En la localidad 200h se encuentran el nmero de veces que se repite la secuencia, en la localidad 201h indica el nmero 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 energa. Debido al bajo voltaje y baja corriente de las lneas del puerto se requiere amplificar esta seal. Existen tres formas de amplificar: - Drivers integrados. - Transistores - Relevadores.

42

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Drivers integrados.

Relevadores.

Transistores.

Ejercicio: Implemente un programa que lea un byte de datos por el Puerto paralelo. Una vez capturado ese byte, dejarlo reflejado en la direccin 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 lneas invertidas a normal DEC DX ; Apunta Base OUT DX, AL INT 20h

43

M.C. Abel Daz Olivares

Lenguaje Ensamblador

Cuarta 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 estn documentadas. Las primeras computadoras no permitan que los programadores hicieran uso de estn 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 estn ubicadas en una memoria fsica 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, tambin se incluye un mapa de la ubicacin 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. Tambin 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 ms abajo. Por ejemplo, es quien mantiene el mensaje c:\>_. En las rutinas del DOS son 256, las cuales se invocan con la interrupcin 21H y se eligen en el nmero adecuado en AH. MOV AH, 00H MOV AH, 0FFH INT 21H INT 21H

44

M.C. Abel Daz Olivares

Lenguaje Ensamblador

2. Vector de Interrupciones.
Una interrupcin es una llamada generada por el hardware (derivada en el exterior por una seal de hardware) o una llamada generada por el software (derivada en el interior por una instruccin). Cualquiera de ella interrumpir el programa porque llamara a un procedimiento para servicio de interrupcin o un manejador de interrupcin. Numero Funcin
0 1 2 3 4 5 6 7 8 9 A B-F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 2F 70-77 Error al dividir. Paso a paso. Terminal de interrupcin (depurar). Punto de ruptura. Sobre flujo aritmtico. Imprimir clave de pantalla e instruccin BOUND. Error por instruccin ilegal. Interrupcin por coprocesador no presente. Tictac de reloj (hardware). Teclado (hardware). Interrupcin 2 de hardware (bus del sistema) Interrupciones de hardware 3 a 7 en hardware. BIOS de video. Entorno del equipo. Memoria de tamao normal. Servicio directo al disco. Servicio al puerto COM serial. Servicio diverso. Servicio al teclado. Servicio LPT a puerto paralelo. ROM BASIC. Borrar y restaurar. Servicios al reloj. Manejador de control de ruptura. Servicio a temporizador del usuario. Apuntador para tabla de parmetros para monitor. Apuntador para tabla de parmetros de unidad de disco. Apuntador para tabla de patrn de caracteres grficos. Terminar el programa. Servicio DOS. Manejador de terminacin del programa. Manejador de control C. Manejador de error critico. Leer disco. Escribir disco. Terminar y permanecer residente. DOS ocioso. Manejador mltiple. Interrupciones 8 a 15 en el hardware.

45

M.C. Abel Daz Olivares

Lenguaje Ensamblador

3. Interrupcin 21H.
Las interrupciones de servicio DOS, es por medio de la interrupcin 21H, donde se deja el servicio en el registro AH, y seguido de esto la instruccin INT 21H, la cual ejecuta la interrupcin del servicio DOS.

3.1 Servicio 02 Display.


El servicio 2 de la interrupcin 21H es: Output Character (Salida de carcter a pantalla): Registro al entrar: AH = 2 DL = carcter (valor ASCII). Registro al regresar: Sin cambios. Sintaxis: MOV DL, * MOV AH, 2 INT 21H Solo en TASM ; Imprime ; un ; 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 interrupcin 21H es: Output Character String (Salida de una cadena de caracteres a pantalla): Registro al entrar: AH = 9 DX = Offset de la direccin del string. DS = Segmento de la direccin del string. Registro al regresar: Sin cambios. El string debe terminar con $.

46

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 interrupcin 21H es: Character Input With Echo (Entrada de carcter con eco): Registro al entrar: AH = 1 Registro al regresar: AL = carcter
SINTAXIS: MOV AH, 1 INT 21H OTRO: MOV AH, 1 INT 21H JMP OTRO

El servicio 8 de la interrupcin 21H es: Character Input Without Echo (Entrada de carcter sin eco): Registro al entrar: AH = 8 Registro al regresar: AL = carcter
SINTAXIS: MOV AH, 8 INT 21H OTRO: MOV AH, 8 INT 21H JMP OTRO

47

M.C. Abel Daz Olivares

Lenguaje Ensamblador

3.4 Servicio 0AH Buffered Keyboard Input.


El servicio 0AH de la interrupcin 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 mxima de caracteres. Segundo byte del buffer es el nmero real de caracteres escritos. Ejemplo:
MOV DX, CAD MOV AH, 0AH INT 21H INT 20H db 20H

CAD:

3.5 Servicio 05 Printer Output.


El servicio 05H de la interrupcin 21H es: Printer Output (Salida de caracteres a impresora): Registro al entrar: AH = 05H DL = Carcter valor ASCII. Registro al regresar: Sin cambios. Comentario: Primer byte del buffer es la cuenta mxima de caracteres. Segundo byte del buffer es el nmero real de caracteres escritos.
SINTAXIS: MOV DL, _ MOV AH ,5 INT 21H

48

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 = Da de la semana (0 = Domingo, 1 = Lunes, . . ) CX = Ao DH = Mes DL = Da
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 = Ao (1980 - 2099) DH = Mes (1 - 12) DL = Da (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

49

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 = Centsima 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 = Centsima 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.

50

M.C. Abel Daz Olivares

Lenguaje Ensamblador

4. Interrupciones para el puerto serie.

Conector DB25 y Conector DB9. CONECTOR DB9 1. Carrier Detect (Portador detector)- Determina si el modem est conectado a una lnea telefnica en funcionamiento. 2. Receive Data (Receptor)- La computadora recibe la informacin enviada por el modem. 3. Transmit Data (Transmisor)- La computadora enva informacin 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 informacin. 8. Clear To Send - El modem le dice a la computadora que ya le puede enviar informacin. 9. Ring Indicator - Una vez que una llamada ha tomado lugar, la computadora reconoce por esta seal (enviada por el modem) que una llamada es detectada.

51

M.C. Abel Daz Olivares

Lenguaje Ensamblador

CONECTOR DB25 1. No utilizado. 2. Transmit Data (Transmisor)- La computadora enva informacin al modem. 3. Receive Data (Receptor)- La computadora recibe la informacin enviada por el modem. 4. Request To Send (Solicitar para envo)- La computadora le pregunta al modem si esta puede enviar informacin. 5. Clear To Send - El modem le dice a la computadora que ya le puede enviar informacin. 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 lnea telefnica 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 seal (enviada por el modem) que una llamada es detectada. 23. No utilizado. 24. No utilizado. 25. No utilizado. 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 seal entre -3 y -25 volts, mientras que Apagado (valor binario de "0") quiere decir que est transmitiendo una seal entre +3 y +25 volts. Velocidades de la transmisin y recepcin.
/* 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 */

52

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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

53

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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*/ 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

54

M.C. Abel Daz Olivares

Lenguaje Ensamblador

} } 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); } }

5. Generacin de sonido enviando pulsos s la bocina.


Es el mtodo fcil, se escriben ceros y unos en el bit 1 del puerto 61h.

55

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 IN AL, 61h ADD AL, 11111100b sound: XOR AL, 2 OUT 61h, AL ADD DX, 9248h MOV CL, 3 ROR DX, CL MOV CX, DX AND CX, 1FFh OR CX, 10h aqu: LOOP aqu JMP sound MOV AH, 4Ch INT 21h ends ; Valor inicial de espera ; Lee el puerto 61h ; Apaga bits 0 y 1 ; Realiza el toggle al bit 1 ; Salida al puerto 61h ; Suma patron aleatoria ; Define rotacin en 3 bits ; Lo rota ; Lo copia en cx ; Apaga 7 bits altos ; Se asegura que no sea muy corto

; Program Terminate

6. Generacin de sonidos usando el Timer Programable.


Las PCs incluyen un chip con tres TIMERS, se usan para las siguientes funciones: 1. DMA. 2. Reloj del sistema. 3. Generacin de sonidos.

56

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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 ; Nmero mgico 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 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 ; Nmero mgico 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 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 ; Program Terminate

57

M.C. Abel Daz Olivares

Lenguaje Ensamblador

MOV AH, 4Ch INT 21h ends

; Program Terminate

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 1 2 3 4 5 6 7 8 Nota DO RE MI FA SOL LA SI DO Frecuencia 262 294 330 347 392 440 494 524

Nota: Teclas de los nmeros que estn en la parte superior, no las del teclado numrico. ; 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 int 21h cmp al, 1bh jz exit sub al, 31h shl al, 1 cbw add bx, ax

58

M.C. Abel Daz Olivares

Lenguaje Ensamblador

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

59

You might also like