Sie sind auf Seite 1von 59

M.C.

Abel Díaz Olivares Lenguaje Ensamblador

OBJETIVO GENERAL
Introducir al estudiante a un lenguaje de bajo nivel.
Al finalizar el curso, el estudiante deberá poder desarrollar una gran variedad de programas en este lenguaje
los cuales 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 1. Evolución de los microprocesadores de INTEL.
microprocesadores, especialmente 2. Modelo de programación.
la serie 80x86 de INTEL. 3. Registro del microprocesador.
4. Banderas del Registro Status.
2. Conocerá los registros del 8086 5. Modos de direccionamiento.
6. Juego de instrucciones.
7. Organización de la memoria

SEGUNDA UNIDAD: USO DEL TURBO ENSAMBLADOR


Objetivo Específico :
1. Reconocerá las ventajas del 1. Introducción al proceso de Ensamblado.
Macroensamblador. 2. Estructura de programa.
3. Tipos y declaraciones.
2. Escribirá programas sencillos 4. Programas en línea recta.
directamente con Turbo 5. Programas con lazos.
Ensamblador. 6. Problemas aritméticos.
7. Manipulación de datos.
8. Enmascaramiento con AND y OR.
9. Rotación.

TERCERA UNIDAD: INTERFASE CON EL PUERTO PARALELO


Objetivo Especifico:
Realizará interfaces sencillas con la 1. Ubicación del puerto paralelo.
computadora utilizando el puerto 2. Puerto Base, el puerto de salida.
paralelo. 3. Puerto Base +1 el puerto de entrada.
4. Puerto Base +2 el puerto E-S.

1
M.C. Abel Díaz Olivares Lenguaje Ensamblador

CUARTA UNIDAD: INTERRUPCIONES DEL DOS Y BIOS


Objetivo Especifico:
1. Utilizará las funciones del MS-DOS. 1. Estructura del MS-DOS.
2. Vector de interrupciones.
2. Escribirá programas que empleen 3. Interrupción 21H.
los servicios de video. a. Servicio 02 Display.
b. Servicio 09 Display.
3. Escribirá programas en c. Servicio 01 Keyboard Input.
macroensamblador que generen d. Servicio 0AH Buffered Keyboard Input.
sonido. e. Servicio 05 Printer Output.
f. Servicios para lectura del reloj de tiempo real.
4. Interrupciones para el puerto serie.
5. Generación de sonido

BIBLIOGRAFÍA
FUNDAMENTAL: DE APOYO:
1. Lenguaje Ensamblador y Programación para PC IBM y 2. Using Assembly Language.
compatibles. Wyatt
Peter Abel 3ª Edition
3 ª Edición QUE
Prentice Hall
3. Pc Interno
Tischer
Marcombo

2
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Primera Unidad: MICROPROCESADORES INTEL 80x86


Lenguajes de alto nivel vs. Lenguajes de bajo nivel.

Más o Visual Basic, Delphi, Visual fox, etc.


amigable o Fortran, Basic, Pascal, Cobol.
con el o Java, C. Velocidad en
usuario, procesamiento
facilidad de
o Ensamblador. de instrucciones
programar.
o Hardware.

Lenguaje Ventaja Desventaja


Visual Basic, Visual Mejor presentación, buena relación Se requiere en
Fox, Delphi, etc. tiempo invertido / resultados. maquinas grandes.
Fortran, Basic, Pascal, Balance adecuado entre complejidad y Dedicación especial a
Cobol. facilidades del usuario. Realizados para ramas de la ciencia.
programar.
Java, C. Existe facilidad de crear nuevos Requiere ser
comandos. programador.
Ensamblador. Los lenguajes son cortos y rápidos. No es transportable.
Brecha semántica reducida. Todos los
recursos del sistema están disponibles.

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.

3
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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 8 bits 64Kb 256 instrucciones 1 MHZ
instrucción) Era compatible con
TTL
1973 F-8 (Fairchild), 6502 (MOS 8 bits 64Kb 256 instrucciones 1 MHZ
Tecnology), 68000 (Motorola),
Z80 (Ziling)
1977 8085 (1.3us por instrucción), 8 bits 64Kb 256 instrucciones 1 MHZ
generador de reloj, y controlador
de sistema integrado.
1978 8086 / 8088 (400ns inst) (carac a 16 bits 1Mb 2.5MIP (millones de 4.7 MHZ
evolucionar mult y div) instrucciones por seg)
1982 80286 16 bits 16Mb 8 MIP (millones de 16 MHZ
instrucciones por seg)
80386 32 bits 64Mb 16 MIP (millones de 33 MHZ
instrucciones por seg)
80486 32 bits 4 Gb 54 MIP (millones de 66 MHZ
instrucciones por seg)
Pentium 32 / 64 bits 4 Gb 100 MIP (millones de 75 MHZ
instrucciones por seg)
Pentium MMX 64 bits 4 Gb 233 MHZ

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

4
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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 CS
BP DS
SI SS
DI ES

Unidad
de BUS
control
del bus.

ALU 1
CU Cola de
2 Instrucciones
Flags 3

IP n

5
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

Nombre NOMBRE
32 bits
EAX AH AX AL Acumulador
Índice base
EBX BH BX BL
ECX CH CX CL Contador

EDX DH DX DL Datos
ESP SP Apuntador de pila

EBP BP Apuntador de base


EDI DI Índice destino

ESI SI Índice fuente

32 bits

16 bits

EIP IP Apuntador de Inst


EFLAGS FLAGS Banderas

Código
CS
DS Datos
Extra
ES
SS Pila
FS
No se le dan
GS nombres especiales

6
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

7
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

8
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

9
M.C. Abel Díaz Olivares Lenguaje Ensamblador

5. Modos de direccionamiento.
• Direccionamiento Inmediato: Transfiere n bytes o palabras de datos inmediatos
hacia el registro o localidad en la memoria en el destino. Ejemplo:

MOV AL, 22H


MOV EBX, 12345678H

MOV AL, 18H


MOV BX,1998H

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

MOV AX, 0B70H


MOV DS, AX

MOV DL, 0B800H Error.


MOV CX, 1
MOV CX, 0001

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


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

MOV CX, DX
MOV AH, DH
MOV BP, BX
MOV AX, BL Error
MOV AL, BL
MOV AH, 0
CBW Convierte de byte a word, si es positivo llena de ceros, si es neg llena de 1.

• Direccionamiento Directo: Transfiere bytes o palabra entre una localidad de


memoria y un registro. Ejemplo:

MOV DL, [300]


MOV DX, [200]

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


01 98 01 19 Motorola se guarda de la forma Big Endían, en
02 02 los procesadores Intel se almacena de la forma
Little Endían.

Motorola Intel
Big Endían Little Endian

10
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


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

MOV AX, [BX]


MOV [BX], AX

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


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

MOV AX, [BX + SI]


MOV [BX + DI], CX

• Direccionamiento Relativo por Registro: Transfiere bytes o palabra entre un


registro y una localidad de memoria direccionada por un registro índice o base y
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

11
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


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

MOV BX, 200H


MOV AL, [BX]
INC BX
MOV DL, [BX] MOV AL, [200H]
ADD AL, BL MOV BL, [201H] MOV AL, [200H] MOV AX, [200H]
INC BX ADD AL, BL ADD AL, [201H] ADD AL, AH
MOV [BX], AL MOV [202H], AL MOV [202H], AL MOV [202H], AL
INT 20H INT 20H INT 20H 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.

12
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

13
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


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

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

14
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

FFFFFFFF
8 bits
8 bits FFFFFFFE
FFFFFF
FFFFFFFD
FFFFFE

FFFF
8 bits FFFFFD

FFFE
16M bytes 4G bytes
FFFD

0002
1M byte 00000002
000002 00000001
0001
000001 00000000
0000
(a)
000000
(b) (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.

15
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Banco alto Banco bajo


banco impar banco par
FFFFF FFFFFF FFFFFE

FFFFE FFFFFD FFFFFC

FFFFD FFFFFB FFFFFA

8 bits 8 bits 8 bits

1M bytes 8M bytes 8M bytes


00002 000005 000004

00001 000003 000002

00000 000001 000000

Microprocesador D15-D8 D7-D0


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

Banco 3 Banco 2 Banco 1 Banco 0


FFFFFFFF FFFFFFFE FFFFFFFD FFFFFFFC

FFFFFFFB FFFFFFFA FFFFFFF9 FFFFFFF8

FFFFFFF7 FFFFFFF6 FFFFFFF5 FFFFFFF4

8 bits 8 bits 8 bits 8 bits

1G bytes 1G bytes 1G bytes 1G bytes


0000000B 0000000A 00000009 00000008

00000007 00000006 00000005 00000004

00000003 00000002 00000001 00000000

D31-D24 D23-D16 D15-D8 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.

16
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

17
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

18
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Equates (Igualaciones).
Son asignaciones que no definen espacio en memoria, el ensamblador las utiliza
para sustituir valores mas adelante.
Ejemplo:
Black EQU 0
Blue EQU 1
Green EQU 2
Cyan EQU 3
Red EQU 4
Margenta EQU 5
Brown EQU 6

Pseudo Operaciones de 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

19
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


MOV AL, [200h] MOV BX, 200h
ADD AL, [201h] MOV AL, [BX]
ADD AL, [202h] INC BX
: ADD AL, [BX]
ADD AL, [209h] :
MOV [20Ah], AL ADD AL, [BX]
INT 20h INC BX
MOV [20Ah], AL
INT 20h

20
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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:
MOV BX, 210h MOV SI, 210h
210 0 ADD BL, [200h] MOV BL, [200h]
211 1 MOV AL, [BX] MOV BH, 0
212 4 MOV [201h], AL MOV AL, [BX + SI]
213 9 INT 20h MOV [201h], AL
: INT 20h
219 81

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


en la localidad 200h, deje el cuadrado en la localidad 201h y el factorial en la 202h. Use
tablas de 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
c objetivo c objetivo

ROL RCL

c objetivo c objetivo

ROR RCR

21
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

c Objetivo c Objetivo
0 Lógico a la izq SAL 0 Lógico a la izq
SHL

Objetivo c c
Objetivo

SHR 0 Lógico a la der SAR Aritmético S


a la derecha

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

Fin

22
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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:
MOV AL, [200h]
[200h] = 18h AND AL, 0Fh
MOV [201h], AL
Resultado: MOV AL, [200h]
[201h] = 08h MOV CL, 4
[202h] = 01h SHR AL, CL
MOV [202h], AL
INT 20h

Programa uno. Programa dos


MOV AL, [200h]
MOV CL, 4 MOV AH, 2
SHR AL, CL INT 1Ah
MOV DL, AL MOV [200h], DH
ADD DL, 30h Programa 1
MOV AH, 2 MOV DL, 20h
INT 21h MOV AH, 2
MOV AL, [200h] INT 21h
AND AL, 0Fh MOV DL, 20h
MOV DL, AL MOV AH, 2
ADD DL, 30h INT 21h
MOV AH, 2 JMP 100h
INT 21h INT 20h
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

23
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


SUBB AX, BX (sustrae lo que tiene ax con bx, guarda resultado en ax)
Ejemplo:
CMP AX, BX (compara ax con bx)
JNE otro_lugar (salta si no son iguales a la etiqueta otro_lugar)

Saltos basados en datos con signo 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 MOV BX, 200h
[201h]=07h MOV AL, [BX]
[202h]=43h 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 XOR AX, AX
MOV BX, 200h MOV CL, 64h
Inicio: ADD DL, [BX] MOV BX, 200h
INC BX Inicio: ADD AL, [BX]
INC CL INC BX
CMP CL, 64h LOOP inicio
JB inicio MOV [264h], AL
MOV [264h], DL INT 20h
INT 20h

24
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

Inicio Inicio

Sección de Sección de
Inicialización Inicialización

Sección de Sección de
Procesamiento Control

Sección de si
Tarea Sección
Control Completa
Final Fin
¿?

Tarea
no
no Completa
¿? Sección de
Procesamiento
si

Sección
Final

Fin

25
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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:
MOV BX, 201h
[201]= 03h MOV CL, [BX]
[202]= 28h MOV CH, 0
[203]= 55h MOV AL, CH
[204]= 26h Sigue: INC BX
[200]= A6h ADD AL, [BX]
LOOP Sigue
MOV [200h], AL
INT 20h
LOOP : decrementa CX
JNZ etiqueta

Inicio

Apunta=201
Cuenta=[201]
Suma=0

Apunta + +

Suma+=[apuntador]

Cuenta--

Es
si
no cuenta = 0
[200] = suma
Fin

26
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Ejercicio: Escriba un programa que calcule cuantos bits de la localidad 200h son unos y coloque el resultado
en la localidad 201h. Ejemplo:
[200h]= 3Bh = 0011 1011
[201h]= 05h

Inicio MOV CL, 8


MOV CH, 0
MOV AL, [200h]
Cuenta=8 MOV DL, 0
Suma=0 Sigue: SHL AL, 1
Dato=[200]
JNC Aquí
INC DL
Aquí: LOOP Sigue
Mover dato un bit a
MOV [201h], DL
la izquierda
INT 20h

no

carry = 1
si Cuenta=Cuenta - 1 cuenta = 0
si
Suma = Suma +1 [201] = Suma

no
Fin
Ejercicio: Escriba un programa que encuentre el mayor de un bloque de datos. La longitud del bloque esta
en la localidad 201h y el bloque en si inicia en la localidad 202h. Guarde el resultado en la localidad 200h.
Asuma que los 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

Inicio MOV BX, 201h


MOV CL, [BX]
MOV CH, 0
Cuenta=[201] MOV AL, CH
Apunta=201 Sigue: INC BX
Mayor=0
CMP AL, [BX]
JAE Aqui
MOV AL, [BX]
Apunta = Apunta +
1
Aquí: LOOP Sigue
MOV [200h], AL
INT 20h

no
Es si si
Mayor > Mayor = [apunta] Cuenta=Cuenta - 1 Cuenta = 0 [200] = Mayor
[apunta]

no
Fin

27
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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 MOV BX, 202h
[203h]= 0C8h MOV CL, [BX]
[204h]= 0FAh MOV CH, 0
[205h]= 96h MOV AL, CH
Resultado MOV DL, CH
[200h]= 58h Cambia: INC BX
[201h]= 02h 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.

28
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Instrucciones de Suma.
ADD: Suma un registro o localidad de memoria con otro registro o localidad de memoria,
pero no puede sumar dos localidades de memoria.

ADC: Suma un registro o localidad de memoria con otro registro o localidad de memoria,
aparte suma el valor del carry, pero no puede sumar dos localidades de memoria.

INC: Incrementa en uno a un registro.


Ejercicio: La siguiente rutina suma dos 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 LOOP
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.

29
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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:

XOR AX, AX MOV AL, DL


[202]= 28h XOR DX, DX ADD AL, 1
[203]= 55h MOV BX, 202h DAA
[204]= 26h XOR CX, CX MOV DL, AL
Resultado MOV CL, [BX] Aquí: LOOP Sigue
[200]= 09h Sigue: CLC MOV [200h], AL
[201]= 01h INC BX MOV [201h], DL
ADD AL, [BX] INT 20h
DAA
JNC Aquí

Instrucciones de Resta.
SUB: Resta un registro o localidad de memoria con otro registro o localidad de memoria,
pero no puede restar dos localidades de memoria.

SBB: Resta un registro o localidad de memoria con otro registro o localidad de memoria,
aparte resta el valor del carry (borrow), pero no puede restar dos localidades de memoria.

DEC: Decrementa en uno a un registro.

AAS (Adjust Result of Ascii Substraction): Se usa para ajustar un resultado en AL,
suponiendo que se genera al restar dos caracteres ASCII.
Ajusta al registro AX 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 MOV AL, [200h]


MOV BL, [201h]
X MUL BL

AX

30
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

DX AX

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.

31
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

32
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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
2
2 =4 3
32 = 9 5
42 = 16 7
2
5 = 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

33
M.C. Abel Díaz Olivares Lenguaje Ensamblador

2. Método Exacto.

34
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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 Digito de Auto-Verificación


5x2+ 4 +9x2+ 3 +2x2+1 = 40 Digito de Auto-Verificación
Ejemplo: 549320
5x2+ 4 +9x2+ 3 +2x2+0 = 39

35
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.
MOV BX, 201H
Ejemplo: [201] = 03 MOV CL, [BX]
[202] = 36 MOV CH, 0
[203] = 68 XOR AX, AX
[204] = 51 MOV DL, 4
[200] = 03 ADO: INC BX
MOV AL, [BX]
Ejemplo: [201] = 04 SHR AL, DL
[202] = 50 SHL AL, 1
[203] = 29 ADD AH, AL
[204] = 16 MOV AL, [BX]
[205] = 83 AND AL, 0FH
[200] = 00 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 MOV BX, 201h


[202] = 21h MOV CL, [BX]
[203] = 0ADh MOV CH, 0
[204] = 00h XOR AX, AX
[205] = 32h MOV DL, AL
[200] = 01h SIGUE: INC BX
CMP AL, [BX]
Ejemplo: [201] = 05h JNE ADO
[202] = 00h INC DL
[203] = 71h ADO: LOOP SIGUE
[204] = 00h MOV [200h], DL
[205] = 00h INT 20H
[206] = 4Bh
[200] = 03h

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 MOV DL, 0


[202] = 90h MOV AL, 0DH
[203] = 47h MOV BX, 201h
[204] = 0Dh SIGUE: CMP AL, [BX]
[200] = 03h JE ADO
INC DL
INC BX
JMP SIGUE
ADO: MOV [200h], DL
INT 20H

36
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.
______
______ 300
call 300 ______
______ ______
______ ret
call 300
______
______
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.
_____ hexade
mov al, [400] _______
push ax push dx
call hexade ret
_______

Cuando son muchos parámetros es preferible pasar el apuntador de los datos, esto
ahorra tiempo de ejecución y espacio en memoria.

37
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

Inicio

Cuenta =[200]-1
Apunta =201
Inter =0

no no
Es Inter = 1 Apunta= Apunta+1
[Apunta+1] > si Temp = [Apunta] Cuenta=Cuenta - 1 cuenta = 0
si Inter = 0
[Apunta] [Apunta]= [Apunta+1]
[Apunta+1]= Temp
no
si
Fin

38
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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
Inicio MOV AL, [200H]
CALL 150H
MOV [201H], AL
INT 20H
A >= 10 si A=A+7 A = A + 30 Fin ORG 150H
CMP AL, 0AH
JB ACA
no 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

39
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

40
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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
- D0:408
BD - O378, FF
DB - O378, 0
E7
E7
DB
BD
7E

41
M.C. Abel Díaz Olivares Lenguaje Ensamblador

PUSH DS ORG 300h


XOR AX, AX MOV CX, 0FFFFh
MOV DS, AX AQUI: LOOP AQUI
MOV BX, 408h RET
MOV DX, [BX]
POP DS ORG 300h
MOV AL, 7E MOV BX, 0FFh
CALL 300h ABC: MOV CX, 0FFFFh
MOV AL, BD AQUI: LOOP AQUI
CALL 300h DEC BX
MOV AL, DB JNZ ABC
CALL 300h RET
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

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.

42
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Drivers integrados. Relevadores.

Transistores.

Ejercicio: Implemente un programa que lea un byte de datos por el Puerto paralelo. Una vez capturado ese
byte, dejarlo reflejado en la 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

43
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Cuarta Unidad: INTERRUPCIONES DEL DOS Y BIOS


Para hacer uso de los recursos de una computadora es posible utilizar subrutinas del
sistema operativo siempre y cuando 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

44
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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.

45
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

46
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


chivas”.
MOV DX, CAD
MOV AH, 9
INT 21H
INT 20H
CAD: db ‘arriba las chivas $’

DATA SEGMENT
MENS DB ‘ARRIBA LAS CHIVAS’,10,13,’$’
MEN1 DB ‘VIVA LA REVOLUCION $’
ENDS
STACK SEGMENT
DW 128 DUP (0)
ENDS
CODE SEGMENT
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET MENS
MOV AH, 9
INT 21H
MOV DX, OFFSET MEN1
INT 21H
MOV AH, 4CH
INT 21H
ENDS

3.3 Servicio 01 Keyboard Input.


El servicio 1 de la interrupción 21H es:
Character Input With Echo (Entrada de carácter con eco):

Registro al entrar: SINTAXIS:


AH = 1 MOV AH, 1
INT 21H
Registro al regresar: OTRO: MOV AH, 1
AL = carácter 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: SINTAXIS:


AH = 8 MOV AH, 8
INT 21H

Registro al regresar: OTRO: MOV AH, 8


AL = carácter INT 21H
JMP OTRO

47
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

48
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


MOV DL, ‘U’
MOV AH ,5
INT 21H
MOV DL, ‘A’
MOV AH ,5
INT 21H
MOV DL, ‘A’
MOV AH ,5
INT 21H
MOV DL, 0DH
MOV AH ,5
INT 21H
MOV DL, 0AH
MOV AH ,5
INT 21H
INT 20H

3.6 Servicios para lectura del reloj de tiempo real.


GET SYSTEM DATE (Servicio 2Ah)
Este servicio obtiene la fecha del sistema:
Registro al entrar:
AH = 2Ah
Registro al regresar:
AL = 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

49
M.C. Abel Díaz Olivares Lenguaje Ensamblador

GET SYSTEM TIME (Servicio 2Ch)


Este servicio obtiene el tiempo del sistema:
Registro al entrar:
AH = 2Ch
Registro al regresar:
CH = Hora (formato militar 0 – 23)
CL = Minuto (0 - 59)
DH = Segundo (0 - 59)
DL = 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.

50
M.C. Abel Díaz Olivares Lenguaje Ensamblador

4. Interrupciones para el puerto serie.

Conector DB25 y Conector DB9.

CONECTOR DB9
1. Carrier Detect (Portador detector)- Determina si el modem está conectado a una
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.

51
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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

52
M.C. Abel Díaz Olivares Lenguaje Ensamblador

PROGRAMA QUE ENVIA Y RECIBE DATOS POR EL PUERTO SERIE


CONFIGURADO A UNA VELOCIDAD DE 9600BPS, 8 BITS, SIN PARIDAD Y 1 BIT
DE PARADA.
PROGRAMA ENSAMBLADOR
code segment
call init_port
otro: mov ah,1H
int 16H
jz no_key
mov ah,0H
int 16H
cmp al,1BH
jz fin
mov dx,3F8H
out dx,al
mov ah,2H
mov dl,al
int 21H
no_key: mov dx,3FDH ;direcciona a base+5
in al,dx
and al,01
cmp al,01
jnz otro
mov dx,3F8H
in al,dx
mov dl,al
mov ah,2H
int 21H
jmp otro
fin: mov ah,4CH
int 21H

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


init_port: mov dx,3FBH
mov al,80H
out dx,al
mov dx,3F8H
mov al,0CH
out dx,al
mov dx,3F9H
mov al,0H
out dx,al
mov dx,3FBH
mov al,3H
out dx,al
mov dx,3FAH
mov al,0C7H
out dx,al
mov dx,3FCH
mov al,0BH
out dx,al
ret
ends

53
M.C. Abel Díaz Olivares Lenguaje Ensamblador

PROGRAMA ENSAMBLADOR Y C
#include "stdio.h"
#include "conio.h"
#include "dos.h"

void inicia();
void enviar(char car);
void lectura();
int dbase=0x3F8;
int base1=0x3F9;
int base2=0x3FA;
int base3=0x3FB;
int base4=0x3FC;
int base5=0x3FD;
int est=0, salir=0;
char car;

void main()
{
inicia();
clrscr();
do
{
if (kbhit())
{
textcolor(1);
car=getche();
if (car==27)
salir=1;
enviar (car);
}
lectura();
}while(salir!=1);
}
void inicia()
{ /* PORT 1 - ESPECIFICACIONES DEL PUERTO SERIE */
asm{
mov dx,base3
mov al,0x80 /*SET DLAB ON*/
out dx,al
mov dx,dbase
mov al,0x0C /*SET BAUD RATE DIVISOR LATCH LOW BYTE*/
out dx,al

mov dx,base1
mov al,0x00 /*SET BAUD RATE DIVISOR LATCH HIGH BYTE*/
out dx,al
mov dx,base3
mov al,0x03 /* 8 BITS, NO PARITY,1 STOP BIT*/
out dx,al
mov dx,base2
mov al,0xc7 /* FIFO CONTROL REGISTER*/
out dx,al
mov dx,base4
mov al,0x0b /*TURN ON DTR, RTS, AND OUT2*/
out dx,al

54
M.C. Abel Díaz Olivares Lenguaje Ensamblador

}
}
void enviar(char car)
{
while(est==0)
{
asm{
mov dx,base5
in al,dx
and al,0x20
mov ah,0x00
mov est,ax
}
}
asm{
mov dx,dbase
mov al,car
out dx,al
}
}
void lectura()
{
asm{
mov dx,base5
in al,dx
and al,0x01
mov car,al
}
if (car)
{
asm{
mov dx,dbase
in al,dx
mov car,al
}
textcolor(4);
cprintf("%c",car);
}
}
5. 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.

55
M.C. Abel Díaz Olivares Lenguaje Ensamblador

Ejercicio: Escriba en ensamblador un programa que genere un sonido llamado “Ruido Blanco”.
IN AL, 61h
ADD AL, 0FCh
toggle: XOR AL, 2
OUT 61h, AL
MOV CX, 140h
aquí: LOOP aquí
JMP toggle
INT 20h

Ejercicio: Escriba en ensamblador un programa que genere sonido en todas las frecuencias.
; RUIDO BLANCO
; Genera un sonido en todas las frecuencias
; No se detiene, solo con RESET
stack segment
Dw 128 dup(0)
ends
code segment

inicio: MOV DX, 140h ; 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

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

56
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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


Stack segment
Dw 128 dup(0)
Ends
Code segment
MOV BX, 777h ; Valor del tono
MOV AL, 10110110b ; 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
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

57
M.C. Abel Díaz Olivares Lenguaje Ensamblador

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
int 21h
cmp al, 1bh
jz exit
sub al, 31h
shl al, 1
cbw
add bx, ax

58
M.C. Abel Díaz Olivares Lenguaje Ensamblador

mov al, 10110110b


out 43h, al
mov ax, [bx]
out 42h, al
mov al, ah
out 42h, al
in al, 61h
or al, 3
out 61h, al
jmp read_key
exit:
in al, 61h
and al, 11111100b
out 61h, al
mov ah, 4ch
int 21h
ends

59

Das könnte Ihnen auch gefallen