Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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:
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
1
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
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.
4
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
32 bits
16 bits
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
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.
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.
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.
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
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).
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.
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.
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 DS, 0B70H Error, no se puede en direccionamiento inmediato, solo por registro.
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.
Motorola Intel
Big Endían Little Endian
10
M.C. Abel Díaz Olivares Lenguaje Ensamblador
11
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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.
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.
Manipulación de bits: Se utilizan para controlar los datos hasta el nivel bits. Estas
instrucciones incluyen operaciones lógicas, corrimientos y rotaciones.
13
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
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
16
M.C. Abel Díaz Olivares Lenguaje Ensamblador
Para ensamblar un programa debemos seguir los pasos anteriores, esto es realizar lo
siguiente:
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
; Asignación de memoria
nombre1 tipo valor1
stack segment
dw 128 dup(0)
ends
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
Ejemplo:
ORIG_DRIVE DB 0
ORIG_PATH DB 64 DUP (0)
PRE_PATH DB ‘\’
PATH DB 64 DUP (0)
ANY_FILE DB ‘*,*’,0
DIR_TABLE DB 256 DUP (19 DUP (0))
BREAK_INT_OFF DW 00
BREAK_INT_SEG DW 00
ACTION_CMD DB ‘SELECT’,0
DOIT_CMD DB ‘DELETE’,0
DRIVE_CMD DB ‘DRIVE’,0
PATH_CMD DB ‘PATH’,0
EXIT_CMD DB ‘EXIT’,0
ONE_MOMENT DB ‘Examining diskette . . one moment please !’,0
19
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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.
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.
20
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
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
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
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
23
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
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
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
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.
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.
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
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:
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.
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.
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:
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
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
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.
35
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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.
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.
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
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
Aplicaciones:
• Puerto de captura de datos.
• Centinelas de Hardware.
• Adaptadores de red.
• Comunicación de 2 computadoras: Laplink, Interlink, NC, UAAlink, Terminal.
• Control industrial.
39
M.C. Abel Díaz Olivares Lenguaje Ensamblador
40
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
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.
42
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
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.
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.
Registro al entrar:
AH = 2
DL = carácter (valor ASCII).
Registro al regresar:
Sin cambios.
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.
46
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
47
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
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
SINTAXIS:
MOV AH ,2Ah
INT 21H
SINTAXIS:
MOV AH ,2Bh
MOV CX, 2004
MOV DH, 6
MOV DL, 23
INT 21H
49
M.C. Abel Díaz Olivares Lenguaje Ensamblador
SINTAXIS:
MOV AH ,2Ch
INT 21H
Registro al regresar:
AL = Byte de estado (status byte)
(Si AL = 0 se ingreso fecha correcta, AL = FFh se ingreso fecha incorrecta)
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
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.
52
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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
56
M.C. Abel Díaz Olivares Lenguaje Ensamblador
57
M.C. Abel Díaz Olivares Lenguaje Ensamblador
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:
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
59