lenguaje ensamblador 8086 plan 2009
Post on 01-Jan-2016
202 Views
Preview:
TRANSCRIPT
M.C. Abel Díaz Olivares Lenguaje Ensamblador
1
UNIVERSIDAD AUTONOMA DE AGUASCALIENTES CENTRO DE CIENCIAS BASICAS DEPARTAMENTO DE SISTEMAS ELECTRONICOS ACADEMIA DE DIGITALES
CARRERA: ING. EN SISTEMAS COMPUTACIONALES SEMESTRE: 5° PLAN DE ESTUDIOS: 2001
MATERIA: LENGUAJE ENSAMBLADOR CREDITOS: 7 HORAS T/P: 3/2
ULTIMA REVISION: ENERO 2009. REVISORES: LEAM, FJRD, ADO, ARL
OBJETIVO GENERAL
Introducir al estudiante a un lenguaje de bajo nivel. Al finalizar el curso, el estudiante deberá poder desarrollar una gran variedad de programas en este lenguaje los cuales serán para utilizar la computadora como una herramienta para el control de procesos e interfaces en general.
EVALUACION
La evaluación debe ser diagnóstica, formativa y sumaria bajo los siguientes lineamientos: 1. PARTE TEÓRICA : Se realizaran 3 exámenes escritos con la siguiente ponderación :
2 exámenes parciales 15% cada parcial 1 examen final 30%
2. PARTE PRÁCTICA: - Un trabajo final, con una ponderación del 30%
- N tareas, con una ponderación del 10% NOTA 1: Para tener derecho al examen final es necesario que se entregue el proyecto final. NOTA 2: Para poder acreditar la materia es necesario aprobar la teoría tener promedio mínimo de 6 en los exámenes.
NOTA 3: Lenguaje a manejar: Turbo Ensamblador
PRIMERA UNIDAD: MICROPROCESADORES INTEL 80x86
Objetivo Específico : 1. Conocerá la historia de los
microprocesadores, especialmente la serie 80x86 de INTEL.
2. Conocerá los registros del 8086
1. Evolución de los microprocesadores de INTEL. 2. Modelo de programación. 3. Registro del microprocesador. 4. Banderas del Registro Status. 5. Modos de direccionamiento. 6. Juego de instrucciones. 7. Organización de la memoria
SEGUNDA UNIDAD: USO DEL TURBO ENSAMBLADOR
Objetivo Específico : 1. Reconocerá las ventajas del
Macroensamblador. 2. Escribirá programas sencillos
directamente con Turbo Ensamblador.
1. Introducción al proceso de Ensamblado. 2. Estructura de programa. 3. Tipos y declaraciones. 4. Programas en línea recta. 5. Programas con lazos. 6. Problemas aritméticos. 7. Manipulación de datos. 8. Enmascaramiento con AND y OR. 9. Rotación.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
2
TERCERA UNIDAD: INTERFASE CON EL PUERTO PARALELO
Objetivo Especifico: Realizará interfaces sencillas con la computadora utilizando el puerto paralelo.
1. Ubicación del puerto paralelo. 2. Puerto Base, el puerto de salida. 3. Puerto Base +1 el puerto de entrada. 4. Puerto Base +2 el puerto E-S.
CUARTA UNIDAD: MANEJO DE PUNTO FLOTANTE
Objetivo Especifico: 1. Reconocerá la importancia del
manejo del punto flotante, en aplicaciones reales.
2. Escribirá programas en
ensamblador que manipulen
dispositivos, con punto flotante
1. Introducción al punto fijo y punto flotante. 2. Definición nef, punto fijo, punto flotante. 3. Punto fijo. 4. Punto flotante. 5. Uso del Coprocesador Aritmético.
QUINTA UNIDAD: INTERRUPCIONES DEL DOS Y BIOS
Objetivo Especifico: 1. Utilizará las funciones del MS-DOS.
2. Escribirá programas que empleen
los servicios de video. 3. Escribirá programas en
macroensamblador que generen sonido.
1. Estructura del MS-DOS. 2. Vector de interrupciones. 3. Interrupción 21H. a. Servicio 02 Display. b. Servicio 09 Display. c. Servicio 01 Keyboard Input. d. Servicio 0AH Buffered Keyboard Input. e. Servicio 05 Printer Output. f. Servicios para lectura del reloj de tiempo real.
4. Interrupción 10H, Servicios del video. 5. Interrupciones para el puerto serie. 6. Generación de sonido enviando pulsos a la bocina. 7. Generación de sonidos usando el Timer Programable.
SEXTA UNIDAD: INTERFACE CON LENGUAJE C
Objetivo Especifico: 1. Escribirá programas en Lenguaje C
con partes en Ensamblador. 2. Escribirá programas en
ensamblador y en lenguaje C que sirvan como drivers para la pc.
1. Interface sin pase de parámetros. 2. Interface con pase de parámetros. 3. Introducción a los drives. 4. Tipos de drivers. 5. Estructura de drivers.
BIBLIOGRAFÍA
FUNDAMENTAL: 1. Lenguaje Ensamblador y Programación para PC IBM y
compatibles. Peter Abel 3 ª Edición Prentice Hall
DE APOYO: 2. Using Assembly Language.
Wyatt 3ª Edition QUE
3. Pc Interno
Tischer Marcombo
M.C. Abel Díaz Olivares Lenguaje Ensamblador
3
Primera Unidad: MICROPROCESADORES INTEL 80x86
Lenguajes de alto nivel vs. Lenguajes de bajo nivel.
o Visual Basic, Delphi, Visual fox, etc.
o Fortran, Basic, Pascal, Cobol.
o Java, C.
o Ensamblador.
o Hardware.
Lenguaje Ventaja Desventaja
Visual Basic, Visual
Fox, Delphi, etc.
Mejor presentación, buena relación
tiempo invertido / resultados.
Se requiere en
maquinas grandes.
Fortran, Basic, Pascal,
Cobol.
Balance adecuado entre complejidad y
facilidades del usuario. Realizados para
programar.
Dedicación especial a
ramas de la ciencia.
Java, C. Existe facilidad de crear nuevos
comandos.
Requiere ser
programador.
Ensamblador. Los lenguajes son cortos y rápidos.
Brecha semántica reducida. Todos los
recursos del sistema están disponibles.
No es transportable.
1. La evolución del microprocesador.
La historia dice que los antiguos babilonios empezaron a usar el ábaco (calculadora
primitiva hechas con esferas ahuecadas), alrededor del año 500 a.c. con el tiempo esta
calculadora, estimulo a la humanidad para perfeccionar una maquinaria calculadora en que
se utilizaba engranes y ruedas (Blas Pascal en 1642). Se continuaron los progresos con las
gigantescas maquinarias computadoras de las décadas de 1940 y 1950, construidos con
relevadores y tubos de vacío (bulbos). Más adelante se utilizaron los transistores y los
componentes electrónicos de estado sólido para construir las poderosas computadoras de la
década de 1960. Con el advertimiento de los circuitos integrados se llego al
perfeccionamiento del microprocesador y de los sistemas de microcomputadoras.
Más
amigable
con el
usuario,
facilidad de
programar.
Velocidad en
procesamiento
de instrucciones
M.C. Abel Díaz Olivares Lenguaje Ensamblador
4
AÑO COMENTARIO 1671 Blas Pascal, inventa una maquina que hace sumas y restas.
1701 Gottfried wilhen Von Leibnitz, desarrolla una maquina que multiplica y divide.
1800 Jacquard, desarrolla una tejedora programable con tarjetas perforadas.
1834 Charles Babbage, concibe la maquina analítica con 4 secciones: almacén (memoria), Taller
(cpu), sección de entrada y sección de salida.
1943 Alan Touring crea la Colossus, la primera computadora, usaba bulbos y era de propósito militar.
1946 Eckert y Mauchely, en la universidad de pensilvania desarrollan ENIAC I con fines de
investigación.
1960 PDP I, de la compañía DEC para fines comerciales.
1971 Intel crea 4004, primer microprocesador para Bussicom una empresa Japonesa que vende
calculadoras de bolsillo.
Evolución de los microprocesadores.
AÑO PROCESADOR No. BITS MEMORIA INSTRUCCIONES VEL
1971 4004 / 4040 4 bits 4Kb (4096) 45 instrucciones 1 MHZ
1972 8008 (20us por Instr.) 8 bits 16Kb 48 instrucciones 1 MHZ
1973 8080( micro moderno) (2us por
instrucción) Era compatible con
TTL
8 bits 64Kb 256 instrucciones 1 MHZ
1973 F-8 (Fairchild), 6502 (MOS
Tecnology), 68000 (Motorola),
Z80 (Ziling)
8 bits 64Kb 256 instrucciones 1 MHZ
1977 8085 (1.3us por instrucción),
generador de reloj, y controlador
de sistema integrado.
8 bits 64Kb 256 instrucciones 1 MHZ
1978 8086 / 8088 (400ns inst) (carac a
evolucionar mult y div)
16 bits 1Mb 2.5MIP (millones de
instrucciones por seg)
4.7 MHZ
1982 80286 16 bits 16Mb 8 MIP (millones de
instrucciones por seg)
16 MHZ
80386 32 bits 64Mb 16 MIP (millones de
instrucciones por seg)
33 MHZ
80486 32 bits 4 Gb 54 MIP (millones de
instrucciones por seg)
66 MHZ
Pentium 32 / 64 bits 4 Gb 100 MIP (millones de
instrucciones por seg)
75 MHZ
Pentium MMX 64 bits 4 Gb 233 MHZ
Tarea: Investigar las características de 12 microprocesadores y describirlas.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
5
El microprocesador 8086 / 8088.
Se divide en dos partes funcionales:
Execution Unit (EU- Unidad de Ejecución).
Bus Interfase Unit (BIU- Unidad de Bus de Interfase).
EU BIU
AH AL
BH BL
CH CL
DH DL
SP
BP
SI
DI
ALU
CU
Flags
CS
DS
SS
ES
Unidad
de
control
del bus.
BUS
IP
1
2
3
n
Cola de
Instrucciones
M.C. Abel Díaz Olivares Lenguaje Ensamblador
6
2. El modelo de programación.
Se describe la estructura de los registros del microprocesador y se explica la forma
en que se direcciona la memoria por medio de los registros de segmentos y de los
desplazamientos de dirección.
32 bits
16 bits
AH AX AL
BH BX BL
CH CX CL
DH DX DL
SP
BP
DI
SI
Nombre
32 bits
EAX
EBX
ECX
EDX
ESP
EBP
EDI
ESI
EIP EFLAGS
NOMBRE
Acumulador
Índice base
Contador
Datos
Apuntador de pila
Apuntador de base
Índice destino
Índice fuente
Apuntador de Inst
Banderas
Código
Datos
Extra
Pila
No se le dan
nombres especiales
IP
FLAGS
CS
DS
ES
SS
FS
GS
M.C. Abel Díaz Olivares Lenguaje Ensamblador
7
3. Registros del microprocesador
Registros de propósito general.
Los registros de propósito general se utilizan en la forma en que se desee el
programador. Cada registro para uso general se puede direccionar como un registro de 32
bits (EAX, EBX, ECX y EDX), como un registro de 16 bits (AX, BX, CX y DX) o como
uno de 8 bits (AH,AL,BH,BL,CH,CL,DH yDL). Se debe tener en cuenta que solo el 80386
en adelante contienen el grupo de registros de 32 bits. Las funciones principales de los
registros de propósito general incluyen:
AX (Acumulador): Es el acumulador primario, posee dos características diferentes de los
otros acumuladores. Todas las operaciones de I/O deben pasar por la parte baja (AL) de
este acumulador, las instrucciones que utilizan este registro gastan menos espacio y se
ejecutan más rápido.
BX (Base): Es un acumulador de propósito general que puede ser utilizado para calcular
direcciones, a menudo conserva la dirección base (desplazamiento) de los datos que hay en
memoria. Si la memoria es accesada con este registro los programas serán más cortos y
correrán más rápidos.
CX (Contador): Puede ser utilizado para el conteo de ciertas instrucciones para
corrimientos (CL) y rotaciones del numero de bytes (CX) para las operaciones repetidas de
cadenas y un contador (CX o ECX) para la instrucción LOOP.
DX (Datos): Las instrucciones de I/O lo utilizan para definir la dirección del periférico,
algunas multiplicaciones y divisiones también lo necesitan.
Registros apuntadores e índices.
SP (Apuntador de pila): Se utiliza para direccionar datos en una pila de memoria LIFO,
esto ocurre mas a menudo cuando se ejecutan las instrucciones PUSH y POP, cuando se
llama CALL o cuando se regresa RET de una subrutina.
BP (Apuntador de base): Es un apuntador que se utiliza para referenciar parámetros,
especialmente cuando se programa en un ambiente de múltiples lenguajes.
SI (Índice de fuente): Se emplea para direccionar datos fuente en forma indirecta para
utilizarlos con las instrucciones de cadenas o arreglos.
DI (Índice destino): Se suele emplear para direccionar datos destino en forma indirecta
para utilizarlos con las instrucciones de cadenas o arreglos.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
8
IP (Apuntador de instrucciones): Se utiliza siempre para direccionar a la siguiente
instrucción que va a ejecutar el microprocesador. Esta relacionado con el registro CS que es
el segmento de código. Para formar la localidad real de la siguiente instrucción se suma el
contenido de IP con CS por 10H. Corresponde al contador de programas (Program Counter
o PC) de otros microprocesadores.
Registros con segmentos.
Unos registros adicionales, a los que se da el nombre de registros de segmentos,
generan direcciones en la memoria junto con otros registros en el microprocesador. A
continuación aparece una lista de cada registro de segmento junto con su función en el
sistema:
CS (Código): El segmento de código es una sección en la memoria que tiene los programas
y procedimientos utilizados por los programas. El registro de segmento de código define la
dirección inicial de la sección de memoria que tiene el código (Es un registro de 16 bits que
define el segmento de las instrucciones).
DS (Datos): El segmento de datos es una sección en la memoria que contiene la mayor
parte de los datos utilizados por un programa, (esto datos pueden ser variables, vectores,
matrices, etc).
ES (Extra o adicional): El segmento extra o adicional de datos lo utilizan algunas
instrucciones para cadenas.
SS (Pila): El segmento de pila define la superficie de la memoria utilizada para la pila. La
ubicación del punto inicial de entrada a la pila, se determina por el registro apuntador de la
pila. El registro BP también direcciona los datos que hay dentro del segmento de pila.
FS y GS: Estos registros de segmento adicionales están disponibles en los
microprocesadores 80386 en adelante a fin de contar con dos segmentos adicionales de
memoria para acceso con los programas.
4. Banderas de Registro Status (El registro de banderas).
Las banderas indican la condición del microprocesador a la vez que controlan su
funcionamiento.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 O D I T S Z A P C
M.C. Abel Díaz Olivares Lenguaje Ensamblador
9
C (Acarreo): Indica un acarreo después de una suma o un préstamo después de una resta.
La bandera de acarreo también indica condiciones de error en ciertos programas y
procedimientos. También se utiliza en algunas instrucciones de rotación y desplazamiento.
P (Paridad): Es un cero para la paridad impar y un uno para la paridad par. La paridad es
un conteo de “unos” expresado en un número par o impar. Por ejemplo, si un número
contiene 3 bits con uno binario, tiene paridad impar. Si un numero contiene cero bits de uno
se considera que paridad par.
A (Acarreo Auxiliar): Indica un acarreo después de una suma o un préstamo después de
una resta entre las posiciones de los bits 3 y 4 en el resultado. Este indicador muy
especializado se prueba con las instrucciones DAA y DAS para ajustar el valor de AL
después de una suma o resta BCD. El microprocesador, no utiliza en otra forma el bit de
bandera A.
Z (Zero): Indica que el resultado de una operación aritmética o lógica es cero. Si Z=1, el
resultado es cero, si Z=0 entonces el resultado no es cero.
S (Signo): Indica el signo aritmético del resultado después de una suma o resta. Si S=1 la
bandera de signo se activa y el resultado es negativo. Si S=0 la bandera de signo se
desactiva y el resultado es positivo. Se debe tener en cuenta que el valor de la posición del
bit más significativo se coloca en el bit de signo para cualquier instrucción que afecte las
banderas.
T (Trampa): Cuando se activa la bandera de trampa se habilita la característica de
depuración del microprocesador. Mas adelante aparecen mayores detalles de esta
característica.
I (Interrupción): Controla el funcionamiento de la terminal de la entrada de INTR
(Interrupción externa). Si I=1 se habilita la interrupción y si I=0 se deshabilita la entrada
INTR.
D (Dirección): Controla la selección de incremento o decremento de los registros DI o SI
durante las instrucciones de cadenas o arreglos. Se utiliza para indicar si las operaciones
con string se ejecutaran en forma ascendente o descendente.
O (Sobreflujo): Es una condición que ocurre cuando se suman o restan números con signo.
Un sobreflujo indica que el resultado ha excedido de la capacidad de la maquina. Por
ejemplo, si se suma un 7FH (+127) a 01H (+1) el resultado es 80H (-128). Este resultado
representa una situación de sobreflujo señalado por la bandera para la suma con signo. Para
operaciones sin signo no se toma en cuenta esta bandera.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
10
5. Modos de direccionamiento.
Direccionamiento Inmediato: Transfiere n bytes o palabras de datos inmediatos
hacia el registro o localidad en la memoria en el destino. Ejemplo:
MOV AL, 22H
MOV EBX, 12345678H
MOV AL, 18H
MOV BX,1998H
MOV DS, 0B70H Error, no se puede en direccionamiento inmediato, solo por registro.
MOV AX, 0B70H
MOV DS, AX
MOV DL, 0B800H Error.
MOV CX, 1
MOV CX, 0001
Direccionamiento por Registro: Transfiere bytes o palabra desde el registro fuente
o localidad de memoria, hasta el registro o localidad destino en la memoria.
Ejemplo:
MOV CX, DX
MOV AH, DH
MOV BP, BX
MOV AX, BL Error
MOV AL, BL
MOV AH, 0
CBW Convierte de byte a word, si es positivo llena de ceros, si es neg llena de 1.
Direccionamiento Directo: Transfiere bytes o palabra entre una localidad de
memoria y un registro. Ejemplo:
MOV DL, [300]
MOV DX, [200]
Motorola Intel
Big Endían Little Endian
19
98
199
1
00
01
02
98
19
199
1
00
01
02
Si se tiene el número 1998, en los procesadores
Motorola se guarda de la forma Big Endían, en
los procesadores Intel se almacena de la forma
Little Endían.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
11
Direccionamiento Indirecto por Registro (Base): Transfiere bytes o palabra entre
un registro y una localidad de memoria direccionada por un registro índice o base.
Ejemplo:
MOV AX, [BX]
MOV [BX], AX
Direccionamiento Base mas Índice: Transfiere bytes o palabra entre un registro y
una localidad de memoria direccionada por un registro base mas un registro índice.
Ejemplo:
MOV AX, [BX + SI]
MOV [BX + DI], CX
Direccionamiento Relativo por Registro: Transfiere bytes o palabra entre un
registro y una localidad de memoria direccionada por un registro índice o base y
además un desplazamiento. Ejemplo:
MOV AX, [BX + 4]
Direccionamiento Relativo Base más Índice: Transfiere bytes o palabra entre un
registro y una localidad de memoria direccionada por un registro base más un índice
más un desplazamiento. Ejemplo:
MOV AX, [BX + DI + 4]
Direccionamiento de Índice Escalado: Esta disponible en microprocesadores
80386 en adelante, el segundo registro de un par de ellos, el índice se modifica por
el factor de escala para generar la dirección de la memoria del operando. Ejemplo:
MOV AX, [EBX + 4*EDI]
EJERCICIOS: Determine que tipo de direccionamiento es para cada instrucción.
MOV [BX + 4], AX Relativo por registro
MOV AX, [BX + SI + 4] Relativo base mas índice
MOV [EBX + 2*ESI], AX Índice escalado
MOV AX, BX Registro
MOV AX, [1234H] Directo
MOV [BX], AX Indirecto por registro
MOV BL, 3AH Inmediato
MOV [BX + SI], AX Base mas índice
M.C. Abel Díaz Olivares Lenguaje Ensamblador
12
Ejercicio: Implementar un programa en ensamblador que sume la localidad de memoria
200 y la 201, el resultado lo deje en la localidad 202.
MOV BX, 200H
MOV AL, [BX]
INC BX
MOV DL, [BX]
ADD AL, BL
INC BX
MOV [BX], AL
INT 20H
MOV AL, [200H]
MOV BL, [201H]
ADD AL, BL
MOV [202H], AL
INT 20H
MOV AL, [200H]
ADD AL, [201H]
MOV [202H], AL
INT 20H
MOV AX, [200H]
ADD AL, AH
MOV [202H], AL
INT 20H
6. Juego de instrucciones.
Las categorías de instrucciones descritas en esta sección incluyen: Transferencia de
datos, aritméticas, manipulación de bits, cadenas o arreglos, transferencia de programa, etc.
Transferencia de datos: Incluye instrucciones para transferencia de datos que transfieren
bytes, palabras o dobles palabras de datos entre la memoria y los registros así como entre el
acumulador y los puertos de E/S.
Código Operación Función
IN Mete datos al acumulador desde un dispositivo de E/S.
LAHF Carga banderas en AH.
LEA Carga la dirección efectiva.
LDS Carga DS y registro de 16 bits con los datos de memoria de 32 bits.
LES Carga ES y registro de 16 bits con los datos de memoria de 32 bits.
MOV Carga byte, palabra o doble palabra.
OUT Saca datos del acumulador a un E/S.
POP Recupera una palabra de la pila.
POPF Recupera los indicadores de la pila.
PUSH Salva las palabras en la pila.
PUSHF Salva banderas en la pila.
SAHF Carga AH en las banderas.
XCHG Intercambia bytes, palabras o dobles palabras.
XLAT Emplea AL para entrar a una tabla de conversión.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
13
Aritmética: Instrucciones para sumar, restar, multiplicar y dividir datos como bytes,
palabras o dobles palabras. El sistema suma y resta con el empleo de datos con signo o sin
signo y datos BCD o de ASCII. Multiplica y divide números ASCII con signo o sin signo.
Código Operación Función
AAA Ajuste ASCII para la suma.
AAD Ajuste ASCII para la división.
AAM Ajuste ASCII para la multiplicación.
AAS Ajuste ASCII para la resta.
ADD Suma datos entre registros o la memoria y otro registro.
ADC Suma datos con la bandera de acarreo.
CBW Convierte byte a palabra.
CMP Compara los datos.
CWD Convierte palabra a doble palabra.
DAA Ajuste decimal de AL después de una suma de BCD:
DAS Ajuste decimal de AL después de una resta de BCD:
DEC Decremento.
DIV División sin signo.
IDIV División con signo.
IMUL Multiplicación con signo.
INC Incrementa.
MUL Multiplicación sin signo.
SBB Resta con acarreo.
SUB Resta datos entre los registros y la memoria u otro registro.
Manipulación de bits: Se utilizan para controlar los datos hasta el nivel bits. Estas
instrucciones incluyen operaciones lógicas, corrimientos y rotaciones.
Código Operación Función
AND Y lógica.
NOT Invertir (complemento a uno).
NEG Cambia el signo (complemento a dos).
OR O inclusiva lógica.
SAR Corrimiento aritmético a la derecha.
SHL/SAL Corrimiento a la izquierda.
SHR Corrimiento lógico a la derecha.
RCL Rotación a la izquierda con acarreo.
ROL Rotación a la izquierda.
RCR Rotación a la derecha con acarreo.
ROR Rotación a la derecha.
TEST Operación con el AND lógico, pero solo afectando banderas.
XOR O exclusivo lógica.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
14
Instrucciones para cadenas: Se emplean para manipular cadenas de datos en la memoria.
Cada cadena consta, ya sea de bytes o de palabras y tiene hasta 64K bytes de longitud.
Código Operación Función
CMPS Comparación entre memoria y memoria.
LODS Cargar el acumulador.
MOVS Mover de memoria a memoria.
SCAS Comparación entre la memoria y el acumulador.
STOS Almacenar en el acumulador.
Transferencia de programa: Incluyen brincos, llamadas (CALL) y para retorno.
Saltos basados en datos sin signo.
JE / JZ Salta si es igual / salta si es cero
JNE / JNZ Salta si no es igual / salta si no es cero
JA / JNBE Salta si es mayor / salta si no es menor o igual
JAE / JNB Salta si es mayor o igual / salta si no es menor
JB / JNAE Salta si es menor / salta si no es mayor o igual
JBE / JNA Salta si es menor o igual / salta si no es mayor
Saltos basados en datos con signo
JE / JZ Salta si es igual / salta si es cero
JNE / JNZ Salta si no es igual / salta si no es cero
JG / JNLE Salta si es mas grande / salta si no es mas pequeño o igual
JGE / JNL Salta si es mas grande o igual / salta si no es mas pequeño
JL / JNGE Salta si es mas pequeño / salta si no es mas grande o igual
JLE / JNG Salta si es mas pequeño o igual / salta si no es mas grande
Pruebas aritméticas especiales.
JS Salta si hay signo
JNS Salta si no hay signo
JC Salta si hay acarreo
JNC Salta si no hay acarreo
JO Salta si hay sobreflujo
JNO Salta si no hay sobreflujo
JP / JPE Salta si hay paridad / salta si la paridad es impar
JNP / JPO Salta si no hay paridad / salta si la paridad es par
M.C. Abel Díaz Olivares Lenguaje Ensamblador
15
7. Organización de la memoria.
El espacio de direccionamiento de un sistema basado en un microprocesador, se
denomina memoria lógica o memoria física. La estructura de la memoria lógica es
diferente, en casi todos los casos, que la estructura de la memoria física. La memoria lógica
es el sistema de memoria tal como lo ve el programador, mientras que la memoria física es
la estructura real en el hardware en el sistema de memoria.
Memoria lógica.
El espacio básico de la memoria lógica es el mismo en todos los microprocesadores
Intel. La memoria lógica se enumera por bytes. En la siguiente ilustración se observa el
mapa de memoria lógica de algunos de los miembros de la familia Intel. Se vera que la
única diferencia es que algunos miembros contienen mas memoria que otros. Además, se
debe tener en cuenta que la memoria física puede diferir de la memoria lógica en muchos
sistemas.
8 bits
1M byte
(a)
8 bits
16M bytes
(b)
8 bits
4G bytes
(c) Ilustración: El mapa de memoria lógica de los microprocesadores: (a) 8086/8088/80186 (b) 80286/80386SX (c) 80386DX y 80486
Cuando estos microprocesadores direccionan una palabra de 16 bits en la memoria,
se accesan dos bytes consecutivos. Por ejemplo, la palabra en la localidad 00122H se
almacena en los bytes 00122H y 00123H; el byte menos significativo se almacena en la
localidad 00122H. Si se accesa a una palabra de 32 bits, esta palabra doble la contiene
cuatro bytes consecutivos. Por ejemplo. La doble palabra almacenada en la localidad
00120H, se almacena en los bytes 00120H, 00121H, 00122H y 00123H; el byte menos
significativo se almacena en 00120H y el byte más significativo en 00123H.
Memoria Física.
Las memorias físicas de los miembros de la familia Intel difieren del ancho. La
memoria del 8088 es de 8 bits de ancho; las memorias 8086, 80186, 80286 y 80386SX
tienen 16 bits de ancho; las memorias del 80386dx y 80486 son de 32 bits de ancho. Para la
programación, no hay diferencia en el ancho de la memoria porque la memoria lógica
siempre es de 8 bits de ancho; pero, como se puede ver en la siguiente ilustración, hay una
diferencia para el diseñador del hardware.
FFFF
FFFE
FFFD
0002
0001
0000
FFFFFF
FFFFFE
FFFFFD
000002
000001
000000
FFFFFFFF
FFFFFFFE
FFFFFFFD
00000002
00000001
00000000
M.C. Abel Díaz Olivares Lenguaje Ensamblador
16
8 bits
1M bytes
Microprocesador
8088
Banco alto
banco impar
8 bits
8M bytes
D15-D8
Banco bajo
banco par
8 bits
8M bytes
D7-D0
MICROPROCESADOR 8086 (memoria de 1M byte)
MICROPROCESADOR 80186, 80286, 80386SX
MICROPROCESADOR 80386SL (memoria de 32M byte)
Banco 3
8 bits
1G bytes
D31-D24
Banco 2
8 bits
1G bytes
D23-D16
Banco 1
8 bits
1G bytes
D15-D8
Banco 0
8 bits
1G bytes
D7-D0
MICROPROCESADOR 80386DX MICROPROCESADOR 80486SX
MICROPROCESADOR 80486DX
La memoria esta organizada en bancos de memoria en todas las versiones del
microprocesador excepto el 8088 que tiene un solo banco de memoria. Un banco de
memoria es una sección de 8 bits de ancho. Los microprocesadores de 16 bits tienen dos
bancos de memoria para formar una sección de memoria de 16 bits de ancho, a la cual se
direcciona por bytes o por palabras. Los microprocesadores de 32 bits tienen cuatro bancos
de memoria, pero se les direcciona como bytes, palabras o dobles palabras.
FFFFF
FFFFE
FFFFD
00002
00001
00000
FFFFFF
FFFFFD
FFFFFB
000005
000003
000001
FFFFFE
FFFFFC
FFFFFA
000004
000002
000000
FFFFFFFC
FFFFFFF8
FFFFFFF4
00000008
00000004
00000000
FFFFFFFD
FFFFFFF9
FFFFFFF5
00000009
00000005
00000001
FFFFFFFE
FFFFFFFA
FFFFFFF6
0000000A
00000006
00000002
FFFFFFFF
FFFFFFFB
FFFFFFF7
0000000B
00000007
00000003
M.C. Abel Díaz Olivares Lenguaje Ensamblador
17
Segunda Unidad: USO DEL TURBO ENSAMBLADOR
1. Introducción al Proceso de Ensamblado.
Cuando un programa en ensamblador es muy extenso es preferible escribirlo como
un archivo de texto y compilarlo. Se simplifica la edición, documentación y revisión de los
programas. Se requiere hacer el siguiente procedimiento:
Para ensamblar un programa debemos seguir los pasos anteriores, esto es realizar lo
siguiente:
c:\tasm\tasm myfirst.asm Debe tener la extensión asm.
c:\tasm\tlink myfirst /t Para crear un com.
c:\tasm\dir myfirst.*
myfirst.asm
myfirst.obj
myfirst.map
myfirst.com
Creando un bateador:
c:\tasm\edit a.bat Crear el bateador con extensión .bat
tasm %1
tlink %1 / t
del %1.obj
del %1.map
M.C. Abel Díaz Olivares Lenguaje Ensamblador
18
2. Estructura de Programa.
; Definición de la estructura de un programa en Macro Ensamblador
Data segment ; Definición del segmento de datos
; Definición de igualaciones
nombre1 EQU valor1
nombre n EQU valor n
; Asignación de memoria
nombre1 tipo valor1
nombre n tipo valor n
ends
stack segment
dw 128 dup(0)
ends
code segment ; Definición del segmento de datos
start:
; definición de código
mov ax, data
mov ds, ax
mov es, ax
;Agregar el codigo
-------------
-------------
-------------
mov ax, 4C00h ; Servicio de Program Terminate
int 21h
ends
end start ; set entry point and stop the assembler.
3. Tipos y Declaraciones.
Pseudo Operaciones. Cuando se escribe un programa en ensamblador utilizando un editor de texto es
conveniente utilizar algunas pseudo instrucciones, las cuales son órdenes para el
compilador, no para el microprocesador. Esto es, no generan código.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
19
Equates (Igualaciones).
Son asignaciones que no definen espacio en memoria, el ensamblador las utiliza
para sustituir valores mas adelante.
Ejemplo:
Black EQU 0
Blue EQU 1
Green EQU 2
Cyan EQU 3
Red EQU 4
Margenta EQU 5
Brown EQU 6
Pseudo Operaciones de definición de datos. Esta orden la interpreta el ensamblador y se utiliza para asignar cantidad de
memoria. La siguiente tabla resume estas instrucciones.
Nemónico Definición Tamaño
DB Define byte 1 byte
DW Define word 2 bytes
DD Define double word 4 bytes
DQ Define quard word 8 bytes
DT Define ten bytes 10 bytes
Ejemplo: ORIG_DRIVE DB 0
ORIG_PATH DB 64 DUP (0)
PRE_PATH DB „\‟
PATH DB 64 DUP (0)
ANY_FILE DB „*,*‟,0
DIR_TABLE DB 256 DUP (19 DUP (0))
BREAK_INT_OFF DW 00
BREAK_INT_SEG DW 00
CMD_TABLE EQU THIS BYTE
DW OFFSET ACTION_CMD
DW OFFSET DOIT_CMD
DW OFFSET DRIVE_CMD
DW OFFSET PATH_CMD
DW OFFSET EXIT_CMD
ACTION_CMD DB „SELECT‟,0
DOIT_CMD DB „DELETE‟,0
DRIVE_CMD DB „DRIVE‟,0
PATH_CMD DB „PATH‟,0
EXIT_CMD DB „EXIT‟,0
ONE_MOMENT DB „Examining diskette . . one moment please !‟,0
MOV AL, ORIG_DRIVE
MOV AX, ORIG_DRIVE NO SE PUEDE PORQUE ES DE 8 BITS
M.C. Abel Díaz Olivares Lenguaje Ensamblador
20
Cuando una localidad de memoria es asignada a 1 byte, se debe respetar esta
referencia, sin embargo es posible saltar esta restricción de la siguiente forma. MOV AX, WORD PTR ORIG_DRIVE
PROGRAMAS .COM
El nombre de COM viene de 'Copy Of Memory', y quiere decir algo asi como que el
contenido del fichero COM formado por las instrucciones y datos que componen el
programa, es una copia exacta del programa una vez cargado en memoria.
PROGRAMA: Es importante ensamblar en 100H, porque todos los accesos a variables,
saltos en el programa, etc, se harán teniendo en cuenta que el programa empieza en la
dirección 100h, y no en la 00h. Si no utilizaremos la instrucción ORG 100h, el código
ejecutable resultante estaría construido en base a una dirección de comienzo 00h. Al cargar
el programa en memoria para su ejecución (a partir de la dirección 100h), habría 100h bytes
de diferencia en todos los accesos a memoria, saltos, llamadas a procedimientos, etc.
4. Programas en línea recta.
Son programas sencillos que utilizan algunas instrucciones básicas del
microprocesador.
Por ejemplo:
Suma de dos bytes, tablas de búsqueda, corrimiento y rotación, enmascaramiento de datos,
encontrar el mayor de dos números.
Tarea: Escribir 4 programas en ensamblador que sumen los contenidos de las localidades
0200h y 0201h, el resultado debe quedar en la localidad 0202h. Salvar los 4 programas y
traer el disco.
Ejercicio: Implemente un programa que sume 10 localidades de memoria, comenzando en
la localidad 200h, el resultado dejarlo en la localidad 20Ah.
Solución:
Dir. Directo
MOV AL, [200h]
ADD AL, [201h]
ADD AL, [202h]
:
ADD AL, [209h]
MOV [20Ah], AL
INT 20h
Dir. Base
MOV BX, 200h
MOV AL, [BX]
INC BX
ADD AL, [BX]
:
ADD AL, [BX]
INC BX
MOV [20Ah], AL
INT 20h
M.C. Abel Díaz Olivares Lenguaje Ensamblador
21
Direccionamiento Indirecto: Es muy común usar tablas de búsqueda cuando se desea
velocidad y no se tienen muchos recursos aritméticos. Por ejemplo:
Entrada Vel (Km/Hr) Vel (MPH) X2
1 30 19 1
2 58 40 4
3 90 70 9
Ejercicio: Implemente un programa que calcule el cuadrado del numero en una tabla, que
se encuentra en la localidad 200h y deje el resultado en la localidad 201h.
Solución:
210 0
211 1
212 4
213 9
:
219 81
MOV BX, 210h
ADD BL, [200h]
MOV AL, [BX]
MOV [201h], AL
INT 20h
MOV SI, 210h
MOV BL, [200h]
MOV BH, 0
MOV AL, [BX + SI]
MOV [201h], AL
INT 20h
Tarea: Escriba un programa que obtenga el cuadrado y el factorial de un numero ubicado
en la localidad 200h, deje el cuadrado en la localidad 201h y el factorial en la 202h. Use
tablas de búsqueda. Por ejemplo:
[200h] = 0 [200h] = 3
[201h] = 0 [201h] = 9
[202h] = 1 [202h] = 6
Instrucciones de Corrimiento y Rotación.
Rotaciones: Las instrucciones de rotación colocan los datos binarios porque hacen rotar la
información en un registro o localidad de memoria. RCL y RCR rotan los datos a través del
acarreo (C) y ROL y ROR solo hacen girar los datos a través del objetivo.
No pierde el valor
RCL Rotate trough Carry Left
RCR Rotate trough Carry Rigth
ROL Rotate Left
ROR Rotate Rigth
objetivo c
ROL
objetivo c
ROR
objetivo c
RCL
objetivo c
RCR
M.C. Abel Díaz Olivares Lenguaje Ensamblador
22
Corrimientos: Las instrucciones para corrimiento colocan o mueven números a la
izquierda o derecha dentro de un registro o localidad de memoria.
Cuidan el signo
SAL Shift Aritmetic Left
SAR Shift Aritmetic Rigth
No cuidan el signo
SHL Shift Left
SHR Shift Rigth
Suponga que queremos desplazar un dato dos veces a la izquierda.
MOV AL, [300h]
MOV CL, 2
SHL AL, CL
Ejercicio: Se desea empacar dos números BCD en un solo byte. El primer digito esta en la
localidad 200h y el segundo en 201h, deje el resultado en 202h.
Por ejemplo:
[200h] = 02
[201h] = 07
Resultado: [202h] = 27
MOV AL, [200h]
MOV CL, 4
SHL AL, CL
ADD AL, [201h]
MOV [202h], AL
INT 20H
INICIO
Desplazar [200h] cuatro
bits a la izq.
Sumar [200h] + [201h]
Guardar suma en [202h]
Fin
Objetivo c
SHL
Objetivo c
SHR
Objetivo c
SAL
Objetivo c
SAR Aritmético a la derecha
0 Lógico a la izq
0 Lógico a la der S
0 Lógico a la izq
M.C. Abel Díaz Olivares Lenguaje Ensamblador
23
Ejercicio: Se desea desempacar un número que esta en la localidad 200h. Coloque el
digito más significativo en la localidad 202h y el menos significativo en 201h.
Por ejemplo:
[200h] = 18h
Resultado:
[201h] = 08h
[202h] = 01h
MOV AL, [200h]
AND AL, 0Fh
MOV [201h], AL
MOV AL, [200h]
MOV CL, 4
SHR AL, CL
MOV [202h], AL
INT 20h
Programa uno.
MOV AL, [200h]
MOV CL, 4
SHR AL, CL
MOV DL, AL
ADD DL, 30h
MOV AH, 2
INT 21h
MOV AL, [200h]
AND AL, 0Fh
MOV DL, AL
ADD DL, 30h
MOV AH, 2
INT 21h
INT 20h
Programa dos
MOV AH, 2
INT 1Ah
MOV [200h], DH
Programa 1
MOV DL, 20h
MOV AH, 2
INT 21h
MOV DL, 20h
MOV AH, 2
INT 21h
JMP 100h
INT 20h
Real Times Clock Service
La interrupción 1AH con el servicio 2, regresa en DH los segundos MOV AH, 2
INT 1Ah
MOV [200h], DH
INT 20h
Instrucciones de Salto Condicional.
Existe una gran variedad de instrucciones que transfieren el control de un programa
dependiendo del estado de las banderas. Es posible comparar datos con signo y datos sin
signo, por lo cual se requiere especial cuidado al elegir una instrucción.
Saltos basados en datos sin signo. Bandera examinada
JE / JZ Jump if equal / jump if zero ZF
JNE / JNZ Jump if non equal / jump if non zero ZF
JA / JNBE Jump if above / jump if no below or equal CF, ZF
JAE / JNB Jump if above or equal / jump if not below CF
JB / JNAE Jump if below / jump if not above or equal CF
JBE / JNA Jump if below or equal / jump if not above CF, AF
M.C. Abel Díaz Olivares Lenguaje Ensamblador
24
CMP AX, BX (compara ax con bx, no guarda resultado)
SUBB AX, BX (sustrae lo que tiene ax con bx, guarda resultado en ax)
Ejemplo:
CMP AX, BX (compara ax con bx)
JNE otro_lugar (salta si no son iguales a la etiqueta otro_lugar)
Saltos basados en datos con signo Bandera examinada.
JE / JZ Jump if equal / jump if zero ZF
JNE / JNZ Jump if non equal / jump if non zero ZF
JG / JNLE Jump if greater / jump if non less or equal ZF, SF, OF
JGE / JNL Jump if greater or equal / jump if non less SF, OF
JL / JNGE Jump if less / jump if not greater or equal SF, OF
JLE / JNG Jump if less or equal / jump if not greater ZF, SF, OF
Pruebas aritméticas especiales. Bandera examinada.
JS Jump if sign SF
JNS Jump if not sign SF
JC Jump if carry CF
JNC Jump if not carry CF
JO Jump if overflow OF
JNO Jump if not overflow OF
JP / JPE Jump if parity / jump if parity even PF
JNP / JPO Jump if not parity / jump if parity odd PF
Ejercicio: Escriba un programa que encuentre el mayor de dos números, uno de ellos esta
en la localidad 200h y el otro esta en la localidad 201h, guarde el mayor en la localidad
202h, asuma que los números no tienen signo. [200h]=43h
[201h]=07h
[202h]=43h
MOV BX, 200h
MOV AL, [BX]
INC BX
CMP AL, [BX]
JA mayor
MOV AL, [BX]
mayor: INC BX
MOV [BX], AL
INT 20h
Ejercicio: Escriba un programa que sume los contenidos de 100 localidades adyacentes,
guarde el resultado en la localidad 264h. Asuma que los números provocan un número de
8 bits, la serie empieza en la localidad 200h.
MOV DL, 0
MOV CL, 1
MOV BX, 200h
Inicio: ADD DL, [BX]
INC BX
INC CL
CMP CL, 64h
JB inicio
MOV [264h], DL
INT 20h
XOR AX, AX
MOV CL, 64h
MOV BX, 200h
Inicio: ADD AL, [BX]
INC BX
LOOP inicio
MOV [264h], AL
INT 20h
M.C. Abel Díaz Olivares Lenguaje Ensamblador
25
5. Programas con lazos.
Un lazo es una estructura básica que forza a la cpu a repetir un número de instrucciones.
Los lazos constan de cuatro partes:
1. Sección de Inicialización: Aquí se definen los valores de contadores.
2. Sección de Procesamiento: Es donde ocurre la manipulación de los datos, es la
sección que realmente realiza el trabajo.
3. Sección de Control de Lazo: Actualiza los contadores y apuntadores para la siguiente
instrucción.
4. Sección Final: Aquí se analizan y se almacenan los resultados.
DIAGRAMA DE FLUJO DE UN LAZO.
Sección de
Inicialización
Sección de
Procesamiento
Sección de
Control
Sección
Final
Inicio
Fin
si
no Tarea Completa
¿?
Sección de
Inicialización
Sección de
Procesamiento
Sección de
Control
Sección
Final
Inicio
Fin
si
no
Tarea Completa
¿?
M.C. Abel Díaz Olivares Lenguaje Ensamblador
26
Ejercicio: Escriba un programa que calcule la suma de una serie de números. La longitud
de la serie esta en la localidad 201h, y la serie en si se inicia el la localidad 202h. Guarde
la suma en la localidad 200h. Asuma que el resultado cabe en 8 bits, por lo que se pueden
ignorar los acarreos. Ejemplo:
[201]= 03h
[202]= 28h
[203]= 55h
[204]= 26h
[200]= A6h
MOV BX, 201h
MOV CL, [BX]
MOV CH, 0
MOV AL, CH
Sigue: INC BX
ADD AL, [BX]
LOOP Sigue
MOV [200h], AL
INT 20h
LOOP : decrementa CX
JNZ etiqueta
Apunta=201 Cuenta=[201]
Suma=0
Apunta + +
Suma+=[apuntador]
Cuenta--
Es
cuenta = 0
Inicio
[200] = suma Fin
si no
M.C. Abel Díaz Olivares Lenguaje Ensamblador
27
Ejercicio: Escriba un programa que calcule cuantos bits de la localidad 200h son unos y coloque el resultado
en la localidad 201h. Ejemplo:
[200h]= 3Bh = 0011 1011
[201h]= 05h
MOV CL, 8
MOV CH, 0
MOV AL, [200h]
MOV DL, 0
Sigue: SHL AL, 1
JNC Aquí
INC DL
Aquí: LOOP Sigue
MOV [201h], DL
INT 20h
Ejercicio: Escriba un programa que encuentre el mayor de un bloque de datos. La longitud del bloque esta
en la localidad 201h y el bloque en si inicia en la localidad 202h. Guarde el resultado en la localidad 200h.
Asuma que los números en el bloque son todos de 8 bits sin signo. Ejemplo:
[201h]= 05h
[202h]= 67h
[203h]= 79h
[204h]= 15h
[205h]= E3h
[206h]= 72h
Resultado [201h]= E3h
MOV BX, 201h
MOV CL, [BX]
MOV CH, 0
MOV AL, CH
Sigue: INC BX
CMP AL, [BX]
JAE Aqui
MOV AL, [BX]
Aquí: LOOP Sigue
MOV [200h], AL
INT 20h
Cuenta=8
Suma=0
Dato=[200]
Mover dato un bit a
la izquierda
carry = 1
Inicio
Suma = Suma +1
Cuenta=Cuenta - 1
cuenta = 0
[201] = Suma si
no
si
no
Fin
Cuenta=[201]
Apunta=201
Mayor=0
Apunta = Apunta +
1
Es Mayor >
[apunta]
Inicio
Mayor = [apunta]
Cuenta=Cuenta - 1
Cuenta = 0
[200] = Mayor si
no
si
no
Fin
M.C. Abel Díaz Olivares Lenguaje Ensamblador
28
Ejercicio: Escriba un programa que calcule la suma de una serie de números. La longitud de la serie esta en
la localidad 202h y la serie inicia en la localidad 203h. Guarde la suma en la localidad 200h y 201h en
formato little hendían, byte mas significativo en la localidad 201h. Ejemplo:
[202h]= 03h
[203h]= 0C8h
[204h]= 0FAh
[205h]= 96h
Resultado
[200h]= 58h
[201h]= 02h
MOV BX, 202h
MOV CL, [BX]
MOV CH, 0
MOV AL, CH
MOV DL, CH
Cambia: INC BX
ADD AL, [BX]
JNC Sigue
INC DL
Sigue: LOOP Cambia
MOV [200h], AL
MOV [201h], DL
INT 20
Tarea:
1. Implemente un programa en ensamblador que ordene de forma ascendente 100
localidades de memoria, comenzando en la localidad 200h.
2. Escriba un programa en ensamblador que multiplique dos números ubicados en las
localidades 202h y 203h, dejar el resultado en formato little hendían en las localidades 200h
y 201h. Aplicar el método de La Russe.
3. Escriba un programa en ensamblador que multiplique dos números ubicados en las
localidades 202h y 203h, dejar el resultado en formato little hendían en las localidades 200h
y 201h. Aplicar el método de divide y vencerás.
4. Escriba un programa en ensamblador que calcule la raíz cuadrada de un numero ubicado
en la localidad 201h, dejar el resultado en la localidad 200h. Aplique el método de la raíz
aproximada.
5. Se sabe que la suma de los cubos de números positivos es el cuadrado de un número.
Aplique este método para obtener el cuadrado de ese número, la sumatoria será hasta el
número ubicado en la localidad 200h. Escriba un programa en ensamblador que calcule el
resultado de la suma de los cubos después obtenga la raíz cuadrada, deje resultados en las
localidades 201h y 202h.
6. Problemas Aritméticos.
Existen cinco tipos de instrucciones aritméticas en el microprocesador 8086, y son:
1. Instrucciones de suma.
2. Instrucciones de resta.
3. Instrucciones de multiplicación.
4. Instrucciones de división.
5. Instrucciones de comparación.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
29
Instrucciones de Suma.
ADD: Suma un registro o localidad de memoria con otro registro o localidad de memoria,
pero no puede sumar dos localidades de memoria.
ADC: Suma un registro o localidad de memoria con otro registro o localidad de memoria,
aparte suma el valor del carry, pero no puede sumar dos localidades de memoria.
INC: Incrementa en uno a un registro.
Ejercicio: La siguiente rutina suma dos números de múltiples dígitos. Se asume que el registro SI y DI
contienen la dirección de inicio de los números a sumar y CX el numero de dígitos a sumar. (digito =
palabra)
CLC
Lazo_sumador: MOV AX, [SI]
ADC [DI], AX
INC SI
INC SI
INC DI
INC DI
DEC CX
JNZ Lazo_sumador
RET
AAA (Adjust Result of Ascii Addition): Las instrucciones aritméticas para ASCII funcionan con números codificados en ASCII. El
valor de estos números es entre 30H y 39H para los números 0 a 9.
Se usa para ajustar un resultado en AL, suponiendo que se genera al sumar dos caracteres
ASCII. El ajuste es hecho de la siguiente manera:
1. Si el nibble bajo de AL esta entre 0 y 9, y la bandera AF es 0, ir al paso 3.
2. Si el nibble bajo de AL esta entre A y F y/o la bandera AF es 1, entones suma 6 a AL,
suma 1 a AH y pone la bandera AF en 1.
3. Limpia el nibble alto de AL.
La suma de dos números de un digito codificados en ASCII no dará por resultado ningún
dato útil. Por ejemplo si se suman un 31H y un 39H, el resultado es un 6AH.esta suma en
ASCII (1 + 9) produciría un resultado ASCII de dos dígitos, equivalente a un 10 decimal, el
cual es un 31h y un 30H en código ASCII. Si se ejecuta la instrucción AAA después de esta
suma, el registro AX contendrá un 0100H que, aunque no es un código ASCII, se puede
convertir si se le suma 3030H, que genera 3130H. La instrucción AAA borra AH si el
resultado es menor de 10 y agrega 1 a AH si el resultado es mayor que 10. Ejemplo:
MOV AX, 31H
ADD AL, 39H
AAA
ADD AX, 3030H
DAA (Decimal After Addition): Se para convertir el contenido de AL a un numero BCD,
solo debe ser usada después de una suma de números de BCD.
LOOP
M.C. Abel Díaz Olivares Lenguaje Ensamblador
30
Ejercicio: Escriba un programa que calcule la suma de una serie de números BCD. La longitud de la serie
esta en la localidad 202h, y la serie en si se inicia el la localidad 203h. Guarde la suma en la localidad 200h
y 201h formato little endian.. Ejemplo:
[202]= 28h
[203]= 55h
[204]= 26h
Resultado
[200]= 09h
[201]= 01h
XOR AX, AX
XOR DX, DX
MOV BX, 202h
XOR CX, CX
MOV CL, [BX]
Sigue: CLC
INC BX
ADD AL, [BX]
DAA
JNC Aquí
MOV AL, DL
ADD AL, 1
DAA
MOV DL, AL
Aquí: LOOP Sigue
MOV [200h], AL
MOV [201h], DL
INT 20h
Instrucciones de Resta.
SUB: Resta un registro o localidad de memoria con otro registro o localidad de memoria,
pero no puede restar dos localidades de memoria.
SBB: Resta un registro o localidad de memoria con otro registro o localidad de memoria,
aparte resta el valor del carry (borrow), pero no puede restar dos localidades de memoria.
DEC: Decrementa en uno a un registro.
AAS (Adjust Result of Ascii Substraction): Se usa para ajustar un resultado en AL,
suponiendo que se genera al restar dos caracteres ASCII.
Ajusta al registro AX después de una resta. Por ejemplo, supóngase que se resta un 35H de
un 39H. El resultado será 04H, que no requiere corrección; en este caso AAS no modificara
ni a AH ni a AL. Por otra parte si se resta 38H de 37H, entonces AL será igual a 09H y el
numero en AH se decrementara en 1.
DAS (Decimal After Substraction): Se para convertir el contenido de AL a un numero
BCD, solo debe ser usada después de una resta de números de BCD.
NEG: Se usa para realizar una negación, o bien es el complemento a 2.
Instrucciones de Multiplicación.
MUL: Se utiliza para obtener el producto en números de 8,16 y 32 bits. Si los números son
de 8 bits multiplica AL con otro registro o localidad de memoria, y deja el resultado en AX.
Si los números son de 16 bits multiplica AX con otro registro o localidad de memoria, y
deja el resultado en AX la parte baja y en DX deja la parte alta. Ejemplo:
AL
X
AX
MOV AL, [200h] MOV BL, [201h]
MUL BL
M.C. Abel Díaz Olivares Lenguaje Ensamblador
31
Si es de 16 bits. Ejemplo:
IMUL: Se utiliza para obtener el producto en números de 8,16 y 32 bits, la multiplicación
es con signo.
AAM: La instrucción AAM sigue a la instrucción de multiplicar, después de multiplicar
dos números de un digito BCD no empacados. En el siguiente ejemplo se multiplica un 5
por un 5; el resultado después de la multiplicación es 0019H en el registro AX. Después de
ajustar el resultado con la instrucción AAM, AX contiene un 0205H, que es el resultado de
25 en BCD no empacado. Si se suma 3030H a 0205H, se convierte en un resultado en
ASCII 3235H. Ejemplo:
MOV AL, 5
MOV CL, 5
MUL CL
AAM
Para multiplicar por potencias de dos mejor usar corrimientos. Ejemplo: 0000 0011 = 3 para multiplicarlo por 10 sin usar MUL
0000 0110 recorremos guardamos temp 2
0000 1100 recorremos 4 0001 1000 recorremos y lo sumamos con temp 8
se toma el ultimo que no excede (8) y faltarían 2 para 10 por ello sumamos con el del valor 2
0000 0110 0001 1000
0001 1110 = 30
Ejemplo:
0000 0101 = 5 para multiplicarlo por 8 sin usar MUL
0000 1010 recorremos 2 0001 0100 recorremos 4
0010 1000 = 40 recorremos y como es 8 exacto ese es el numero 8
Ejemplo:
0000 0101 = 5 para multiplicarlo por 20 sin usar MUL
0000 1010 recorremos 2 0001 0100 recorremos guardamos temp 4
0010 1000 recorremos 8
0101 0000 recorremos 16
se toma el ultimo que no excede (16) y faltarían 4 para 20
0101 0000
0001 0100 0110 0100 = 100
Instrucciones de División.
DIV: Se utiliza para obtener la división en números enteros de 8,16 y 32 bits, dicha
división es sin signo.
AX
X
DX AX
Si se tiene: MUL BX, AX es como si tuviera MUL BX
Si tiene:
MUL AX es como si tuviera MUL AX, AX
M.C. Abel Díaz Olivares Lenguaje Ensamblador
32
IDIV: Se utiliza para obtener la división en números enteros con signo de 8,16 y 32 bits.
Para la división de 8 bits utiliza el registro AX para almacenar el dividendo, que se divide
entre el contenido de cualquier registro o localidad de memoria de 8 bits. El cociente se
transfiere a AL después de la división y AH contiene el residuo de número entero. Ejemplo:
MOV AX, 0010H
MOV BL, 0FDH
IDIV BL
Quedaria
AX = 01FBH
AL= (-5) cociente
AH = 1 residuo
Para la división de 16 bits es semejante a la división de 8 bits, excepto que en lugar de
dividir entre AX un dividendo de 32 bits se divide entre DX-AX. El cociente aparece en
AX y el residuo en DX después de una división de 16 bits.
Para la división de 32 bits solo en los microprocesadores 80386 en adelante. El contenido
de 64 bits de EDX-EXA se divide entre el operando especificado por la instrucción y queda
un cociente de 32 bits en EAX y un residuo de 32 bits en EDX.
AAD: La instrucción AAD al contrario de todas las instrucciones para ajuste, aparece antes
de la división. La instrucción AAD requiere que el registro AX contenga un numero BCD
no empacado, de 2 dígitos (no ASCII) antes de que se ejecute. Después de ajustar el
registro AX con AAD se divide entre un numero BCD no empacado para generar un
resultado de un solo digito en AL y cualquier residuo quedara en AH. Ejemplo:
MOV BL, 9
MOV AX, 0702H
AAD
DIV BL
En el ejemplo anterior se forma un 72 en BCD y cambiado a hexadecimal es 48H, que se le pasa a AX al
momento de la instrucción AAD, después se divide 48H entre 9 y no regresa como resultado AH=00 y
AL=08.
CBW: Esta instrucción convierte el byte que esta en AL en un Word en AX. Se utiliza para
extender un número de 8 bits en otro de 16 bits con signo. Ejemplo:
MOV AX, 6545H
CBW
Quedaría AX=0045H
CWD: Esta instrucción convierte el Word en un numero doble Word (DX : AX). Ejemplo:
MOV AX, 6545H
MOV DX, 7987H
CWD
Quedaría AX=6545H DX=0000H
M.C. Abel Díaz Olivares Lenguaje Ensamblador
33
Raíz Cuadrada.
Para encontrar y/o calcular la raíz cuadrada existen 2 métodos posibles los cuales
son los siguientes:
1. Método aproximado.
02 = 0
12 = 1 1
22 = 4 3
32 = 9 5
42 = 16 7
52 = 25 9
Ejemplo:
Raíz de 49 es 7
49 -1 = 48 – 3 = 45 – 5 = 40 – 7 = 33 – 9 = 24 – 11 = 13 – 13 = 0
Ejemplo:
Raíz de 30 es 5.5
30 -1 = 29 – 3 = 26 – 5 = 21 – 7 = 14 – 9 = 5 – 11 = – 6
11 / 2 = 5.5
Ejemplo:
Raíz de 24 es 4.5
24 -1 = 23 – 3 = 20 – 5 = 15 – 7 = 8 – 9 = – 1
9 / 2 = 4.5
Ejercicio: XOR AX, AX
MOV BL, [200h]
MOV DL, 1
SIGUE: CMP BL, DL
JB ADO
SUB BL, DL
INC DL
INC DL
INC AL
DAA
JMP SIGUE
ADO: SHR DL, 1
CMP BL, 0
JE ACA
MOV CL, 5
JMP FIN
ACA: MOV CL, 0
FIN: MOV [201h], AL
MOV [202h], CL
INT 20H
M.C. Abel Díaz Olivares Lenguaje Ensamblador
34
2. Método Exacto.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
35
Ejercicio: Realice un programa que calcule la raíz cuadrada exacta de un numero ubicado el la localidad 200.
MOV BX, 200H
XOR AX, AX
MOV AL, [BX]
INC BX
NEW: MOV DX, 0
MOV DL, 40H
MOV CX, 0
MOV CL, 4
ACA: CMP AX, DX
JAE ADO
SHL DH, 1
JMP SIGUE
ADO: SUB AX, DX
SHL DH, 1
INC DH
SIGUE: SHL AX, 1
SHL AX, 1
LOOP ACA
MOV [BX], DH
INC BX
CMP BX, 203H
JNE NEW
INT 20H
7. Manipulación de Datos.
Números de AUTO – VERIFICACION.
Los dígitos de auto-verificación son utilizados como una inserción en números de
identificación por ejemplo tarjetas de crédito, números de inventario, equipaje, paquetería,
etc. Cuando estos números son manejados por sistemas computacionales. También se
pueden usar en mensajes, archivos de identidad y otras aplicaciones. El propósito de estos
dígitos es minimizar errores, por ejemplo dígitos transpuestos, dígitos desplazados o dígitos
perdidos.
Propósito minimizar errores en:
dígitos transpuestos (72 no se confunda 27).
dígitos desplazados (3891 en lugar de 8910).
dígitos perdidos (65 en lugar de 64).
ALGORITMO DOBLE SUMA DOBLE MODULO 10.
1. Limpiar el checksum.
2. Multiplicar el digito delantero por dos y sumar resultado al checksum.
3. Sumar el siguiente digito al checksum.
4. Continuar el proceso hasta usar todos los dígitos.
5. El digito menos significativo es el digito de auto-verificación.
Ejemplo: 549321
5x2+ 4 +9x2+ 3 +2x2+1 = 40
Ejemplo: 549320
5x2+ 4 +9x2+ 3 +2x2+0 = 39
Digito de Auto-Verificación
Digito de Auto-Verificación
M.C. Abel Díaz Olivares Lenguaje Ensamblador
36
DOBLE SUMA DOBLE Ejercicio: Calcule el digito verificador de una cadena de dígitos BCD. La longitud de la cadena (numero de
bytes) esta en la localidad 201H. El string inicia en la 202H. Calcule el digito de checksum con la técnica
doble suma doble y guardarlo en la localidad 200H.
Ejemplo: [201] = 03
[202] = 36
[203] = 68
[204] = 51
[200] = 03
Ejemplo: [201] = 04
[202] = 50
[203] = 29
[204] = 16
[205] = 83
[200] = 00
MOV BX, 201H
MOV CL, [BX]
MOV CH, 0
XOR AX, AX
MOV DL, 4
ADO: INC BX
MOV AL, [BX]
SHR AL, DL
SHL AL, 1
ADD AH, AL
MOV AL, [BX]
AND AL, 0FH
ADD AH, AL
LOOP ADO
AND AH, 0FH
MOV [200], AL
INT 20H
Ejercicio: Escriba un programa que cuente los elementos nulos de una lista que inicia en la localidad 202h. El
total de elementos esta en la 201h. Guarde resultado en la localidad 200h.
Ejemplo: [201] = 04h
[202] = 21h
[203] = 0ADh
[204] = 00h
[205] = 32h
[200] = 01h
Ejemplo: [201] = 05h
[202] = 00h
[203] = 71h
[204] = 00h
[205] = 00h
[206] = 4Bh
[200] = 03h
MOV BX, 201h
MOV CL, [BX]
MOV CH, 0
XOR AX, AX
MOV DL, AL
SIGUE: INC BX
CMP AL, [BX]
JNE ADO
INC DL
ADO: LOOP SIGUE
MOV [200h], DL
INT 20H
Ejercicio: Escriba un programa que cuente los elementos de una serie. La serie en si inicia en la localidad
201h, el fin esta indicado con un “carriage return” (carácter 0DH). Guarde el total de elementos, sin contar
CR en la localidad 200h.
Ejemplo: [201] = 32h
[202] = 90h
[203] = 47h
[204] = 0Dh
[200] = 03h
MOV DL, 0
MOV AL, 0DH
MOV BX, 201h
SIGUE: CMP AL, [BX]
JE ADO
INC DL
INC BX
JMP SIGUE
ADO: MOV [200h], DL
INT 20H
M.C. Abel Díaz Olivares Lenguaje Ensamblador
37
Ejercicio: Escriba un programa que ordene de forma descendente una serie de números
ubicados a partir de la localidad 201H, el número de elementos se encuentra en la localidad
200H.
MOV BX, 9
SIGUE: MOV DI, 200H
MOV CX, 9
OTRO: MOV AL, [DI]
CMP AL, [DI+1]
JB NO_CAMBIO
MOV DL, [DI+1]
MOV [DI+1], AL
MOV [DI], DL
NO_CAMBIO:
INC DI
LOOP OTRO
DEC BX
CMP BX, 0
JNE SIGUE
INT 20
Subrutinas: Los programas reales realizan tareas que pueden ser requeridas varias veces.
Por esta razón es conveniente escribirlas como subrutinas para que sean llamadas las veces
que sea necesario. ______
______
call 300
______
______
call 300
______
______
300
______
______
ret
Instrucciones para subrutinas:
CALL: NEARCALL (llamada cercana) FARCALL (llamada lejana)
RET: RETN (retorno cercano) RETF (retorno lejano)
PASE DE PARAMETROS. Algunas subrutinas como la conversión requieren de recibir parámetros como
entrada, también es posible que la subrutina genere parámetros de salida. En el 8086, los
parámetros se acostumbran pasar en el STACK y se recuperan con el registro BP.
_____
mov al, [400]
push ax
call hexade
_______
hexade
_______
push dx
ret
Cuando son muchos parámetros es preferible pasar el apuntador de los datos, esto
ahorra tiempo de ejecución y espacio en memoria.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
38
Subrutinas Re-entrantes: Son aquellas que se llaman así mismo sin crear conflictos. _____
_____
multiplica
_____
_____
call multiplica
_____
_____
ret
Documentación de subrutinas: Los listados de las subrutinas deben proporcionar
suficiente información de tal manera que el usuario no necesite revisar la estructura interna
de la subrutina. Debe incluir lo siguiente:
Una descripción del propósito de la subrutina.
Una lista de los parámetros de entrada y salida.
Registros y memoria usados.
Un ejemplo de cómo usarla.
Ejemplo:
HEXADE PROC NEAR
; subrutina que convierte un numero hexadecimal
; en el rango 0-FF a decimal (0 . . 255)
; Entrada numero a convertir AL
; Salida numero decimal DX
; Destruye AX, BX y CX.
Ordenamiento de datos de 8 bits.
Ejercicio: Implemente un programa que ordene una serie de números ubicados a partir de
la localidad 201h, el numero de elementos de la serie esta ubicado en la localidad 200h.
Cuenta =[200]-1 Apunta =201
Inter =0
Es [Apunta+1] >
[Apunta]
Inicio
Inter = 1
Temp = [Apunta] [Apunta]= [Apunta+1]
[Apunta+1]= Temp
Apunta= Apunta+1
Cuenta=Cuenta - 1
cuenta = 0 si
no
si
no
Fin
Inter = 0
si
no
M.C. Abel Díaz Olivares Lenguaje Ensamblador
39
Hexadecimal a Decimal. Ejercicio: Escriba un programa que convierta el contenido del acumulador en carácter ASCII. Coloque el
resultado en el acumulador. Asuma que el acumulador contiene un digito a decimal. Ejemplo:
[A] = 0Ch
Resultado [A] = 43h
[A] = 06h
Resultado [A] = 36h
ORG 100H
MOV AL, [200H]
CALL 150H
MOV [201H], AL
INT 20H
ORG 150H
CMP AL, 0AH
JB ACA
ADD AL, 07H
ACA: ADD AL, 30H
RET
Tercera Unidad: INTERFASE CON EL PUERTO PARALELO
1. Ubicación del Puerto Paralelo.
El puerto paralelo puede ser utilizado como un grupo de entradas y salidas de propósito
general. Posee 8 salidas, 5 entradas y 4 líneas mixtas. Se ubica en 3 posibles direcciones
que pueden ser:
3BC
378
278
Se puede dividir en 3 partes denominados base, base + 1, base + 2.
Aplicaciones:
Puerto de captura de datos.
Centinelas de Hardware.
Adaptadores de red.
Comunicación de 2 computadoras: Laplink, Interlink, NC, UAAlink, Terminal.
Control industrial.
El sistema operativo guarda en la memoria baja la cantidad de puertos que tiene y la
ubicación de estos, en las siguientes localidades: 1er p.p 0000:0408
0000:0409
2do p.p 0000:040A
0000:040B
3er p.p 0000:040C
0000:040D
D0:408 - 78 03 78 02 . . . . .
LPT1 LPT2
A >= 10
Inicio
A = A + 7
si
no
Fin A = A + 30
M.C. Abel Díaz Olivares Lenguaje Ensamblador
40
2. Puerto Base, Puerto de Salida. Se ubica en la dirección base, es un puerto de salida de 8 bits, utiliza la siguiente
distribución:
Bit Posición DB25
0 2
1 3
2 4
3 5
4 6
5 7
6 8
7 9
M.C. Abel Díaz Olivares Lenguaje Ensamblador
41
3. Puerto Base + 1, Puerto de Entrada. Se ubica en la dirección base + 1, es un puerto de entrada de 5 bits, utiliza la siguiente:
Bit Nivel Leído Pin DB25 Señal
0 -- -- --
1 -- -- --
2 -- -- --
3 1 15 --
4 1 13 Select
5 1 12 Paperad
6 1 10 ACK
7 0 11 Busy
4. Puerto Base + 2, Puerto de Entrada-Salida. Se ubica en la dirección base + 2. Normalmente es un puerto de salida, pero es posible
utilizarlo como entrada pidiéndole previamente la letra b, esto es para que los transistores
no estén aterrizados. Las líneas se ubican de la siguiente manera:
Bit Nivel Leído Pin DB25 Señal
0 0 1 Strobe
1 0 14 Autofeed
2 1 16 Init printer
3 0 17 Select in
4 -- -- --
5 -- -- --
6 -- -- --
7 -- -- --
Programa para escribir en el puerto paralelo:
El siguiente programa asume que en las ocho líneas de datos existe algún dispositivo que
lee los datos, por ejemplo led‟s que se encienden y apagan según los datos.
7E
BD
DB
E7
E7
DB
BD
7E
- D0:408
- O378, FF
- O378, 0
M.C. Abel Díaz Olivares Lenguaje Ensamblador
42
PUSH DS
XOR AX, AX
MOV DS, AX
MOV BX, 408h
MOV DX, [BX]
POP DS
MOV AL, 7E
CALL 300h
MOV AL, BD
CALL 300h
MOV AL, DB
CALL 300h
MOV AL, E7
CALL 300h
MOV AL, E7
CALL 300h
MOV AL, DB
CALL 300h
MOV AL, BD
CALL 300h
MOV AL, 7E
CALL 300h
INT 20h
ORG 300h
MOV CX, 0FFFFh
AQUI: LOOP AQUI
RET
ORG 300h
MOV BX, 0FFh
ABC: MOV CX, 0FFFFh
AQUI: LOOP AQUI
DEC BX
JNZ ABC
RET
Ejercicio: Implemente un programa que envíe una secuencia de datos por el Puerto paralelo. En la localidad
200h se encuentran el número de veces que se repite la secuencia, en la localidad 201h indica el número de
bytes de la tabla y en la localidad 202h se encuentra el tiempo de espera.
MANEJO DE CARGAS GRANDES POR EL PUERTO PARALELO.
Para que un dispositivo de control sea útil, debe poder accionar componentes de
consumo alto de energía. Debido al bajo voltaje y baja corriente de las líneas del puerto se
requiere “amplificar” esta señal.
Existen tres formas de amplificar:
- Drivers integrados.
- Transistores
- Relevadores.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
43
Drivers integrados.
Transistores.
Relevadores.
Ejercicio: Implemente un programa que lea un byte de datos por el Puerto paralelo. Una vez capturado ese
byte, dejarlo reflejado en la dirección base del puerto paralelo.
PUSH DS
XOR AX, AX
MOV DS, AX
MOV BX, 408h
MOV DX, [BX]
POP DS
INC DX
INC DX
MOV AL, 4h
OUT DX, AL ; Forza al puerto para que sea entrada
IN AL, DX ; Lee B+2
AND AL, 0FH ; Elimina nibble alto
MOV BL, AL
DEC DX ; Apunta B+1
IN AL, DX ; Lee B+1
AND AL, 0F0H ; Apaga nibble bajo
ADD AL, BL ; Concatena
XOR AL, 1000 1011b ; Regresa líneas invertidas a normal
DEC DX ; Apunta Base
OUT DX, AL
INT 20h
M.C. Abel Díaz Olivares Lenguaje Ensamblador
44
Cuarta Unidad: MANEJO DE PUNTO FLOTANTE
1. Introducción al punto fijo y punto flotante. Las computadoras no almacenan los números con precisión infinita sino de forma
aproximada empleando un número fijo de bits (Binary Digit) o bytes (grupos de ocho bits).
Prácticamente todos las computadoras permiten al programador elegir entre varias
representaciones o 'tipos de datos'. Los diferentes tipos de datos pueden diferir en el número
de bits empleados, pero también en cómo el número representado es almacenado: en
formato fijo (también denominado 'entero') o en punto flotante (denominado 'real').
Aritmética de punto fijo
Un entero se puede representar empleando todos los bits de una palabra de
computadora, con la salvedad de que se debe reservar un bit para el signo. Por ejemplo, en
una máquina con longitud de palabra de 32 bits, los enteros están comprendidos entre -(231
- 1) y 231
- 1 = 2147483647. Un número representado en formato entero es 'exacto'. Las
operaciones aritméticas entre números enteros son también 'exactas' siempre y cuando:
1. La solución no esté fuera del rango del número entero más grande o más pequeño que se
puede representar (generalmente con signo). En estos casos se dice que se comete un error
de desbordamiento por exceso o por defecto (en inglés: Overflow y Underflow) y es
necesario recurrir a técnicas de escalado para llevar a cabo las operaciones.
2. La división se interpreta que da lugar a un número entero, despreciando cualquier resto.
Por estos motivos, la aritmética de punto fijo se emplea muy raramente en cálculos no
triviales.
2. Definición de NEF, Punto fijo y Punto flotante.
NEF: Es la representación estructural de un número en punto fijo, el cual indica el tamaño
del número (cantidad de bits), así como la cantidad de bits de la parte entera y la cantidad
de bits de la parte fraccional, la representación es la siguiente:
NEF (cantidad total de bits, no. de bits de la parte entera, no. de bits de la parte fraccional).
NEF (n, n1. n2).
Por ejemplo:
NEF (16, 8, 8): Indica que la cantidad total de bits de un numero en representación en punto
fijo es de 16 bits, 8 bits para la parte entera y 8 bits para la parte fraccional.
3. Punto fijo. La representación en punto fijo aplica para sistemas de numeración con signo o
sistemas de numeración sin signo.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
45
Números sin signo: Son números positivos y toman la cantidad de bits para la parte entera
positiva con un rango de (0.0 hasta 2n1
-1.2
21
1
2
n
n para n2>=1).
Números con signo: Son números que toman el bit mas significativo para el signo, 0 para
números positivos y 1 para números negativos con un rango de (-2n1-1
.2
21
1
2
n
n hasta 2
n1-1-1.
2
21
1
2
n
n para n2>=1). Si el número es negativo recuerde aplicar el complemento a dos a
todos los bits.
Recordemos que la representación en binario con punto fijo es la siguiente:
24 2
3 2
2 2
1 2
0 punto 2
-1 2
-2 2
-3 2
-4 2
-5
16 8 4 2 1 . 0.5 0.25 0.125 0.0625 0.03125
TRUCO RANCHERO PARA CONVERTIR LA PARTE FRACCIONAL:
Se debe multiplicar por dos el numero fraccional, si el resultado es mayor o igual a
1, se resta 1 y se coloca un bit 1, en la posición, se repite la operación tomando el resultado
de la resta anterior, y así sucesivamente hasta completar el numero de bits de la parte
fraccional. Al realizar las multiplicaciones por 2, puede darse el caso que nos arroje un
valor 1, en este caso la serie terminaría y colocamos un 1 en la posición del bit, ya que nos
indica que el valor ya esta representado.
Ejemplo:
Obtener en binario el numero 0.8125
2(0.8125) 1.625 0.625 1
2(0.625) 1.25 0.25 1
2(0.25) 0.5 0.5 0
2(0.5) 1 0 1
Para este ejemplo el numero seria: 0.1101
Ejemplo: Represente los siguientes números en decimal, a una representación en punto fijo,
utilizando un nef (8,4,4).
Números sin signo:
14.625 = 1110.1010
12.76 = 1100.1100
5.87 = 0101.1101
Números con signo
-5.75 = 1010.0100 ya que
5.75 = 0101.1100 con complemento a dos es 1010.0100
M.C. Abel Díaz Olivares Lenguaje Ensamblador
46
-7.375 = 1000.1010
7.375 = 0111.0110 con complemento a dos es 1000.1010
Ejemplo suma en punto fijo (-5.75 + 5.8125)
1010.0100 + 0101.1101 = 0000.0001
En decimal seria 0. 0625
4. Punto flotante. En una computadora típica los números en punto flotante se representan de la
manera descrita en el apartado anterior, pero con ciertas restricciones sobre el número de
dígitos de q y m impuestas por la longitud de palabra disponible (es decir, el número de bits
que se van a emplear para almacenar un número). Para representar un número en punto
flotante, los bits se acomodan del siguiente modo:
Signo del número real x: 1 bit
Signo del exponente m: 1 bit
Exponente (entero |m|): 7 bits
Mantisa (número real |q|): 23 bits
En la mayoría de los cálculos en punto flotante las mantisas se normalizan, es decir,
se toman de forma que el bit más significativo (el primer bit) sea siempre '1'.
Dado que la mantisa siempre se representa normalizada, el primer bit en q es
siempre 1, por lo que no es necesario almacenarlo proporcionando un bit significativo
adicional. Esta forma de almacenar un número en punto flotante se conoce con el nombre
de técnica del 'bit fantasma'.
Además puede representarse exactamente con |m| ocupando 7 bits y |q| ocupando 24
bits. La restricción de que |m| no requiera más de 7 bits significa que:
Ya que , puede manejar números tan pequeños como 10-38
y tan
grandes como 1038
. Este no es un intervalo de valores suficientemente generoso, por lo que
en muchos casos debemos recurrir a programas escritos en aritmética de doble precisión e
incluso de precisión extendida.
Como q debe representarse empleando no más de 24 bits significa que nuestros
números de máquina tienen una precisión limitada cercana a las siete cifras decimales, ya
que el bit menos significativo de la mantisa representa unidades de . Por
tanto, los números expresados mediante más de siete dígitos decimales serán objeto de
aproximación cuando se almacenen en el ordenador.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
47
Ejemplo: Convertir los siguientes números decimales a punto flotante de 32 bits.
Recordemos que la estructura del punto flotante es de la siguiente manera:
Signo (1 bit) Signo Exponente (1 bit) Exponente (7 bits) Mantisa (23 bits)
También recordemos que el exponente base es 127.
35.8125 =
100011.1101
Normalizando nos queda: 1.000111101 se recorrió el punto 5 veces hacia la izquierda
entonces se debe de sumar al exponente base.
Exponente: 127+5 = 132 en binario seria: 10000100
Ahora como el número es positivo seria 0 en el signo y tomando la parte fraccional para la
mantisa nos quedaría:
0 10000100 000111101 00000000000000 en hexadecimal seria
420F4000
0.375 =
0.011
Normalizando nos queda: 1.1 se recorrió el punto 2 veces hacia la derecha entonces se debe
de restar al exponente base.
Exponente: 127-2 = 125 en binario seria: 01111101
Ahora como el número es positivo seria 0 en el signo y tomando la parte fraccional para la
mantisa nos quedaría:
0 01111101 10000000000000000000000 en hexadecimal seria
3EC00000
-35.8125 =
100011.1101 es 35.8125
Normalizando nos queda: 1.000111101 se recorrió el punto 5 veces hacia la izquierda
entonces se debe de sumar al exponente base.
Exponente: 127+5 = 132 en binario seria: 10000100
Ahora como el número es negativo seria 1 en el signo y tomando la parte fraccional para la
mantisa nos quedaría:
1 10000100 000111101 00000000000000 en hexadecimal seria
C20F4000
-0.375 =
0.011 es 0.375
Normalizando nos queda: 1.1 se recorrió el punto 2 veces hacia la derecha entonces se debe
de restar al exponente base.
Exponente: 127-2 = 125 en binario seria: 01111101
Ahora como el número es negativo seria 1 en el signo y tomando la parte fraccional para la
mantisa nos quedaría:
1 01111101 10000000000000000000000 en hexadecimal seria
BEC00000
M.C. Abel Díaz Olivares Lenguaje Ensamblador
48
Quinta Unidad: INTERRUPCIONES DEL DOS Y BIOS
Para hacer uso de los recursos de una computadora es posible utilizar subrutinas del
sistema operativo siempre y cuando estén documentadas. Las primeras computadoras no
permitían que los programadores hicieran uso de están facilidades.
1. Estructura del MS-DOS.
Rutinas de ROM (Trabajadores): Es quien realmente trabaja, y se encuentran las rutinas
que mueven datos de hardware al software y viceversa, manejan bytes y están ubicadas en
una memoria física de la computadora (BIOS EPROM).
IBMBIOS (Capataz): Esta parte viene en los discos como un archivo oculto, cualquier
llamada a la rutina de ROM debe pasar por aquí. Si hubiera alguna falla en las rutinas aquí
se corrige, también se incluye un mapa de la ubicación y finalidad de cada rutina de ROM.
IBMDOS (Gerente): Es el otro archivo oculto, no atiende detalles de bytes, trabaja con
sectores cuando llama al disco, principalmente ve todo como archivos. También incluye
algunas subrutinas al sistema operativo.
Command (Gerente General): Es la interfaz con el usuario, se encarga de recibir las
órdenes, validarlas y pasarlas a las capas de más abajo. Por ejemplo, es quien mantiene el
mensaje c:\>_.
En las rutinas del DOS son 256, las cuales se invocan con la interrupción 21H y se eligen
en el número adecuado en AH.
MOV AH, 00H MOV AH, 0FFH
INT 21H INT 21H
M.C. Abel Díaz Olivares Lenguaje Ensamblador
49
2. Vector de Interrupciones.
Una interrupción es una llamada generada por el hardware (derivada en el exterior
por una señal de hardware) o una llamada generada por el software (derivada en el interior
por una instrucción). Cualquiera de ella interrumpirá el programa porque llamara a un
procedimiento para servicio de interrupción o un manejador de interrupción.
Numero Función 0 Error al dividir.
1 Paso a paso.
2 Terminal de interrupción (depurar).
3 Punto de ruptura.
4 Sobre flujo aritmético.
5 Imprimir clave de pantalla e instrucción BOUND.
6 Error por instrucción ilegal.
7 Interrupción por coprocesador no presente.
8 Tictac de reloj (hardware).
9 Teclado (hardware).
A Interrupción 2 de hardware (bus del sistema)
B-F Interrupciones de hardware 3 a 7 en hardware.
10 BIOS de video.
11 Entorno del equipo.
12 Memoria de tamaño normal.
13 Servicio directo al disco.
14 Servicio al puerto COM serial.
15 Servicio diverso.
16 Servicio al teclado.
17 Servicio LPT a puerto paralelo.
18 ROM BASIC.
19 Borrar y restaurar.
1A Servicios al reloj.
1B Manejador de control de ruptura.
1C Servicio a temporizador del usuario.
1D Apuntador para tabla de parámetros para monitor.
1E Apuntador para tabla de parámetros de unidad de disco.
1F Apuntador para tabla de patrón de caracteres gráficos.
20 Terminar el programa.
21 Servicio DOS.
22 Manejador de terminación del programa.
23 Manejador de control C.
24 Manejador de error critico.
25 Leer disco.
26 Escribir disco.
27 Terminar y permanecer residente.
28 DOS ocioso.
2F Manejador múltiple.
70-77 Interrupciones 8 a 15 en el hardware.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
50
3. Interrupción 21H.
Las interrupciones de servicio DOS, es por medio de la interrupción 21H, donde se
deja el servicio en el registro AH, y seguido de esto la instrucción INT 21H, la cual ejecuta
la interrupción del servicio DOS.
3.1 Servicio 02 Display. El servicio 2 de la interrupción 21H es:
Output Character (Salida de carácter a pantalla):
Registro al entrar:
AH = 2
DL = carácter (valor ASCII).
Registro al regresar:
Sin cambios.
Sintaxis: Solo en TASM
MOV DL, „*‟ ; Imprime
MOV AH, 2 ; un
INT 21H ; asterisco
Ctrl – Break : Interrumpe al estar imprimiendo.
Ejercicio: Escriba en ensamblador un programa que limpia la pantalla.
MOV CX, 07D0H
ACA: MOV DL, „b‟
MOV AH, 2
INT 21H
LOOP ACA
INT 20H
3.2 Servicio 09 Display. El servicio 9 de la interrupción 21H es:
Output Character String (Salida de una cadena de caracteres a pantalla):
Registro al entrar:
AH = 9
DX = Offset de la dirección del string.
DS = Segmento de la dirección del string.
Registro al regresar:
Sin cambios.
El string debe terminar con $.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
51
Ejercicio: Escriba en ensamblador un programa que despliegue en pantalla “arriba las
chivas”.
MOV DX, CAD
MOV AH, 9
INT 21H
INT 20H
CAD: db „arriba las chivas $‟
DATA SEGMENT
MENS DB „ARRIBA LAS CHIVAS‟,10,13,‟$‟
MEN1 DB „VIVA LA REVOLUCION $‟
ENDS
STACK SEGMENT
DW 128 DUP (0)
ENDS
CODE SEGMENT
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET MENS
MOV AH, 9
INT 21H
MOV DX, OFFSET MEN1
INT 21H
MOV AH, 4CH
INT 21H
ENDS
3.3 Servicio 01 Keyboard Input. El servicio 1 de la interrupción 21H es:
Character Input With Echo (Entrada de carácter con eco):
Registro al entrar:
AH = 1
Registro al regresar:
AL = carácter
SINTAXIS:
MOV AH, 1
INT 21H
OTRO: MOV AH, 1
INT 21H
JMP OTRO
El servicio 8 de la interrupción 21H es:
Character Input Without Echo (Entrada de carácter sin eco):
Registro al entrar:
AH = 8
Registro al regresar:
AL = carácter
SINTAXIS:
MOV AH, 8
INT 21H
OTRO: MOV AH, 8
INT 21H
JMP OTRO
M.C. Abel Díaz Olivares Lenguaje Ensamblador
52
3.4 Servicio 0AH Buffered Keyboard Input. El servicio 0AH de la interrupción 21H es:
Buffered Input (Entrada de una cadena de caracteres):
Registro al entrar:
AH = 0AH
DX = Offset del buffer.
DS = Segmento del buffer.
Registro al regresar:
Sin cambios.
Comentario:
Primer byte del buffer es la cuenta máxima de caracteres.
Segundo byte del buffer es el número real de caracteres escritos.
Ejemplo: MOV DX, CAD
MOV AH, 0AH
INT 21H
INT 20H
CAD: db 20H
3.5 Servicio 05 Printer Output. El servicio 05H de la interrupción 21H es:
Printer Output (Salida de caracteres a impresora):
Registro al entrar:
AH = 05H
DL = Carácter valor ASCII.
Registro al regresar:
Sin cambios.
Comentario:
Primer byte del buffer es la cuenta máxima de caracteres.
Segundo byte del buffer es el número real de caracteres escritos.
SINTAXIS:
MOV DL, „_‟
MOV AH ,5
INT 21H
M.C. Abel Díaz Olivares Lenguaje Ensamblador
53
Ejercicio: Escriba en ensamblador un programa que imprima UAA <CR> <LF>.
MOV DL, „U‟
MOV AH ,5
INT 21H
MOV DL, „A‟
MOV AH ,5
INT 21H
MOV DL, „A‟
MOV AH ,5
INT 21H
MOV DL, 0DH
MOV AH ,5
INT 21H
MOV DL, 0AH
MOV AH ,5
INT 21H
INT 20H
3.6 Servicios para lectura del reloj de tiempo real. GET SYSTEM DATE (Servicio 2Ah)
Este servicio obtiene la fecha del sistema:
Registro al entrar:
AH = 2Ah
Registro al regresar:
AL = Día de la semana (0 = Domingo, 1 = Lunes, . . )
CX = Año
DH = Mes
DL = Día
SINTAXIS:
MOV AH ,2Ah
INT 21H
SET SYSTEM DATE (Servicio 2Bh)
Este servicio ingresa una fecha determinada al sistema:
Registro al entrar:
AH = 2Bh
CX = Año (1980 - 2099)
DH = Mes (1 - 12)
DL = Día (1 - 31)
Registro al regresar:
AL = Byte de estado (status byte)
(Si AL = 0 se ingreso fecha correcta, AL = 0FFh se ingreso fecha incorrecta)
SINTAXIS:
MOV AH ,2Bh
MOV CX, 2004
MOV DH, 6
MOV DL, 23
INT 21H
M.C. Abel Díaz Olivares Lenguaje Ensamblador
54
GET SYSTEM TIME (Servicio 2Ch)
Este servicio obtiene el tiempo del sistema:
Registro al entrar:
AH = 2Ch
Registro al regresar:
CH = Hora (formato militar 0 – 23)
CL = Minuto (0 - 59)
DH = Segundo (0 - 59)
DL = Centésima de segundo (0 - 99)
SINTAXIS:
MOV AH ,2Ch
INT 21H
SET SYSTEM TIME (Servicio 2Dh)
Este servicio ingresa una hora determinada al sistema:
Registro al entrar:
AH = 2Dh
CH = Hora (0 – 23)
CL = Minuto (0 - 59)
DH = Segundo (0 - 59)
DL = Centésima de segundo (0 - 99)
Registro al regresar:
AL = Byte de estado (status byte)
(Si AL = 0 se ingreso fecha correcta, AL = FFh se ingreso fecha incorrecta)
NOTA: No actualiza el reloj de tiempo real.
SINTAXIS:
MOV AH ,2Dh
MOV CH, 12
MOV CL, 46
MOV DH, 35
MOV DL, 5
INT 21H
Existen otras interrupciones que no son muy utilizadas, pero es posible consultar el manual
de IBM llamado DOS INTERRUPTS.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
55
INTERRUPCIONES DEL BIOS
Subrutinas del BIOS.
Conforman el nivel mas bajo del DOS, se puede clasificar como las siguientes
categorías.
Servicio del teclado.
Servicio del video.
Servicio del disco.
Servicio de la impresora.
Servicio de comunicaciones.
Servicio de la fecha y hora.
Servicio del sistema.
Servicios del teclado.
Scan-Code: Es un código que genera el microcontrolador del teclado para indicar que hay
alguna tecla presionada. Todas las teclas excepto cuatro: Shift, Caps Lock, Alt y ctrl.
Tienen scan code, pero no todas las teclas producen código ASCII. Las rutinas del BIOS
regresan ambos códigos, el código ASCII y el scan-code.
Read Keyboard Carácter (Servicio 0, Interrupción 16h)
Este servicio lee un carácter desde teclado:
Registro al entrar:
AH = 0
Registro al regresar:
AH = Scan code
AL = Código ASCII SINTAXIS:
MOV AH , 0
INT 16H
MOV SCAN_CODE, AH
MOV ASCII_KEY, AL
Read Keyboard Status (Servicio 1, Interrupción 16h)
Este servicio lee un carácter desde teclado:
Registro al entrar:
AH = 1
Registro al regresar:
AH = scan code
AL = código ASCII
SINTAXIS:
MOV AH , 1
INT 16H
JZ NO_KEY
MOV SCAN_CODE, AH
MOV ASCII_KEY, AL
NO_KEY:
M.C. Abel Díaz Olivares Lenguaje Ensamblador
56
Este servicio es similar al anterior, examina el buffer de teclado. Pero además afecta
la bandera cero. Si hay una tecla pendiente de leer la bandera cero se limpia, en caso
contrario la bandera cero se pone en 1. Tampoco detecta las teclas que no generan código
de scan-code.
Read Keyboard Shift Status (Servicio 2, Interrupción 16h)
Este servicio regresa el estado de la tecla presionada:
Registro al entrar:
AH = 2
Registro al regresar:
AL = Shift status (ver tabla)
SINTAXIS:
MOV AH , 2
INT 16H
Existen otros servicios que no son muy útiles, por ejemplo ajustar la velocidad de
repetición, verificar si el teclado es extendido o no, escribir en el buffer del teclado y otras
mariguanadas.
Servicios de la impresora.
Print Character (Servicio 0, Interrupción 17h)
Este servicio imprime un carácter en una impresora determinada:
Registro al entrar:
AH = 0
AL = Carácter
DX = Impresora a usar
Registro al regresar:
AH = Printer status (ver tabla)
SINTAXIS:
MOV AL, „*‟
MOV DX, 0
MOV AH , 0
INT 17H
Printer Status
M.C. Abel Díaz Olivares Lenguaje Ensamblador
57
Initialize Printer (Servicio 1, Interrupción 17h)
Este servicio inicializa la impresora:
Registro al entrar:
AH = 1
DX = Impresora a usar (0 = LPT1, 1 = LPT2, 2 = LPT3)
Registro al regresar:
AH = Printer status (ver tabla)
SINTAXIS:
MOV DX, 0 ; Al inicializar mandamos 08 y 0C
MOV AH , 1 ; La misma interrupción manda los dos valores
INT 17H
Printer Status
4. Interrupción 10h, Servicios del video.
La interrupción 10h permite manipular la tarjeta de video para desplegar texto y
graficas, otros servicios permiten definir el tamaño del cursor, leer lápiz óptico, definir
ventana, etc.
Atributos de un carácter.
B800 Segmentos de
B000 memoria de video
M.C. Abel Díaz Olivares Lenguaje Ensamblador
58
Ejercicio: Escriba en ensamblador un programa que despliegue un A con un atributo de destello normal,
fondo negro, intenso y el frente blanco.
MOV AX, B800h
MOV DS, AX
MOV BX, 0
MOV AL, 41h ; Ascii de la letra A
MOV [BX], AL
INC BX
MOV AL, 0Fh
MOV [BX], AL
INT 20h
Ejercicio: Escriba en ensamblador un programa limpie la pantalla utilizando el segmento de video.
MOV AX, B800h
MOV DS, AX
MOV BX, 0
MOV CX, 07D0h ; 2000 localidades
aca: MOV AX, 07 20h ; 07 porque es el atributo y 20 porque es el Ascii de la barra espaciadora.
MOV [BX], AX
INC BX
INC BX
LOOP aca
INT 20h
Scroll Active Page Up (Servicio 6, Interrupción 10h)
Este servicio roda la pantalla a una configuración determinada:
Registro al entrar:
AH = 0
CH = Renglón superior izquierdo
CL = Columna superior izquierdo
DH = Renglón inferior derecho
DL = Columna inferior derecho
AL = 0 ; Cuando AL=0 limpia la pantalla
Registro al regresar:
Sin cambios.
Ejercicio: Escriba en ensamblador un programa espejo.
MOV DX, aca
MOV AH, 0Ah
INT 21h
MOV DL, 0Dh
MOV AH, 2
INT 21h
MOV DL, 0Ah
MOV AH, 2
INT 21h
MOV DX, aca + 2
MOV AH, 9
INT 21h
INT 20h
aca: DB 20h
M.C. Abel Díaz Olivares Lenguaje Ensamblador
59
Existen servicios para rodar la ventana hacia abajo, escribir caracteres gráficos,
cambiar el tamaño y la forma del cursor, escribir píxeles, colocar el cursor en alguna
localidad, leer la posición actual del cursor, etc.
Write Dot (Servicio 0Ch, Interrupción 10h)
Este servicio imprime un punto en una coordenada específica:
Registro al entrar:
AH = 0Ch
CX = Columna
DX = Renglón
Registro al regresar:
Sin cambios.
Ejercicio: Escriba en ensamblador un programa para dibujar una línea horizontal, de puntos.
MOV DX, 0 ; Primer renglón
MOV CX, 0 ; Inicio de la línea horizontal
otro: MOV AL, 1 ; Define el color
MOV AH, 0Ch ; Funcion write dot
INT 10h ; Llamada al BIOS
INC CX ; Siguiente punto
CMP CX, 300h ; Lista todos los puntos
JL otro ; Aun no
INT 20h
5. Interrupciones para el puerto serie.
Conector DB25 y Conector DB9.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
60
CONECTOR DB9
1. Carrier Detect (Portador detector)- Determina si el modem está conectado a una
línea telefónica en funcionamiento.
2. Receive Data (Receptor)- La computadora recibe la información enviada por el
modem.
3. Transmit Data (Transmisor)- La computadora envía información al modem.
4. Data Terminal Ready - La computadora le dice al modem que está listo para hablar.
5. Signal Ground (Tierra)- Este pin es aterrizado.
6. Data Set Ready - El Modem le dice a la computadora que esta listo para hablar.
7. Request To Send (Solicitar para envió)- La computadora le pregunta al modem si
esta puede enviar información.
8. Clear To Send - El modem le dice a la computadora que ya le puede enviar
información.
9. Ring Indicator - Una vez que una llamada ha tomado lugar, la computadora
reconoce por esta señal (enviada por el modem) que una llamada es detectada.
CONECTOR DB25
1. No utilizado.
2. Transmit Data (Transmisor)- La computadora envía información al modem.
3. Receive Data (Receptor)- La computadora recibe la información enviada por el
modem.
4. Request To Send (Solicitar para envío)- La computadora le pregunta al modem si
esta puede enviar información.
5. Clear To Send - El modem le dice a la computadora que ya le puede enviar
información.
6. Data Set Ready - El Modem le dice a la computadora que esta listo para hablar.
7. Signal Ground - Este pin es aterrizado.
8. Received Line Signal Detector - Determina si el modem está conectado a una línea
telefónica en funcionamiento.
9. No utilizado.
10. No utilizado.
11. No utilizado.
12. No utilizado.
13. No utilizado.
14. No utilizado.
15. No utilizado.
16. No utilizado.
17. No utilizado.
18. No utilizado.
19. No utilizado.
20. Data Terminal Ready - La computadora le dice al modem que está lista para hablar.
21. No utilizado.
22. Ring Indicator - Una vez que una llamada ha tomado lugar, la computadora
reconoce por esta señal (enviada por el modem) que una llamada es detectada.
23. No utilizado.
24. No utilizado.
25. No utilizado.
M.C. Abel Díaz Olivares Lenguaje Ensamblador
61
Los voltajes enviados por los pines pueden ser en 2 estados, Encendido o Apagado.
Encendido (valor binario de "1") significa que el pin está transmitiendo una señal entre -3 y
-25 volts, mientras que Apagado (valor binario de "0") quiere decir que está transmitiendo
una señal entre +3 y +25 volts.
Velocidades de la transmisión y recepción. /* Default 0x03 = 38,400 BPS */
/* 0x01 = 115,200 BPS */
/* 0x02 = 56,700 BPS */
/* 0x06 = 19,200 BPS */
/* 0x0C = 9,600 BPS */
/* 0x18 = 4,800 BPS */
/* 0x30 = 2,400 BPS */
/* 0x60 = 1,200 BPS */
/* 0xC0 = 600 BPS */
PROGRAMA QUE ENVIA Y RECIBE DATOS POR EL PUERTO SERIE
CONFIGURADO A UNA VELOCIDAD DE 9600BPS, 8 BITS, SIN PARIDAD Y 1 BIT
DE PARADA.
PROGRAMA ENSAMBLADOR
code segment
call init_port
otro: mov ah,1H
int 16H
jz no_key
mov ah,0H
int 16H
cmp al,1BH
jz fin
mov dx,3F8H
out dx,al
mov ah,2H
mov dl,al
int 21H
no_key: mov dx,3FDH ;direcciona a base+5
in al,dx
and al,01
cmp al,01
jnz otro
mov dx,3F8H
in al,dx
mov dl,al
mov ah,2H
int 21H
jmp otro
fin: mov ah,4CH
int 21H
;------------------inicializa el puerto a 2400 Bd----------------------------
init_port: mov dx,3FBH
mov al,80H
out dx,al
mov dx,3F8H
M.C. Abel Díaz Olivares Lenguaje Ensamblador
62
mov al,0CH
out dx,al
mov dx,3F9H
mov al,0H
out dx,al
mov dx,3FBH
mov al,3H
out dx,al
mov dx,3FAH
mov al,0C7H
out dx,al
mov dx,3FCH
mov al,0BH
out dx,al
ret
ends
PROGRAMA ENSAMBLADOR Y C
#include "stdio.h"
#include "conio.h"
#include "dos.h"
void inicia();
void enviar(char car);
void lectura();
int dbase=0x3F8;
int base1=0x3F9;
int base2=0x3FA;
int base3=0x3FB;
int base4=0x3FC;
int base5=0x3FD;
int est=0, salir=0;
char car;
void main()
{
inicia();
clrscr();
do
{
if (kbhit())
{
textcolor(1);
car=getche();
if (car==27)
salir=1;
enviar (car);
}
lectura();
}while(salir!=1);
}
void inicia()
{ /* PORT 1 - ESPECIFICACIONES DEL PUERTO SERIE */
asm{
mov dx,base3
mov al,0x80 /*SET DLAB ON*/
M.C. Abel Díaz Olivares Lenguaje Ensamblador
63
out dx,al
mov dx,dbase
mov al,0x0C /*SET BAUD RATE DIVISOR LATCH LOW BYTE*/
out dx,al
mov dx,base1
mov al,0x00 /*SET BAUD RATE DIVISOR LATCH HIGH BYTE*/
out dx,al
mov dx,base3
mov al,0x03 /* 8 BITS, NO PARITY,1 STOP BIT*/
out dx,al
mov dx,base2
mov al,0xc7 /* FIFO CONTROL REGISTER*/
out dx,al
mov dx,base4
mov al,0x0b /*TURN ON DTR, RTS, AND OUT2*/
out dx,al
}
}
void enviar(char car)
{
while(est==0)
{
asm{
mov dx,base5
in al,dx
and al,0x20
mov ah,0x00
mov est,ax
}
}
asm{
mov dx,dbase
mov al,car
out dx,al
}
}
void lectura()
{
asm{
mov dx,base5
in al,dx
and al,0x01
mov car,al
}
if (car)
{
asm{
mov dx,dbase
in al,dx
mov car,al
}
textcolor(4);
cprintf("%c",car);
}
}
M.C. Abel Díaz Olivares Lenguaje Ensamblador
64
6. Generación de sonido enviando pulsos s la bocina. Es el método fácil, se escriben ceros y unos en el bit 1 del puerto 61h.
Ejercicio: Escriba en ensamblador un programa que genere un sonido llamado “Ruido Blanco”.
IN AL, 61h
ADD AL, 0FCh
toggle: XOR AL, 2
OUT 61h, AL
MOV CX, 140h
aquí: LOOP aquí
JMP toggle
INT 20h
Ejercicio: Escriba en ensamblador un programa que genere sonido en todas las frecuencias.
; RUIDO BLANCO
; Genera un sonido en todas las frecuencias
; No se detiene, solo con RESET
stack segment
Dw 128 dup(0)
ends
code segment
inicio: MOV DX, 140h ; Valor inicial de espera
IN AL, 61h ; Lee el puerto 61h
ADD AL, 11111100b ; Apaga bits 0 y 1
sound: XOR AL, 2 ; Realiza el toggle al bit 1
OUT 61h, AL ; Salida al puerto 61h
ADD DX, 9248h ; Suma patron aleatoria
MOV CL, 3 ; Define rotación en 3 bits
ROR DX, CL ; Lo rota
MOV CX, DX ; Lo copia en cx
AND CX, 1FFh ; Apaga 7 bits altos
OR CX, 10h ; Se asegura que no sea muy corto
aquí: LOOP aquí
JMP sound
MOV AH, 4Ch ; Program Terminate
INT 21h
ends
M.C. Abel Díaz Olivares Lenguaje Ensamblador
65
7. Generación de sonidos usando el Timer Programable. Las PC‟s incluyen un chip con tres TIMERS, se usan para las siguientes funciones:
1. DMA.
2. Reloj del sistema.
3. Generación de sonidos.
Ejercicio: Escriba en ensamblador un programa que genere un tono de sonido.
Stack segment
Dw 128 dup(0)
Ends
Code segment
MOV BX, 777h ; Valor del tono
MOV AL, 10110110b ; Número mágico
OUT 43h, AL ; Lo pasa al Timer 2
MOV AX, BX ; Carga tono
OUT 42h, AL ; Parte baja del puerto 42h
MOV AL, AH
OUT 42h, AL ; Parte alta del puerto 42h
IN AL, 61h ; Lee puerto 61h
OR AL, 3 ; Prende bit 0 y 1
OUT 61h, AL ; Salida del puerto 61h
MOV AH, 4Ch ; Program Terminate
INT 21h
ends
Ejercicio: Escriba en ensamblador un programa que genere un sonido como SIRENA.
; SIRENA
; Usa el Timer 2 para sumar la sirena
Stack segment
Dw 128 dup(0)
ends
Code segment
MOV BX, 0FFFFh ; Valor del tono
MOV AL, 10110110b ; Número mágico
OUT 43h, AL ; Lo pasa al Timer 2
tono: MOV AX, BX ; Carga tono
OUT 42h, AL ; Parte baja del puerto 42h
MOV AL, AH
M.C. Abel Díaz Olivares Lenguaje Ensamblador
66
OUT 42h, AL ; Parte alta del puerto 42h
IN AL, 61h ; Lee puerto 61h
OR AL, 3 ; Prende bit 0 y 1
OUT 61h, AL ; Salida del puerto 61h
DEC BX ; Cambia de tono
MOV CX, 100d ; Carga un valor para retardo
aquí: LOOP aquí ; Genera un retardo
JMP tono
MOV AH, 4Ch ; Program Terminate
INT 21h
ends
Programa Piano
El siguiente programa genera tonos de frecuencia fija, que corresponden a la octava
4 de un piano. (El libro PC Interno de Tischer pag 747 contiene un programa con 8
octavas). Se usan las siguientes frecuencias:
Tecla Nota Frecuencia
1 DO 262
2 RE 294
3 MI 330
4 FA 347
5 SOL 392
6 LA 440
7 SI 494
8 DO 524
Nota: Teclas de los números que están en la parte superior, no las del teclado numérico.
; PIANO
; Usa el Timer 2 del 8253 para generar notas de la escala musical
Data segment
nota DW 262, 294, 330, 347, 392, 440, 494
ends
stack segment
dw 128 dup(0)
ends
code segment
mov ax, data
mov ds, ax
read_key:
lea bx, nota
mov ah, 8
M.C. Abel Díaz Olivares Lenguaje Ensamblador
67
int 21h
cmp al, 1bh
jz exit
sub al, 31h
shl al, 1
cbw
add bx, ax
mov al, 10110110b
out 43h, al
mov ax, [bx]
out 42h, al
mov al, ah
out 42h, al
in al, 61h
or al, 3
out 61h, al
jmp read_key
exit:
in al, 61h
and al, 11111100b
out 61h, al
mov ah, 4ch
int 21h
ends
Sexta Unidad: INTERFASE CON LENGUAJE C
1. Introducción a la interface con Ensamblador. La interface del lenguaje de programación C con ensamblador es de suma
importancia ya que con ello podemos manipular dispositivos y/o hardware, ya que con solo
ensamblador es un poco mas tedioso, al realizar esto podemos realizar procedimientos y/o
funciones las cuales son utilizadas con mayor facilidad, también es conveniente utilizarla
para dar una mejor estética a los programas realizados e implementados también con
código en ensamblador, se recomiendo utilizar lenguaje ensamblador en rutinas para
obtener una buena precisión, o bien para tener una buena y rapida respuesta (velocidad),
por ejemplo en rutinas de tiempo .
2. Interface sin pase de parámetros.
La interface sin pase de parámetros es la implementación de código en ensamblador sobre
el lenguaje de programación C, la cual utilizamos funciones y/o procedimientos en el cual
no enviamos datos a las funciones y/o procedimientos invocados. Veremos unos ejemplos
para que quede un poco mas claro:
M.C. Abel Díaz Olivares Lenguaje Ensamblador
68
Ejemplo 1:
//Declaracion de librerias
#include "iostream.h"
#include "conio.h"
//Declaracion de prototipos
void obtiene_puerto();
//Declaracion de variables globales
int puerto=0;
void main()
{
clrscr();
obtiene_puerto();
getch();
}
void obtiene_puerto()
{
asm{
push ds
xor ax, ax
mov ds, ax
mov bx, 408h
mov dx, [bx]
pop ds
mov puerto, dx
}
cout<<"El valor del puerto paralelo es "<<puerto;
}
Ejemplo 2:
//Declaracion de librerias
#include "iostream.h"
#include "conio.h"
//Declaracion de prototipos
int obtiene_puerto();
//Declaracion de variables globales
int puerto=0;
void main()
{
clrscr();
M.C. Abel Díaz Olivares Lenguaje Ensamblador
69
puerto=obtiene_puerto();
cout<<"El valor del puerto paralelo es "<<puerto;
getch();
}
int obtiene_puerto()
{
asm{
push ds
xor ax, ax
mov ds, ax
mov bx, 408h
mov dx, [bx]
pop ds
mov puerto, dx
}
return (puerto);
}
3. Interface con pase de parámetros.
El pase de parámetros de las funciones hasta que vamos a utilizar se conoce como "por
valor". Esto quiere decir que cuando el control pasa a la función, los valores de los
parámetros en la llamada se copian a "variables" locales de la función, estas "variables" son
de hecho los propios parámetros.
Ejemplo 1:
//Declaracion de librerias
#include "iostream.h"
#include "conio.h"
//Declaracion de prototipos
void obtiene_suma(int n1, int n2);
//Declaracion de variables globales
int num1, num2, res;
void main()
{
clrscr();
cout<<"Introduce un numero ";
cin>>num1;
cout<<"Introduce otro numero ";
cin>>num2;
obtiene_suma(num1, num2);
cout<<"El resultado de la suma es "<<res;
M.C. Abel Díaz Olivares Lenguaje Ensamblador
70
getch();
}
void obtiene_suma(int n1, int n2)
{
asm{
mov ax, n1
mov bx, n2
add ax, bx
mov res, ax
}
}
Ejemplo 2:
//Declaración de librerias
#include "iostream.h"
#include "conio.h"
//Declaración de prototipos
int obtiene_suma(int n1, int n2);
//Declaración de variables globales
int num1, num2, res;
void main()
{
clrscr();
cout<<"Introduce un numero ";
cin>>num1;
cout<<"Introduce otro numero ";
cin>>num2;
res=obtiene_suma(num1, num2);
cout<<"El resultado de la suma es "<<res;
getch();
}
int obtiene_suma(int n1, int n2)
{
asm{
mov ax, n1
mov bx, n2
add ax, bx
mov res, ax
}
return (res);
}
top related