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 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 microprocesadores, especialmente la serie 80x86 de INTEL.
2. Conocer los registros del 8086 1. Evolucin de los microprocesadores de INTEL. 2. Modelo de programacin. 3. Registro del microprocesador. 4. Banderas del Registro Status. 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 Macroensamblador.
2. Escribir programas sencillos directamente con Turbo Ensamblador. 1. Introduccin al proceso de Ensamblado. 2. Estructura de programa. 3. Tipos y declaraciones. 4. Programas en lnea recta. 5. Programas con lazos. 6. Problemas aritmticos. 7. Manipulacin de datos. 8. Enmascaramiento con AND y OR. 9. Rotacin.
M.C. Abel Daz Olivares Lenguaje Ensamblador 2 TERCERA UNIDAD: INTERFASE CON EL PUERTO PARALELO Objetivo Especifico: Realizar interfaces sencillas con la computadora utilizando el puerto paralelo. 1. Ubicacin 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. Introduccin al punto fijo y punto flotante. 2. Definicin nef, punto fijo, punto flotante. 3. Punto fijo. 4. Punto flotante. 5. Uso del Coprocesador Aritmtico.
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. Interrupcin 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. Interrupcin 10H, Servicios del video. 5. Interrupciones para el puerto serie. 6. Generacin de sonido enviando pulsos a la bocina. 7. Generacin 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 parmetros. 2. Interface con pase de parmetros. 3. Introduccin a los drives. 4. Tipos de drivers. 5. Estructura de drivers.
BIBLIOGRAFA FUNDAMENTAL: 1. Lenguaje Ensamblador y Programacin para PC IBM y compatibles. Peter Abel 3 Edicin Prentice Hall
DE APOYO: 2. Using Assembly Language. Wyatt 3 Edition QUE
3. Pc Interno Tischer Marcombo
M.C. Abel Daz 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 presentacin, buena relacin tiempo invertido / resultados. Se requiere en maquinas grandes. Fortran, Basic, Pascal, Cobol. Balance adecuado entre complejidad y facilidades del usuario. Realizados para programar. Dedicacin especial a ramas de la ciencia. Java, C. Existe facilidad de crear nuevos comandos. Requiere ser programador. Ensamblador. Los lenguajes son cortos y rpidos. Brecha semntica reducida. Todos los recursos del sistema estn disponibles. 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.
Ms amigable con el usuario, facilidad de programar.
Velocidad en procesamiento de instrucciones M.C. Abel Daz Olivares Lenguaje Ensamblador 4
AO COMENTARI O 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 analtica con 4 secciones: almacn (memoria), Taller (cpu), seccin de entrada y seccin de salida. 1943 Alan Touring crea la Colossus, la primera computadora, usaba bulbos y era de propsito militar. 1946 Eckert y Mauchely, en la universidad de pensilvania desarrollan ENIAC I con fines de investigacin. 1960 PDP I, de la compaa DEC para fines comerciales. 1971 Intel crea 4004, primer microprocesador para Bussicom una empresa Japonesa que vende calculadoras de bolsillo.
Evolucin de los microprocesadores.
AO 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 instruccin) 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 instruccin), 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 caractersticas de 12 microprocesadores y describirlas.
M.C. Abel Daz Olivares Lenguaje Ensamblador 5
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 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 M.C. Abel Daz Olivares Lenguaje Ensamblador 6
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.
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
Cdigo
Datos Extra
Pila
No se le dan nombres especiales
IP FLAGS CS DS
ES SS FS
GS M.C. Abel Daz Olivares Lenguaje Ensamblador 7
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 8 I P (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 lo utilizan algunas instrucciones para cadenas.
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 O D I T S Z A P C M.C. Abel Daz Olivares Lenguaje Ensamblador 9 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 (I nterrupcin): 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 10 5. Modos de direccionamiento. Direccionamiento I nmediato: 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 Endan Little Endian
19 98 199 1
00 01 02
98 19 199 1
00 01 02
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. M.C. Abel Daz Olivares Lenguaje Ensamblador 11 Direccionamiento I ndirecto 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]
EJ ERCICI OS: Determine que tipo de direccionamiento es para cada instruccin.
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
M.C. Abel Daz 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 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. J uego 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 Funcin IN Mete datos al acumulador desde un dispositivo de E/S. LAHF Carga banderas en AH. LEA Carga la direccin 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 conversin.
M.C. Abel Daz Olivares Lenguaje Ensamblador 13 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 Funcin AAA Ajuste ASCII para la suma. AAD Ajuste ASCII para la divisin. AAM Ajuste ASCII para la multiplicacin. 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 despus de una suma de BCD: DAS Ajuste decimal de AL despus de una resta de BCD: DEC Decremento. DIV Divisin sin signo. IDIV Divisin con signo. IMUL Multiplicacin con signo. INC Incrementa. MUL Multiplicacin sin signo. SBB Resta con acarreo. SUB 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 Funcin AND Y lgica. NOT Invertir (complemento a uno). NEG Cambia el signo (complemento a dos). OR O inclusiva lgica. SAR Corrimiento aritmtico a la derecha. SHL/SAL Corrimiento a la izquierda. SHR Corrimiento lgico a la derecha. RCL Rotacin a la izquierda con acarreo. ROL Rotacin a la izquierda. RCR Rotacin a la derecha con acarreo. ROR Rotacin a la derecha. TEST Operacin con el AND lgico, pero solo afectando banderas. XOR O exclusivo lgica.
M.C. Abel Daz 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.
Cdigo Operacin Funcin CMPS Comparacin entre memoria y memoria. LODS Cargar el acumulador. MOVS Mover de memoria a memoria. SCAS Comparacin 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 pequeo o igual JGE / JNL Salta si es mas grande o igual / salta si no es mas pequeo JL / JNGE Salta si es mas pequeo / salta si no es mas grande o igual JLE / JNG Salta si es mas pequeo o igual / salta si no es mas grande
Pruebas aritmticas 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 15 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
1M byte
(a)
8 bits
16M bytes
(b) 8 bits
4G bytes
(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.
FFFF
FFFE
FFFD
0002
0001
0000 FFFFFF
FFFFFE
FFFFFD
000002
000001
000000 FFFFFFFF
FFFFFFFE
FFFFFFFD
00000002
00000001
00000000 M.C. Abel Daz 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)
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.
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 M.C. Abel Daz Olivares Lenguaje Ensamblador 17
Segunda Unidad: USO DEL TURBO ENSAMBLADOR
1. I ntroduccin 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 Debe tener la extensin 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 extensin .bat tasm %1 tlink %1 / t del %1.obj del %1.map
M.C. Abel Daz Olivares Lenguaje Ensamblador 18
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 tipo valor n ends
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.
M.C. Abel Daz Olivares Lenguaje Ensamblador 19 Equates (I gualaciones). 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 Definicin Tamao 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
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
M.C. Abel Daz 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 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 21 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) X 2
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 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 bsqueda. Por ejemplo: [200h] = 0 [200h] = 3 [201h] = 0 [201h] = 9 [202h] = 1 [202h] = 6
I nstrucciones 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
objetivo c ROL objetivo c ROR objetivo c RCL objetivo c RCR M.C. Abel Daz Olivares Lenguaje Ensamblador 22 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
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: [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 Aritmtico a la derecha 0 Lgico a la izq 0 Lgico a la der S 0 Lgico a la izq M.C. Abel Daz Olivares Lenguaje Ensamblador 23
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 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
M.C. Abel Daz 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 aritmticas 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 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.
XOR AX, AX MOV CL, 64h MOV BX, 200h Inicio: ADD AL, [BX] INC BX LOOP inicio MOV [264h], AL INT 20h M.C. Abel Daz Olivares Lenguaje Ensamblador 25
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 I nicializacin: 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.
Seccin de Inicializacin Seccin de Procesamiento Seccin de Control Seccin Final Inicio Fin si no Tarea Completa ? Seccin de Inicializacin Seccin de Procesamiento Seccin de Control Seccin Final Inicio Fin si no Tarea Completa ? M.C. Abel Daz Olivares Lenguaje Ensamblador 26
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:
Cuenta-- Es cuenta = 0 Inicio [200] = suma Fin si no M.C. Abel Daz 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
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
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 M.C. Abel Daz Olivares Lenguaje Ensamblador 28 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: [202h]= 03h [203h]= 0C8h [204h]= 0FAh [205h]= 96h Resultado [200h]= 58h [201h]= 02h
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.
M.C. Abel Daz Olivares Lenguaje Ensamblador 29 I nstrucciones 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 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.
LOOP M.C. Abel Daz Olivares Lenguaje Ensamblador 30 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:
I nstrucciones 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.
I nstrucciones 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
AX MOV AL, [200h] MOV BL, [201h] MUL BL M.C. Abel Daz Olivares Lenguaje Ensamblador 31 Si es de 16 bits. Ejemplo:
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 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 faltaran 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 faltaran 4 para 20 0101 0000 0001 0100 0110 0100 = 100
I nstrucciones de Divisin. DIV: Se utiliza para obtener la divisin en nmeros enteros de 8,16 y 32 bits, dicha divisin 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 M.C. Abel Daz Olivares Lenguaje Ensamblador 32 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 33 Raz Cuadrada. Para encontrar y/o calcular la raz cuadrada existen 2 mtodos posibles los cuales son los siguientes: 1. Mtodo aproximado. 0 2 = 0 1 2 = 1 1 2 2 = 4 3 3 2 = 9 5 4 2 = 16 7 5 2 = 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 34
2. Mtodo Exacto.
M.C. Abel Daz Olivares Lenguaje Ensamblador 35
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 VERI FI CACI ON. 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).
ALGORI TMO 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.
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.
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.
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.
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
M.C. Abel Daz Olivares Lenguaje Ensamblador 37
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.
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 razn es conveniente escribirlas como subrutinas para que sean llamadas las veces que sea necesario. ______ ______ call 300 ______ ______ call 300 ______ ______
300 ______ ______ ret
I nstrucciones para subrutinas: CALL: NEARCALL (llamada cercana) FARCALL (llamada lejana) RET: RETN (retorno cercano) 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.
M.C. Abel Daz Olivares Lenguaje Ensamblador 38 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.
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 M.C. Abel Daz Olivares Lenguaje Ensamblador 39 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 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. 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 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 40
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 Posicin DB25 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9
M.C. Abel Daz Olivares Lenguaje Ensamblador 41
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 Nivel Ledo Pin DB25 Seal 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 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 Nivel Ledo Pin DB25 Seal 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 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
M.C. Abel Daz 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 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.
M.C. Abel Daz 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 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 44 Cuarta Unidad: MANEJO DE PUNTO FLOTANTE
1. I ntroduccin al punto fijo y punto flotante. Las computadoras no almacenan los nmeros con precisin infinita sino de forma aproximada empleando un nmero fijo de bits (Binary Digit) o bytes (grupos de ocho bits). Prcticamente todos las computadoras permiten al programador elegir entre varias representaciones o 'tipos de datos'. Los diferentes tipos de datos pueden diferir en el nmero de bits empleados, pero tambin en cmo el nmero representado es almacenado: en formato fijo (tambin denominado 'entero') o en punto flotante (denominado 'real').
Aritmtica 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 mquina con longitud de palabra de 32 bits, los enteros estn comprendidos entre -(2 31
- 1) y 2 31 - 1 = 2147483647. Un nmero representado en formato entero es 'exacto'. Las operaciones aritmticas entre nmeros enteros son tambin 'exactas' siempre y cuando:
1. La solucin no est fuera del rango del nmero entero ms grande o ms pequeo 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 ingls: Overflow y Underflow) y es necesario recurrir a tcnicas de escalado para llevar a cabo las operaciones.
2. La divisin se interpreta que da lugar a un nmero entero, despreciando cualquier resto. Por estos motivos, la aritmtica de punto fijo se emplea muy raramente en clculos no triviales.
2. Definicin de NEF, Punto fijo y Punto flotante. NEF: Es la representacin estructural de un nmero en punto fijo, el cual indica el tamao del nmero (cantidad de bits), as como la cantidad de bits de la parte entera y la cantidad de bits de la parte fraccional, la representacin 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 representacin en punto fijo es de 16 bits, 8 bits para la parte entera y 8 bits para la parte fraccional.
3. Punto fijo. La representacin en punto fijo aplica para sistemas de numeracin con signo o sistemas de numeracin sin signo.
M.C. Abel Daz Olivares Lenguaje Ensamblador 45 Nmeros sin signo: Son nmeros positivos y toman la cantidad de bits para la parte entera positiva con un rango de (0.0 hasta 2 n1 -1. 2 2 1 1 2 n n para n2>=1). Nmeros con signo: Son nmeros que toman el bit mas significativo para el signo, 0 para nmeros positivos y 1 para nmeros negativos con un rango de (-2 n1-1 . 2 2 1 1 2 n n hasta 2 n1-1 -1. 2 2 1 1 2 n n para n2>=1). Si el nmero es negativo recuerde aplicar el complemento a dos a todos los bits.
Recordemos que la representacin en binario con punto fijo es la siguiente:
2 4 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 posicin, se repite la operacin 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 terminara y colocamos un 1 en la posicin del bit, ya que nos indica que el valor ya esta representado.
Nmeros con signo -5.75 = 1010.0100 ya que 5.75 = 0101.1100 con complemento a dos es 1010.0100
M.C. Abel Daz 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 tpica los nmeros en punto flotante se representan de la manera descrita en el apartado anterior, pero con ciertas restricciones sobre el nmero de dgitos de q y m impuestas por la longitud de palabra disponible (es decir, el nmero de bits que se van a emplear para almacenar un nmero). Para representar un nmero en punto flotante, los bits se acomodan del siguiente modo:
Signo del nmero real x: 1 bit Signo del exponente m: 1 bit Exponente (entero |m|): 7 bits Mantisa (nmero real |q|): 23 bits
En la mayora de los clculos en punto flotante las mantisas se normalizan, es decir, se toman de forma que el bit ms 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 nmero en punto flotante se conoce con el nombre de tcnica del 'bit fantasma'.
Adems puede representarse exactamente con |m| ocupando 7 bits y |q| ocupando 24 bits. La restriccin de que |m| no requiera ms de 7 bits significa que:
Ya que , puede manejar nmeros tan pequeos como 10 -38 y tan grandes como 10 38 . Este no es un intervalo de valores suficientemente generoso, por lo que en muchos casos debemos recurrir a programas escritos en aritmtica de doble precisin e incluso de precisin extendida.
Como q debe representarse empleando no ms de 24 bits significa que nuestros nmeros de mquina tienen una precisin limitada cercana a las siete cifras decimales, ya que el bit menos significativo de la mantisa representa unidades de . Por tanto, los nmeros expresados mediante ms de siete dgitos decimales sern objeto de aproximacin cuando se almacenen en el ordenador.
M.C. Abel Daz Olivares Lenguaje Ensamblador 47 Ejemplo: Convertir los siguientes nmeros 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) Tambin 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 nmero es positivo seria 0 en el signo y tomando la parte fraccional para la mantisa nos quedara: 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 nmero es positivo seria 0 en el signo y tomando la parte fraccional para la mantisa nos quedara: 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 nmero es negativo seria 1 en el signo y tomando la parte fraccional para la mantisa nos quedara: 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 nmero es negativo seria 1 en el signo y tomando la parte fraccional para la mantisa nos quedara: 1 01111101 10000000000000000000000 en hexadecimal seria BEC00000
M.C. Abel Daz 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 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).
I BMBI OS (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.
I BMDOS (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
M.C. Abel Daz Olivares Lenguaje Ensamblador 49
2. Vector de I nterrupciones. 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 Error al dividir. 1 Paso a paso. 2 Terminal de interrupcin (depurar). 3 Punto de ruptura. 4 Sobre flujo aritmtico. 5 Imprimir clave de pantalla e instruccin BOUND. 6 Error por instruccin ilegal. 7 Interrupcin por coprocesador no presente. 8 Tictac de reloj (hardware). 9 Teclado (hardware). A Interrupcin 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 tamao 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 parmetros para monitor. 1E Apuntador para tabla de parmetros de unidad de disco. 1F Apuntador para tabla de patrn de caracteres grficos. 20 Terminar el programa. 21 Servicio DOS. 22 Manejador de terminacin 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 mltiple. 70-77 Interrupciones 8 a 15 en el hardware.
M.C. Abel Daz Olivares Lenguaje Ensamblador 50 3. I nterrupcin 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: 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 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 $.
M.C. Abel Daz 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 I nput. 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 M.C. Abel Daz Olivares Lenguaje Ensamblador 52 3.4 Servicio 0AH Buffered Keyboard I nput. 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 CAD: db 20H
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
M.C. Abel Daz 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 = 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 M.C. Abel Daz Olivares Lenguaje Ensamblador 54 GET SYSTEM TI ME (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 TI ME (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)
Existen otras interrupciones que no son muy utilizadas, pero es posible consultar el manual de IBM llamado DOS INTERRUPTS.
M.C. Abel Daz Olivares Lenguaje Ensamblador 55 INTERRUPCIONES DEL BIOS
Subrutinas del BI OS. Conforman el nivel mas bajo del DOS, se puede clasificar como las siguientes categoras. 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 cdigo 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 cdigo ASCII. Las rutinas del BIOS regresan ambos cdigos, el cdigo ASCII y el scan-code.
Read Keyboard Carcter (Servicio 0, Interrupcin 16h) Este servicio lee un carcter desde teclado: Registro al entrar: AH = 0 Registro al regresar: AH = Scan code AL = Cdigo ASCII SINTAXIS: MOV AH , 0 INT 16H MOV SCAN_CODE, AH MOV ASCII_KEY, AL
Read Keyboard Status (Servicio 1, Interrupcin 16h) Este servicio lee un carcter desde teclado: Registro al entrar: AH = 1 Registro al regresar: AH = scan code AL = cdigo ASCII
SINTAXIS: MOV AH , 1 INT 16H JZ NO_KEY MOV SCAN_CODE, AH MOV ASCII_KEY, AL NO_KEY:
M.C. Abel Daz Olivares Lenguaje Ensamblador 56 Este servicio es similar al anterior, examina el buffer de teclado. Pero adems 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 cdigo de scan-code.
Read Keyboard Shift Status (Servicio 2, Interrupcin 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 repeticin, 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, Interrupcin 17h) Este servicio imprime un carcter en una impresora determinada: Registro al entrar: AH = 0 AL = Carcter 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 57
Initialize Printer (Servicio 1, Interrupcin 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 interrupcin manda los dos valores INT 17H
Printer Status
4. I nterrupcin 10h, Servicios del video. La interrupcin 10h permite manipular la tarjeta de video para desplegar texto y graficas, otros servicios permiten definir el tamao del cursor, leer lpiz ptico, definir ventana, etc.
Atributos de un carcter.
B800 Segmentos de B000 memoria de video
M.C. Abel Daz 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, Interrupcin 10h) Este servicio roda la pantalla a una configuracin determinada: Registro al entrar: AH = 0 CH = Rengln superior izquierdo CL = Columna superior izquierdo DH = Rengln 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 59 Existen servicios para rodar la ventana hacia abajo, escribir caracteres grficos, cambiar el tamao y la forma del cursor, escribir pxeles, colocar el cursor en alguna localidad, leer la posicin actual del cursor, etc.
Write Dot (Servicio 0Ch, Interrupcin 10h) Este servicio imprime un punto en una coordenada especfica: Registro al entrar: AH = 0Ch CX = Columna DX = Rengln Registro al regresar: Sin cambios.
Ejercicio: Escriba en ensamblador un programa para dibujar una lnea horizontal, de puntos.
MOV DX, 0 ; Primer rengln MOV CX, 0 ; Inicio de la lnea 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. I nterrupciones para el puerto serie.
Conector DB25 y Conector DB9. M.C. Abel Daz Olivares Lenguaje Ensamblador 60 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 I ndicator - Una vez que una llamada ha tomado lugar, la computadora reconoce por esta seal (enviada por el modem) que una llamada es detectada.
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 I ndicator - 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. M.C. Abel Daz 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 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.
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 M.C. Abel Daz 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*/ M.C. Abel Daz 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); } } M.C. Abel Daz Olivares Lenguaje Ensamblador 64 6. Generacin de sonido enviando pulsos s la bocina. Es el mtodo fcil, 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 rotacin 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
M.C. Abel Daz Olivares Lenguaje Ensamblador 65
7. 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.
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 ; 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 ; 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 M.C. Abel Daz 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 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 M.C. Abel Daz 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. I ntroduccin a la interface con Ensamblador. La interface del lenguaje de programacin 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, tambin es conveniente utilizarla para dar una mejor esttica a los programas realizados e implementados tambin con cdigo en ensamblador, se recomiendo utilizar lenguaje ensamblador en rutinas para obtener una buena precisin, o bien para tener una buena y rapida respuesta (velocidad), por ejemplo en rutinas de tiempo .
2. I nterface sin pase de parmetros. La interface sin pase de parmetros es la implementacin de cdigo en ensamblador sobre el lenguaje de programacin 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:
M.C. Abel Daz Olivares Lenguaje Ensamblador 68 Ejemplo 1: //Declaracion de librerias #include "iostream.h" #include "conio.h"
//Declaracion de prototipos void obtiene_puerto();
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(); M.C. Abel Daz Olivares Lenguaje Ensamblador 69 puerto=obtiene_puerto(); cout<<"El valor del puerto paralelo es "<<puerto; getch(); }
3. I nterface con pase de parmetros. El pase de parmetros de las funciones hasta que vamos a utilizar se conoce como "por valor". Esto quiere decir que cuando el control pasa a la funcin, los valores de los parmetros en la llamada se copian a "variables" locales de la funcin, estas "variables" son de hecho los propios parmetros.
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; M.C. Abel Daz Olivares Lenguaje Ensamblador 70 getch(); }
Ejemplo 2: //Declaracin de librerias #include "iostream.h" #include "conio.h"
//Declaracin de prototipos int obtiene_suma(int n1, int n2);
//Declaracin 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(); }