Está en la página 1de 0

M.C.

Abel Daz 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 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 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. 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)

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

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

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

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


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

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

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






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


[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

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.


Ejemplo: 549321
5x2+ 4 +9x2+ 3 +2x2+1 = 40
Ejemplo: 549320
5x2+ 4 +9x2+ 3 +2x2+0 = 39
Digito de Auto-Verificacin

Digito de Auto-Verificacin

M.C. Abel Daz Olivares Lenguaje Ensamblador
36

DOBLE SUMA DOBLE
Ejercicio: Calcule el digito verificador de una cadena de dgitos BCD. La longitud de la cadena (numero de
bytes) esta en la localidad 201H. El string inicia en la 202H. Calcule el digito de checksum con la tcnica
doble suma doble y guardarlo en la localidad 200H.

Ejemplo: [201] = 03
[202] = 36
[203] = 68
[204] = 51
[200] = 03

Ejemplo: [201] = 04
[202] = 50
[203] = 29
[204] = 16
[205] = 83
[200] = 00





MOV BX, 201H
MOV CL, [BX]
MOV CH, 0
XOR AX, AX
MOV DL, 4
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 (carcter 0DH). Guarde el total de elementos, sin contar
CR en la localidad 200h.

Ejemplo: [201] = 32h
[202] = 90h
[203] = 47h
[204] = 0Dh
[200] = 03h






MOV DL, 0
MOV AL, 0DH
MOV BX, 201h
SIGUE: CMP AL, [BX]
JE ADO
INC DL
INC BX
JMP SIGUE
ADO: MOV [200h], DL
INT 20H




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.

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 nmeros en decimal, a una representacin en punto fijo,
utilizando un nef (8,4,4).

Nmeros sin signo:
14.625 = 1110.1010
12.76 = 1100.1100
5.87 = 0101.1101

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)

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

Velocidades de la transmisin y recepcin.
/* Default 0x03 = 38,400 BPS */
/* 0x01 = 115,200 BPS */
/* 0x02 = 56,700 BPS */
/* 0x06 = 19,200 BPS */
/* 0x0C = 9,600 BPS */
/* 0x18 = 4,800 BPS */
/* 0x30 = 2,400 BPS */
/* 0x60 = 1,200 BPS */
/* 0xC0 = 600 BPS */

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

//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 Daz 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. 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();
}

void obtiene_suma(int n1, int n2)
{
asm{
mov ax, n1
mov bx, n2
add ax, bx
mov res, ax
}

}

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

int obtiene_suma(int n1, int n2)
{
asm{
mov ax, n1
mov bx, n2
add ax, bx
mov res, ax
}
return (res);
}