Está en la página 1de 79

Universidad Catlica del Maule

Facultad de Ciencias de la Ingeniera


Escuela de Ingeniera Civil Informtica
Apuntes de Lenguaje Ensamblador
Arquitectura de Computadores II
Sergio Antonio Baltierra Valenzuela
Talca, Semestre II, 2013
1
ndice
1. Introduccin 5
1.1. Introduccin al Lenguaje Mquina y Ensamblador . . . . . . . 5
1.2. Sistemas Numricos . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3. Nmeros Negativos . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4. Cdigos Alfanumricos . . . . . . . . . . . . . . . . . . . . . . 10
2. Arquitectura Bsica del 8086 11
2.1. Registro Generales o de Datos . . . . . . . . . . . . . . . . . . 12
2.2. Registro de Segmento . . . . . . . . . . . . . . . . . . . . . . . 12
2.3. Registros Puntero e ndices . . . . . . . . . . . . . . . . . . . 13
2.4. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . 14
3. Instrucciones Bsicas del Procesador 8086 16
3.1. Antes de Comenzar . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2. Instrucciones de Transferencia de Datos . . . . . . . . . . . . . 17
3.3. Instrucciones Aritmticas . . . . . . . . . . . . . . . . . . . . . 18
3.3.1. Suma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.2. Resta . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3.3. Multiplicacin . . . . . . . . . . . . . . . . . . . . . . . 20
3.3.4. Divisin . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4. Otras Instrucciones Aritmticas . . . . . . . . . . . . . . . . . 21
3.5. Instrucciones Lgicas . . . . . . . . . . . . . . . . . . . . . . . 22
4. Pseudoinstrucciones 25
4.1. Denicin de Variables . . . . . . . . . . . . . . . . . . . . . . 25
4.2. Denicin de Arreglos . . . . . . . . . . . . . . . . . . . . . . 26
4.3. Denicin de Constantes . . . . . . . . . . . . . . . . . . . . . 27
4.4. Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5. Otras Instrucciones del procesador 8086 29
5.1. Instrucciones de Repeticin (Loop) . . . . . . . . . . . . . . . 29
5.2. Instruccin de Salto . . . . . . . . . . . . . . . . . . . . . . . . 30
5.3. Instrucciones de Subprogramas . . . . . . . . . . . . . . . . . 32
5.4. Instrucciones del Registro de Estado . . . . . . . . . . . . . . 33
5.5. Instrucciones de Comparacin . . . . . . . . . . . . . . . . . . 34
5.6. Instrucciones de Pila . . . . . . . . . . . . . . . . . . . . . . . 35
5.7. Instrucciones de Traslado de Datos . . . . . . . . . . . . . . . 37
5.8. Instrucciones de Conversin . . . . . . . . . . . . . . . . . . . 38
5.9. Instrucciones de Transferencia de Direcciones . . . . . . . . . . 39
5.9.1. Manejo de Arreglos . . . . . . . . . . . . . . . . . . . . 41
5.9.2. Manejo de Caracter, Caracteres y String . . . . . . . . 45
5.10. Instrucciones de Tratamiento de Cadenas de Caracteres . . . . 50
5.10.1. Instrucciones de Repeticion . . . . . . . . . . . . . . . 50
5.10.2. Instrucciones de Copiado . . . . . . . . . . . . . . . . . 50
5.10.3. Instrucciones de Comparacion entre Strings . . . . . . 52
5.10.4. Instrucciones de Carga . . . . . . . . . . . . . . . . . . 55
5.10.5. Instrucciones de almacenado . . . . . . . . . . . . . . . 56
5.10.6. Instrucciones de Comparacin de un Elemento . . . . . 58
5.11. Codicacin BCD . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.12. Instrucciones BCD de Ajuste ASCII (desempaquetados) y de
Ajuste Decimal (empaquetado) . . . . . . . . . . . . . . . . . 62
5.12.1. Ajuste Nmero con codicacin BCD desempaquetado
despus de la suma . . . . . . . . . . . . . . . . . . . . 62
5.12.2. Ajuste Nmero con codicacin BCD desempaquetado
despus de la resta . . . . . . . . . . . . . . . . . . . . 63
5.12.3. Ajuste Nmero con codicacin BCD desempaquetado
despus de la multiplicacin . . . . . . . . . . . . . . . 65
3
5.12.4. Ajuste Nmero con codicacin BCD desempaquetado
despus de la divisin . . . . . . . . . . . . . . . . . . . 66
5.12.5. Ajuste Nmero con codicacin BCD empaquetado des-
pus de la Suma . . . . . . . . . . . . . . . . . . . . . . 67
5.13. Ajuste Nmero con codicacin BCD empaquetado despus
de la Resta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.14. Instrucciones Miscelneas . . . . . . . . . . . . . . . . . . . . 69
6. Subrutinas 70
6.1. Denicin de Segmentos . . . . . . . . . . . . . . . . . . . . . 70
6.2. Denicin de Procedimientos . . . . . . . . . . . . . . . . . . . 71
6.3. Denicin de Macros . . . . . . . . . . . . . . . . . . . . . . . 73
6.4. Caractersticas de los Procedimientos y Macros. . . . . . . . . 74
4
1. Introduccin
1.1. Introduccin al Lenguaje Mquina y Ensamblador
Se denomina lenguaje mquina a la serie de datos que la parte fsica de
la computadora o hardware, que es capaz de interpretar [1].
La parte fsica de una computadora solo distingue datos de tipo binario,
ceros y unos, que fsicamente son tensiones comprendidas entre 0 y 0, 4 voltios
y 4 y 5 voltios respectivamente.
La informacin que hace que el hardware de una computadora realice
una determinada actividad se llama instruccin. En consecuencia una ins-
truccin es un conjunto de ceros y unos, dichas instrucciones que son inter-
pretadas por las mquinas y representan acciones elementales se denominan
lenguaje mquina (LM).
El LM es el primer lenguaje de programacin de las primeras computado-
ras. Una instruccin en LM puede representarse de la siguiente manera:
011011001010010011110110
Es fcil interpretacin para una computadora, pero difcil interpretacin
para un ser humano. La anterior secuencia de dgitos binarios puede indicar
a la computadora que:
"Traslade el contenido de la posicin de memoria X a la posicin de
memoria Y".
Si lo vemos de esta forma, entendemos fcilmente ya que esta en nuestro
lenguaje natural (LN), pero la mquina ser incapaz de entender. Por lo
que se debe implementar un sistema de traduccin de una forma en que se
entienda tanto para LN como LM.
5
Con la prctica se podra utilizar la propia mquina para ayudar en la
traduccin de estos dos lenguajes. Es decir, dotar a la mquina de un progra-
ma elemental que tradujera un nmero determinado de caracteres alfabticos
en una secuencia de ceros y unos. Se podra escribir un programa constituido
por una secuencia de grupos de caracteres alfabticos en la que cada grupo
indicar una accin a realizar por el ordenador y una vez escrito el programa
sera la propia mquina la que traslada los grupos de caracteres a bits.
Esto trae consigo ventajas, ya que al ser humano le es ms fcil manipu-
lar grupos de caracteres y la traduccin se hara de forma automtica, por
ejemplo se podra escribir:
TRASLADAR 11010110,00011101
esto indica que la posicin 11010110 hay que pasarlo a la posicin 00011101
si se sabe que el grupo alfabtico TRASLADAR corresponde a la secuencia
de bits 11110101. La mquina traducira la anterior instruccin como:
11110101 11010110 00011101
al grupo alfabtico se le denomina mnemotcnico y existe un mnemo-
tcnico por cada instruccin. De esta forma nace el Lenguaje Ensamblador
(LE), con el tiempo, se comenzaron a complejizar las instrucciones permi-
tiendo adems emplear otros mnemotcnicos para indicar los operando por
ejemplo, la anterior instruccin se podra escribir de la siguiente forma:
TRASLADAR POS-A POS-B
El LE es conocido como un lenguaje de bajo nivel porque esta ligado al
hardware de una mquina determinada.
6
1.2. Sistemas Numricos
El sistema de numeracin que utilizamos comnmente se denomina deci-
mal, o de base 10, porque para formar cantidades utiliza 10 smbolos:
0, 1, 2, 3, 4, 5, 6, 7, 8 y 9
Ahora para usar el sistema numrico binario, un sistema de numeracin
que utilizara dos smbolos (0 y 1), tiene el problema de utilizar mucho mas
combinacin de smbolos que en cualquier otro sistemas de numeracin. La
operacion de contar seria:
1, 10, 11, 100, 101, 110, 111, 1000, ...
Ahora mostraremos una tabla con los cuatro sistemas numricos que se
usan en la programacin en LE.
7
Binario Octal Decimal Hexadecimal
0 0 0 0
1 1 1 1
10 2 2 2
11 3 3 3
100 4 4 4
101 5 5 5
110 6 6 6
111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 10 A
1011 13 11 B
1100 14 12 C
1101 15 13 D
1110 16 14 E
1111 17 15 F
En la tabla 1.2 muestra los sistemas numricos binario, octal, decimal y
hexademical.
1.3. Nmeros Negativos
Los nmeros negativos tienen una representacin particular, para los n-
mero binarios su representacin es aadiendo un digito de signo que es el
digito mas a la izquierda del nmero quedando su representacin de la si-
guiente manera:
8
Decimal positivo Binario positivo Decimal negativo Binario negativo
+0 0000 -0 1000
+1 0001 -1 1001
+2 0010 -2 1010
+3 0011 -3 1011
+4 0100 -4 1100
+5 0101 -5 1101
+6 0110 -6 1110
+7 0111 -7 1111
Ahora para los nmeros en hexadecimal su representacin es el mximo
numero de 32 bits en hexadecimal es FFFFFFFFh, por ende solo la mitad de
este numero se reserva para los numeros con signo positivo y la otra mitad se
reserva para los numeros negativos quedando su representacin como sigue a
continuacin:
Decimal Hexadecimal
+0 00000000
+1 00000001
+2 00000002
+3 00000003
+4 00000004
... ...
-1 FFFFFFFF
-2 FFFFFFFE
-3 FFFFFFFD
-4 FFFFFFFC
... ...
Observacin: Para saber si un entero hexadecimal es positivo o negativo,
inspeccionamos su dgito ms signicativo (ms alto). Si el dgito es 8, el
9
nmero es negativo; si el dgito es 7, el nmero es positivo. Por ejemplo,
el nmero hexadecimal 8A20 es negativo y el 7FD9 es positivo.
1.4. Cdigos Alfanumricos
Las mquinas tiene que tratar con caracteres alfabticos, de puntuacin
y de control; por eso ser necesario establecer unas correspondientes entre
conjuntos de ceros y unos, y dichos caracteres para permitir que estos puedan
ser entendidos por la mquina. De los existentes, el ms utilizado es el ASCII
(american standard code for information interchange).
bits 000 001 010 011 100 101 110 111
0000 NUL DLE SP 0 @ P p
0001 SOH DC1 ! 1 A Q a q
0010 STX DC2 " 2 B R b r
0011 ETX DC3 # 3 C S c s
0100 EOT DC4 $ 4 D T d t
0101 ENQ NAK % 5 E U e u
0110 ACK SYN & 6 F V f v
0111 BEL ETB 7 G W g w
1000 BS CAN ( 8 H X h x
1001 HT EM ) 9 I Y i y
1010 LF SUB * : J Z j z
1011 VT ESC + ; K [ k {
1100 FF FS , < L \ l |
1101 CR GS - = M ] m }
1110 SO RS . > N n
1111 SI US / ? O _ o DEL
En la tabla 1.4 muestra el codigo ASCII de 7 bits.
10
2. Arquitectura Bsica del 8086
De todos lo procesadores el 8086 tiene la ventaja de ser el primero en
manejar registros, antes lo que se manipulaba eran direcciones de memoria,
ademas posee otras caractersticas que se mencionarn a lo largo de este
captulo.
Ahora veremos un dibujo a modo de ilustracin del procesador 8086.
Figura 1: Arquitectura interna del procesador 8086
En la gura 1 se aprecia el procesador 8086 y que a diferencia de proce-
sadores elementales, posee dispositivos nuevos como son: registros generales
o de datos, registros punteros, registros ndice, registros de segmento, punte-
ro de instrucciones, entre otros. Todos estos nuevos componentes son tiles,
debido a que se quiere trabajar con datos de 16 bits.
11
2.1. Registro Generales o de Datos
Vamos a tener 4 registros de 16 bits cada uno, y cada uno con una utilidad
concreta:
AX (Registro acumulador), que va a continuar teniendo el protagonis-
mo de todos conocido en las operaciones aritmticas principalmente.
BX (Registro de base), se utiliza, como su nombre lo indica, para hacer
referencia a direcciones base de memoria a partir de las cuales se en-
cuentra situaciones vectores, matrices o tablas en general, y a las que
accederemos sumando a la base valores de desplazamiento.
CX (Registro contador), (no debe confundirse con el contador de pro-
grama), utilizado como tal en los bucles y en las operaciones de tipo
repetitivo.
DX (Registro de datos), se utiliza en algunos operaciones aritmticas,
como complemento de las acciones del acumulador, y en algunas ope-
raciones de entrada/salida, para especicar la direccin del dispositivo
utilizado.
Cada uno de estos registros se puede considerar como 2 registros inde-
pendientes de 8 bits. De este modo el registro AX se divide en AH(bytes ms
alto o ms signicativo de AX) y AL (byte ms bajo o menos signicativo
de AX) y anlogamente BH, BL, CH, CL, DH y DL.
2.2. Registro de Segmento
El microprocesador dispone de cuatro registros, denominados registros de
segmento, que van a servir de base para el clculo de la direccin absoluta
por medio de un desplazamiento:
12
CS (segmento de cdigo), es el que dene la zona de memoria donde se
encuentran las instrucciones a ejecutar o programa.
DS (segmento de datos), es la que dene la zona donde se encuentran
los datos que van a ser utilizados por el programa.
SS (segmento de stack o pila), dene la zona de memoria que se va a
utilizar como pila.
ES (segmento extra), contiene la direccin del segmento extra, que se
utiliza cuando se sobrepasa la capacidad de segmento de datos y para
realizar determinadas transferencias de datos entre segmentos.
2.3. Registros Puntero e ndices
Se clasican en 3 tipos de registros.
Registro de ndices, estan estrechamente relacionados con operaciones de
cadenas de datos.
SI (ndice de fuente u origen), proporciona la direccin inicial para que
una cadena sea manipulada, apuntada por DS.
DI (ndice de destino), proporciona la direccin de destino donde por
lo general una cadena ser almacenada despus de alguna operacin de
transferencia, apuntada por ES.
Registros apuntadores, estos registros reciben su nombre por su funcin
principal de apuntar a alguna direccin de memoria especca, en combina-
cin con el registro de segmento del stack SS.
SP (puntero de pila), apunta siempre a la posicin superior de la pila.
BP (puntero base), sirve para efectuar desplazamientos dentro de la
pila.
13
Registro apuntador de instrucciones
IP (apuntador de instrucciones), contiene la direccin de desplazamien-
to del lugar de memoria donde est la siguiente instruccin que ser
ejecutada por el microprocesador.
2.4. Registro de Estado
Esta formado por 16 bits de los caules 9 se utilizan para indicar diferentes
situaciones que se producen durante la ejecucin de un programa, los otros
7 bits restantes no se utilizan.
Se pueden agrupar en dos tipos:
Indicadores o banderas de condicin, que reejan los resultados de ope-
raciones del programa:
CF, bandera de acarreo, que se pone en 1 cuando una operacin arit-
mtica produce algn acarreo.
PF, bandera de paridad, se pone en 1 cuando el resultado es par.
AF, bandera auxiliar de acarreo, se pone en 1 si existe un acarreo entre
grupos de 4 bits.
ZF, bandera por cero, se pone en 1 cuando el resultado es cero.
SF, bandera de signo, se pone en 1 cuando el resultado es negativo.
OF, bandera sobre ujo o desbordamiento, se pone en 1 cuando hay
desbordamiento en una operacin aritmtica.
Los indicadores o banderas de control son:
14
DF, bandera de direccin, cuando est en 1 indica que las cadenas de
caracteres se van a procesar en el sentido de las posiciones de memoria
ms altas a las ms bajas decrementando los registros indices SI o DI;
mientras que cuando est en 0, las cadenas se procesarn en sentido
contrario, es decir, de las direcciones de memoria ms bajas a las ms
altas.
IF, bandera de interrupcin, cuando est en 1 indica que estn permi-
tidas las interrupciones enmascaradas, mientras que cuando est en 0
no estarn permitidas.
TF, bandera de paso simple, cuando est en 1 indica que el llamado
modo de intercepcin est activado, con lo que se genera una interrup-
cin despus de la ejecucin de cada instruccin con objeto de poder
visualizar los registros de trabajo y poder detectar los posibles errores.
15
3. Instrucciones Bsicas del Procesador 8086
3.1. Antes de Comenzar
Primero recordaremos algunas cosas vistas para programar en lenguaje
ensamblador:
Los nmeros y sus bases tienen una manera de representarse directa en
el lenguaje ensamblador, su sintaxis va de la mano en que cada cuenta de
nmero, al nal ira un caracter con la base a la que queremos transfomar,
estos caracteres son:
B, si son binarias.
O, si son octales.
D, o nada, si son decimales.
H, si son hexadecimales.
Y su forma de usarlo es como se aprecia en el siguiente ejemplo:
1010101B, en binario.
125O, en octal.
85D, o simplemente 85, en decimal.
55H, en hexadecimal.
Tambin se puede representar constantes alfanumricas encerradas entre
comillas simples como: ABCD, FIN H, etc
En el 8086 no trabajamos con direcciones de memoria, sino que trabaja-
mos con variables a las que el intrprete les asigna la posicin de memoria
correspondiente.
16
3.2. Instrucciones de Transferencia de Datos
La instruccin de transferencia de datos mas usada es:
MOV destino, fuente
Entendiendo por fuente el contenido que se va a transferir a una deter-
minada zona o registro de memoria denominada destino, ejemplo:
mov ax, 1
mov bx, 2
mov cx , 0
mov cx , ax
mov ax, bx
mov bx, cx
Una instruccin en la transferencia de datos cuyo resultado nal es similar
a la anterior pero que ahorra tiempo es:
XCHG dato01, dato02
que intercambia los contenidos de las posiciones de memoria o registros
representados por AX y BX. Un ejemplo de esta instruccin:
mov ax, 2
mov bx, 4
xchg ax, bx
17
3.3. Instrucciones Aritmticas
3.3.1. Suma
Para sumar, el 8086 dispone de dos instrucciones, la primera es la ins-
truccin es la suma sin acarreo y tiene la siguiente sintaxis:
ADD destino, fuente
Un ejemplo es el siguiente:
mov al , 15
mov bl , 30
add al , bl
Donde el resultado: La variable AL = 45 (decimal) o 2Dh (hexadecimal).
Ahora la segunda instruccin de la suma es conocida como suma con
acarreo la cual solo se aplica si el registro de estado CF = 1, si sintaxis es la
siguiente:
ADC destino, fuente
Un ejemplo sera:
mov al , 15
mov bl , 30
cmc
adc al , bl
Donde el resultado: La variable AL = 46 (decimal), si CF = 1 y 45
decimal, si CF = 0.
18
3.3.2. Resta
Para la resta tenemos dos tipos de instrucciones, la primera es concida
como resta sin acarreo y su sintaxis es:
SUB destino, fuente
Un ejemplo sera:
mov al , 30
mov bl , 25
sub al , bl
Dando como resultado: AL = 5 (decimal).
Ahora la segunda instruccin es conocida como resta con acarreo la cual
solo se aplica si el registro de estado CF = 1, si sintaxis es la siguiente:
SBB destino, fuente
Un ejemplo sera:
mov al , 30
mov bl , 25
cmc
sbb al , bl
El resultado nal es AL = 05 (decimal), si CF = 0 y AL = 04 (decimal),
si CF = 1.
19
3.3.3. Multiplicacin
En la multiplicacin tenemos dos tipos de instucciones, la primera es la
multiplicacin sin signo:
MUL fuente
donde fuente siempre multiplica a AX y el resultado lo almacena en AX.
Un ejemplo es:
mov al , 12
mov bl , 20
mul bl
La segunda instruccin de multiplicacin se conoce como la multiplicacin
con signo y su sintaxis es:
IMUL fuente
Donde fuente multiplica el nmero que es almacenado en DX-AX en lugar
de AX. Un ejemplo es:
mov ax, 2
mov bx, 4
mov cx , 10
imul bx
imul cx
20
3.3.4. Divisin
En la divisin tenemos dos instrucciones, la primera instruccin es cono-
cida como cociente sin signo y su sintaxis es:
DIV fuente
El cociente sin signo se deposita en AL y el resto en AH, si es una palabra
se depostia en AX y el resto en DX. Un ejemplo sera:
mov al , 15
mov bl , 5
div bl
La segunda instruccin es conocida como cociente con signo, su sintaxis
es:
IDIV fuente
Donde el resultado o cociente con signo se almacena en AL y el resto en
AH, si la operacin es de dos bytes, una palabra, el resultado o cociente se
almancena en AX y el resto en DX. Un ejemplo sera:
mov al , 15
mov bl , 5
i di v bl
3.4. Otras Instrucciones Aritmticas
Las instrucciones a continuacin son de tipo aritmtica que simplican
pasos y costos de cmputo:
21
La instruccin incrementar tiene sintaxis:
INC fuente
Incrementa un valor y este se almacena en el registro fuente.
La instruccin decrementar tiene sintaxis:
DEC fuente
Decrementa un valor y este se almacena en el registro fuente.
Por Ejemplo:
mov al , 10
mov bl , 10
inc al
dec bl
3.5. Instrucciones Lgicas
A continuacin mostraremos las instruciones lgicas:
La primera operacin lgica es AND y su sintaxis es la siguiente:
AND destino, fuente
Realiza la operacin AND lgico entre dos operandos, quedando el resul-
tado en el operando destino, un ejemplo sera:
mov ax, 01100001b
and ax, 11011111b
22
Donde cada digito es procesado por separado, es decir: 1 and 1 = 1, 0
and 1 = 0, 0 and 1 = 1, ... , 1 and 1 = 1 y 0 and 1 = 0.
La segunda operacin lgica es OR y su sintaxis es la siguiente:
OR destino, fuente
Realiza la operacin OR lgica entre dos operandos, quedando el resultado
en el destino, un ejemplo sera:
mov ax, 01100001b
or ax, 11011111b
Donde cada digito es procesado por separado, es decir: 1 or 1 = 1, 0 or 1
= 1, ... , 1 or 1 = 1 y 0 or 1 = 1.
La tercera operacin lgica es XOR y su sintaxis es la siguiente:
XOR destino, fuente
Realiza la operacin OR exclusivo lgico entre dos operandos, quedando
el resultado en el operando destino, un ejemplo sera:
MOVAX, 01100001b
XOR AX, 11011111b
La penltima operacin lgica es NOT y su sintaxis es la siguiente:
NOT operando
Realiza la operacin lgica NOT, la cual invierte cada bit del operando,
0 a 1 y viceversa. Un ejemplo sera:
MOVAX, 01100001b
NOTAX
23
El resultado nal es: 10011110b.
La ltima operacin lgica es NEG y su sintaxis es la siguiente:
NEG operando
Calcula la negacin de un valor mediante la siguiente ecuacin: 0
operando, un ejemplo sera:
MOVAX, 01100001b
NEGAX
El resultado nal es: 10011111b.
Observacin: NEG equivale un NOT y luego un INC, un ejemplo sera:
mov bx, 01100001b
not bx
inc bx
24
4. Pseudoinstrucciones
Las pseudoinstrucciones, tambin conocidas como Directivas del Lengua-
je Ensamblador, son informaciones que se dan al ordenador para hacer y
facilitar la traduccin del programa a LM. Estas se escriben junto al pro-
grama como si fuesen una instruccin ms, pero no son traducidas al cdigo
mquina porque carecen de cdigo equivalente.
4.1. Denicin de Variables
Las variables debern estar formadas por una combinacin de caracteres
alfabticos, numricos y especiales que no excedan los 255 caracteres, aunque
el LE slo reconoce 31 caracteres.
El tamao de variables es:
DB, 1 byte.
DW, 2 bytes o una palabra.
Para declarar una variable, sta tiene la siguiente sintaxis:
nombreV ariable DB/DW valor
donde nombreV ariable es el nombre que se da a la variable y valor es un
nmero de tipo DB o DW. Un ejemplo sera:
; v a r i a b l e s de t i po db y dw
MOV AL, dato01
MOVBX, dato02
RET
; decl aramos v a r i a b l e s
25
dato01 DB 255
dato02 DW 256
4.2. Denicin de Arreglos
Una propiedad caracterstica de LE es el manejo de arreglo. Para la de-
claracin de arreglos se usan las directivas: DB y DW, su sintaxis es como se
muestra a continuacin:
nombreArreglo DB/DW expresin
donde nombreArreglo es el nombre que le daremos a nuestro arreglo y
expresin son los valores que agregaremos a nuestro arreglo, unos ejemplos
son:
dato01 DB 1 , 2 , 3 , 4 , 5
dato02 DW 256 , 257 , 258 , 259 , 260
Si queremos crear un arreglo con valores duplicados se usa la expresin
DUP, su sintaxis es como se muestra a continuacin:
nombreArreglo DB/DW n DUP(valor(es))
donde nombreArreglo es el nombre que le daremos a nuestro arreglo, n
indica el tamao de nuestro arreglo y valor(es) indica que valores se dupli-
carn. Un ejemplo sera:
dato03 DB 5 DUP( 0)
dato04 DB 5 DUP( 1 , 2)
26
donde el nmero despus de DB, 5, es el tamao del arreglo, DUP(0)
indica que el valor duplicado a llenar es 0, DUP(1,2) indica que el valor
duplicado a llenar es 1,2,1,2,...
Ahora si no sabemos que valores queremos determinar se indica como no
inicializado y se usa el smbolo ?, un ejemplo sera:
dato05 DB 5 DUP( ?)
donde 5 DUP(?) signica: arreglo de nombre dato05 de tamao de 5
celdas y cuyos valores no estn inicializados (por defecto son valores nulos o
cero).
4.3. Denicin de Constantes
Otra pseudoinstruccin es EQU, el cual no podr cambiarse a lo largo de
la ejecucin del programa fuente (constante), un ejemplo es:
COLUMNAS EQU 80
en el segmento de datos de un programa nos permitir referirnos a 80 o
a COLUMNAS de forma indistinta a lo largo del programa.
4.4. Etiquetas
Una etiqueta es una marcador de posicin para las instrucciones y datos,
su ubicacin es antes de una secuencia de instrucciones donde queremos hacer
referencia en especco. Su sintaxis es como se muestra a continuacin:
ETI1:
...
donde ETI1 es el nombre de nuestra etiqueta y va acompaada siempre
del signo de dos puntos (:). Un ejemplo seria:
27
ETI1 :
MOVAX, 13
MOVBX, 14
28
5. Otras Instrucciones del procesador 8086
5.1. Instrucciones de Repeticin (Loop)
Instruccin til a la hora de implementar una secuencia iterativa, es decir
un loop, su sintaxis es la siguiente:
ETI1:
...
LOOP ETI1
Esta instruccin realiza las siguientes operaciones
1. Decrementa en una unidad el contador CX: CX CX 1.
2. Si CX > 0, bifurcar a la direccin IP: desplazamiento; si no, continuar
con la siguiente instruccin.
Un ejemplo sera:
MOVCX, 6
MOVAX, 0
MOVBX, 1
suma :
ADD AX, BX
INC BX
LOOP suma
Existen las instrucciones de salto condicional como son:
LOOPE (LOOP si igual) y LOOPZ (LOOP si cero), que al igual que
LOOP, decrementan CX en una unidad y se producir el salto si CX
= 0 y ZF = 1.
29
LOOPNE (LOOP si no igual) y LOOPNZ (LOOP si no cero) es opuesta
a las intrucciones mencionadas anteriormente, o sea, CX = 0 y ZF =
0.
5.2. Instruccin de Salto
En el 8086 existen dos tipos de saltos:
El salto incondicional cuya sintaxis se muestra a continuacin:
JMP etiqueta
Nos va a permitir transferir el control del programa a la direccin espe-
cca en la instruccin, una etiqueta, un ejemplo sera:
jmp de c l ar ar :
f unci on :
add ax, bx
ret
de c l ar ar :
mov ax, 10
mov bx, 12
jmp f unci on
El segundo tipo de salto es el salto condicional que como su nombre lo
dice se aplica bajo ciertas condiciones como se muestran en la siguiente tabla:
30
Instruccin Denicin Condicin
JA Saltar si est por encima CF = 0 y ZF = 0
JAE Saltar si est por encima o igual CF = 0
JB Saltar si est por abajo CF = 1
JBE Saltar si est por debajo o igual CF = 1 o ZF = 1
JC Saltar si hay acarreo CF = 1
JCXZ Saltar si CX es cero (CX) = 0
JE Saltar si es igual ZF = 1
JG Saltar si es mayor ZF = 0 y SF = OF
JGE Saltar si es mayor o igual SF = OF
JL Saltar si es menor SF = OF
JLE Saltar si es menor o igual ZF = SF <>OF
JNA Saltar si no est por encima CF = 1 o ZF = 1
JNAE Saltar si no est por encima ni igual CF = 1
JNB Saltar si no est por debajo CF = 0
JNBE Saltar si no est por debajo ni igual CF = 0 y ZF = 0
JNC Saltar si no hay acarreo CF = 0
JNE Saltar si no es igual ZF = 0
JNG(*) Saltar si no es mayor ZF = 1 o SF <>OF
JNGE(*) Saltar si no es mayor o igual SF = OF
JNL(*) Saltar si no es menor SF = OF
JNLE(*) Saltar si no es mayor o igual ZF = 0 y SF = OF
JNO(*) Saltar si no hay desbordamiento OF = 0
JNP Saltar si no hay paridad (impar) PF = 0
JNS(*) Saltar si no hay signo SF = 0
JNZ Saltar si no es cero ZF = 0
JO(*) Saltar si hay desbordamiento OF = 1
JP Saltar si hay paridad (par) PF = 1
JPE Saltar si hay paridad par PF = 1
JPO Saltar si hay paridad impar PF = 0
JS(*) Saltar si hay signo SF = 1
JZ Saltar si es cero ZF = 1
31
(*) Se usan para clculos aritmticos con signo.
5.3. Instrucciones de Subprogramas
Veremos instrucciones que llaman y retornan a un subprograma.
La instruccin que llama una rutina es:
CALL rutina
bifurca incondicionalmente a la direccin representada por la etiqueta
rutina.
La instruccin que permite retornar es:
RET
retorna al procedimiento, que previamente ha sido llamado por medio de
CALL.
Un ejemplo sera:
cal l i n i c i o
ret
mul t i pl i c ac i on :
mul bx
ret
suma :
add ax, cx
ret
i n i c i o :
32
mov ax, 10
mov bx, 2
mov cx , 11
cal l suma
cal l mul t i pl i c ac i on
5.4. Instrucciones del Registro de Estado
Son las ms sencillas y fciles de utilizar:
CLC pone 0 el bit CF o carry.
CMC cambia el bit CF, es decir, lo pone a 0 si estaba a 1 y o pone a 1
si estaba en 0.
STC pone a 1 el bit CF.
CLD pone a 0 el bit DF.
STD pone a 1 el bit DF.
STI pone a 1 el bit de interrupcion IF, con lo que quebran habilitadas
las interrupciones enmascaradas.
CLI pone a 0 el bit IF, quedando desactivadas las interrupciones en-
mascarables.
LAHF copia los bits CF, PF, AF, ZF y SF del registro de estado en
el registro AH, ocupando las mismas posiciones que ocupaban en el
registro de estado.
SAHF operacin inversa de LAHF.
33
5.5. Instrucciones de Comparacin
La instruccin CMP compara dos operando, y su sintaxis es:
CMP destino, fuente
donde el operando fuente es comparado con el operando destino. Esta
instruccin modica los registros de bandera de la siguiente manera:
Resultados CMP CF ZF SF OF PF AF DF
Destino <Fuente 1 0 1 0 1 1 0
Destino >Fuente 0 0 0 0 0 0 0
Destino = Fuente 0 1 0 0 1 0 0
Un ejemplo sera:
decl aramos :
MOVAX, num1
MOVBX, num2
comparamos :
CMP AX, BX
JA mayor
JB menor
mayor :
MOVAX, num1
JMP f i n
menor :
MOVAX, num2
JMP f i n
34
f i n :
RET
cons t ant es :
num1 EQU 0
num2 EQU 5
5.6. Instrucciones de Pila
Todo programa escrito en LE requiere de una pila, la pila se emplea para
almacenar temporalmente direcciones y datos. Hay un modo de direcciona-
miento que utiliza la pila mediante un registro base (BP) sobre porciones de
la pila.
Recordemos que para acceder a los elementos de la pila debemos utilizar
un registro de segmento SS y un desplazamiento sobre dicho segmento SP,
de forma que la direccin resultante:
SS:SP (o SS x 10H + SP)
Seala la posicin del ltimo elemento aadido a la pila.
La pila del 8086 funciona con palabras de 16 bits o 2 bytes y se desarrolla
hacia las direcciones de memoria decrecientes.
La instruccin que establece el tamao de una pila es STACK y su sintaxis
es:
STACK tamPila
Crea una pila de tamao tamPila. El registro SS apunta la pila, en cambio
el registro SP es el tamao de la pila.
35
Las intrucciones para el manejo de una pila son las siguientes:
Las intrucciones de manejo o transferencia de un pila a memoria es PUSH
y su sintexis es:
PUSH fuente
Donde fuente se almacenara en memoria, adems la instruccin PUSH de-
crementa el registro apuntador SP en dos, despus copia el valor especicado
a la localidad cuya direccin est dada por SS:SP.
Ahora la instruccin POP extrae un valor de la pila del programa y su
sintaxis es:
POP destino
Donde destino (excepto CS) es el lugar que se almacena el valor tope de
la pila. La instruccin POP extrae una palabra de la localidad cuya direccin
est dada por SS:SP, despus incrementa el valor del registro apuntador de
pila SP en dos.
Ahora un ejemplo de las intrucciones ilustradas anteriormente:
mov ax, 123
mov bx, 987
push ax
push bx
pop cx
pop dx
Ahora existen instrucciones de pila que nos permite almacenar valores de
los registros de banderas a la pila o extraer valores desde la pila a los registros
de banderas.
36
La instruccin que nos permite almacenar valores a la pila desde los re-
gistros de bandera es PUSHF y tiene la siguiente sintaxis:
PUSHF
La instruccin que nos permite extraer valores de la pila a los registros
de bandera es POPF y tiene la siguiente sintaxis:
POPF
Un ejemplo sera:
MOVAH, 11111111b
SAHF ; i nver s o de LAHF
PUSHF ; copi a v al or e s de l o s r e g i s t r o s de bandera a l a p i l a
MOVAH, 00000000b
SAHF
POPF ; copi a v al or e s de l a p i l a a l o s r e g i s t r o s de bandera
5.7. Instrucciones de Traslado de Datos
Existe una instruccin en particular que nos permite acceder a cualquier
posicin de un arreglo, sin tener que emplear los registros de ndice [2].
Esta instruccin es la XLATB y copia el valor de memoria de la siguiente
expresin:
DS:[BX+unsigned AL]
37
AL nos sirve para indicar a que elementro del arreglo queremos acceder
y una vez ejecutada la instruccin XLATB en el mismo registro se almacena
su valor, un ejemplo sera:
car gar :
LEA BX, ar r e gl o01
l eemos :
MOV AL, 2
XLATB
va r i a bl e s :
ar r e gl o01 DB 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
5.8. Instrucciones de Conversin
Ahora como en todo lenguaje de programacin existe instrucciones para
la conversin de byte a palabra y palabra a doble palabra.
Para convertir un byte en palabra tenemos la instruccin CBW cuya
sintexis es la siguiente:
CBW
Un ejemplor sera:
MOVAX, 0 ; AH = 0 , AL = 0
MOV AL, 5 ; AX = 000FBh (251)
CBW ; AX = 0FFFBh (5)
RET
38
Para convertir una palabra en doble palabra tenemos la instruccin CWD
cuya sintaxis es la siguiente:
CWD
Un ejemplo sera:
MOVDX, 0 ; DX = 0
MOVAX, 0 ; AX = 0
MOVAX, 2 ; DX AX = 00000h : 0FFFBh
CWD ; DX AX = 0FFFFh: 0FFFBh
5.9. Instrucciones de Transferencia de Direcciones
Existe un conjunto de instrucciones que nos permite la carga de memoria
[2], estos sean tanto para direccion efectiva de un dato, de un segmento de
dato y de un segmento de registro extra.
Existen tres tipos de instrucciones para el manejo de direcciones:
LEA es un instruccin que nos permite cargar en un registro la direccin
efectiva, su sintaxis:
LEA destino, fuente
Un ejemplo sera:
car gar :
l ea bx, pal abra
mov ax, [ bx]
f i n :
ret
39
va r i a bl e s :
pal abra dw 1234h
LDS es una instruccin que sirve para cargar una doble palabra, donde
se carga la primera palabra en el registro destino y la segunda palabra en el
registro DS, su sintaxis es:
LDS destino, fuente
Un ejemplo sera:
car gar :
l ds ax, pal abr as
f i n :
ret
va r a i bl e s :
pal abr as dw 1234h
dw 5678h
LES es una instruccin similar a LDS, con la excepcin que la segunda
palabra se carga en el registro ES, su sintaxis es:
LES destino, fuente
Un ejemplo sera:
car gar :
l es ax, pal abr as
40
f i n :
ret
va r i a bl e s :
pal abr as dw 1234h
dw 5678h
5.9.1. Manejo de Arreglos
Ahora el como acceder a un arreglo en LE es totalmente distinto que en
los lenguajes de alto nivel ( que no accede a control del hardware, Ejemplo
Java, C++, C#), en los LE el recorrido se hace mediante desplazamiento
usando la siguiente ecuacin:
Desplazamiento = tamDato indice (1)
donde indice es una de las posiciones del vector de tamao 1 y tamDato
es de tamao segn el tipo de dato de cada elemento del arreglo, es decir:
Tipo Tamao
db 1
dw 2
Ahora para almacenar datos en un arreglo de tipo DB, se indica a travs
del siguiente ejemplo:
i ni c i amos :
MOV DI, 0
MOVCX, 5
JMP l e e r
41
l e e r :
LEA BX, datos
JMP r e c o r r i do
r e c o r r i do :
MOV [BX+DI] , DI
INC DI
LOOP r e c o r r i do
f i n :
RET
va r i a bl e s :
datos DB 5 dup( 0)
donde usamos el registo DI para recorrer el arreglo, la forma de agregar
datos al arreglo es de la forma [BX+desplazamiento]. En el ejemplo anterior
sera de la forma:
MOV [BX+DI] , DI
Ahora veremos la lectura de un arreglo de tipo DB, se indica a travs del
siguiente ejemplo:
i ni c i amos :
MOV SI , 0
MOVCX, 5
JMP l e e r
42
l e e r :
LEA BX, datos
JMP r e c o r r i do
r e c o r r i do :
MOV AL, [BX+SI ]
INC SI
LOOP r e c o r r i do
va r i a bl e s :
datos DB 1 , 2 , 3 , 4 , 5
donde usamos el registo SI para recorrer el arreglo, la forma de agregar
datos al arreglo es de la forma [BX+desplazamiento].
MOV AL, [BX+SI ]
La formula para calcular el desplazamiento en arreglos de tipo DB, tanto
para el almacenado como para la lectura, esta dada por la siguiente ecuacion:
desplazamiento = DB indice (2)
donde DB es el tamao de dato cuyo valor es 1 e indice, registro de
puntero e ndice, de tamao 1, segun lo indicado en la ecuacion 1.
Ahora para el almacenamiento de datos en un arreglo de tipo DW tenemos
el siguiente ejemplo:
i ni c i amos :
MOV DI, 0
MOVCX, 5
JMP l e e r
43
l e e r :
LEA BX, datos
JMP r e c o r r i do
r e c o r r i do :
MOV [BX+DI] , DI
ADD DI, 2
LOOP r e c o r r i do
f i n :
RET
va r i a bl e s :
datos DW 5 dup( 0)
donde usamos el registo DI para recorrer el arreglo, la forma de agregar
datos al arreglo es de la forma [BX+desplazamiento].
MOV [BX+DI] , DI
Ahora para la lectura de datos de un arreglo de tipo DW tenemos el
siguiente ejemplo:
i ni c i amos :
MOV SI , 0
MOVCX, 5
JMP l e e r
l e e r :
44
LEA BX, datos
JMP r e c o r r i do
r e c o r r i do :
MOVAX, [BX+SI ]
ADD SI , 2
LOOP r e c o r r i do
va r i a bl e s :
datos DW 256 , 257 , 258 , 259 , 260
donde usamos el registo SI para recorrer el arreglo, la forma de agregar
datos al arreglo es de la forma [BX+desplazamiento].
MOVAX, [BX+SI ]
Como el arreglo es de tipo DW, tanto para el almacenado como para la
lectura, la ecuacin de desplazamiento esta dada por:
desplazamiento = DW indice (3)
donde DW es el tamao de dato cuyo valor es 2 e ndice, registro de
puntero e ndice, de tamao 1, segun lo indicado en la ecuacion 1.
5.9.2. Manejo de Caracter, Caracteres y String
Para declarar un caracter en LE 8086, se declaran directamente en un
registro como si fuesen un nmero, un ejemplo sera:
mov ah, a
mov al , b
45
Para declarar una serie de caracteres en LE 8086, estos se declaran igual
como si fuesen un arreglo, un ejemplo sera:
i ni c i amos :
MOVAX, 0
MOVBX, 0
LEA BX, c a r ac t e r e s
MOVCX, 0
MOVDX, 0
MOV SI , 0
JMP l eemos
l eemos :
MOVCH, [BX+SI ]
INC SI
MOV CL, [BX+SI ]
INC SI
MOVDH, [BX+SI ]
INC SI
MOV DL, [BX+SI ]
JMP f i n
f i n :
RET
decl aramos :
c a r ac t e r e s DB a , b , c , d
46
Para declarar un string es muy similar a un vector, pero con dos diferen-
cias:
Al declarar un string al inicio y trmino de este van entre comillas.
Antes del cierre de comillas se escribe el signo peso ($).
A continuacin se escribe en un string vacio el mensaje "Hola Mundo":
i n i c i a r :
MOVAX, 0
MOV SI , 0
MOV DL, $
JMP l e e r
l e e r :
MOV AL, H
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, o
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, l
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, a
MOV [ s t r i ng01+SI ] , AL
INC SI
47
MOV AL,
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, M
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, u
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, n
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, d
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL, o
MOV [ s t r i ng01+SI ] , AL
INC SI
MOV AL,
MOV [BX+SI ] , AL
INC SI
48
MOV AL, $
MOV [ s t r i ng01+SI ] , AL
INC SI
JMP f i n
f i n :
RET
de c l ar ar :
s t r i ng01 DB 12 dup( 0) ; " Hol a Mundo $ "
A continuacin se lee un string el mensaje de "Hola Mundo
2
se almacena
en el registro AL:
i n i c i a r :
MOVAX, 0
MOV SI , 0
MOVCX, 12
LEA BX, s t r i ng01
JMP l e e r
l e e r :
MOV AL, [BX+SI ]
INC SI
LOOP l e e r
s a l i r :
RET
49
de c l ar ar :
s t r i ng01 DB " HolaMundo$ "
5.10. Instrucciones de Tratamiento de Cadenas de Ca-
racteres
El procesador 8086 dispone un conjunto de instrucciones que van a faci-
litar el procesamiento de las cadenas de caracteres o strings [2] y [3].
5.10.1. Instrucciones de Repeticion
Primero debemos comentar que existe una instruccin de repeticin pa-
recida a la instruccin LOOP y sus derivados que son empleadas para el
manejo de arreglos, estas son:
REP repite la operacin a la que precede y, adems, hace CX CX
1 hasta que CX = 0.
REPE y REPZ repiten la operacion a la que preceden y la operacion
CX CX 1 mientras que CX > 0 y ZF = 1.
REPNE y REPNZ repiten la operacin a la que preceden y la operacin
CX CX 1 si CX > 0 y ZF = 0.
5.10.2. Instrucciones de Copiado
MOVSB, copia el byte de la direccin DS:SI sobre la posicin direccionada
por ES:DI e incrementa o decrementa en una unidad el contenido SI y DI
para que apunten al siguiente byte de la cadena.
Un ejemplo sera:
50
car gar :
LEA SI , vect or 01
LEA DI, vect or 02
copi amos :
MOVCX, 5
REP MOVSB
r e s ul t ados :
LEA BX, vect or 02
MOVCX, 5
l eemos :
MOV AL, [BX]
INC BX
LOOP l eemos
f i n :
RET
va r i a bl e s :
vect or 01 DB 1 , 2 , 3 , 4 , 5
vect or 02 DB 5 dup( 0)
MOVSW, copia la palabra de la direccin DS:SI sobre la posicin direc-
cionada por ES:DI e incrementa o decrementa en dos unidades el contenido
SI y DI para que apunten a los dos bytes siguientes de la cadena.
Un ejemplo sera:
51
cargamos :
LEA SI , pal abra01
LEA DI, pal abra02
MOVCX, 4
copi amos :
REPMOVSW
cargamos :
LEA BX, pal abra02
MOVCX, 4
l e e r :
MOVAX, [BX]
ADD BX, 2
LOOP l e e r
f i n :
RET
va r i a bl e s :
pal abra01 DW 256 , 257 , 258 , 259
pal abra02 DW 4 dup( 0)
5.10.3. Instrucciones de Comparacion entre Strings
CMPSB, compara el byte direccionado por DS:SI y ES:DI modicando
los bits del registro de estado segn el resultado de la operacin. Donde:
52
ZF = 1, son iguales.
ZF = 0, no son iguales.
Adems incrementa o decrementa en una unidad el contenido SI y DI.
Un ejemplo sera:
carga :
LEA SI , s t r i ng01
LEA DI, s t r i ng02
MOVCX, 11
compara :
REPE CMPSB
JZ i g ua l e s
JNZ noI gual es
i g ua l e s :
MOVAX, 1 ; verdadero
JMP f i n
noI gual es :
MOVAX, 0 ; f a l s o
JMP f i n
f i n :
RET
va r i a bl e s :
s t r i ng01 DB " s t r i ng 01$ "
53
s t r i ng02 DB " s t r i ng 02$ "
CMPSW, compara la palabra direccionada por DS:SI y ES:DI modican-
do los bits del registro de estado segn el resultado de la operacin. Donde:
ZF = 1, son iguales.
ZF = 0, no son iguales.
Adems incrementa o decrementa en dos bytes el contenido SI y DI. Un
ejemplo sera:
cargamos :
LEA SI , vect or 01
LEA DI, vect or 02
MOVCX, 4
comparamos :
REPECMPSW
JZ i gual
JNZ noI gual
i gual :
MOVAX, 1
JMP f i n
noI gual :
MOVAX, 0
JMP f i n
f i n :
54
RET
va r i a bl e s :
vect or 01 DW 300 , 301 , 302 , 303
vect or 02 DW 300 , 301 , 302 , 304
5.10.4. Instrucciones de Carga
LODSB, carga el byte de la direccin DS:SI en el registro AL, incremen-
tando o decrementando el registro ndice SI en un byte. Un ejemplo sera:
de c l ar ar :
LEA SI , s t r i ng01
MOVCX, 12
car gar :
REP LODSB
f i n :
RET
va r i a bl e s :
s t r i ng01 DB " HolaMundo$ "
LODSW, carga la palabra en la direccin DS:SI en el registro AX, incre-
mentando o decrementando el registro ndice SI en dos bytes. Un ejemplo
de c l ar ar :
l ea si , vect or 01
55
mov cx , 4
car gar :
rep lodsw
f i n :
ret
va r i a bl e s :
vect or 01 dw 600 , 700 , 800 , 900
5.10.5. Instrucciones de almacenado
STOSB, almacena el byte del registro AL en la direccin ES:DI, incre-
mentando o decrementando el registro ndice DI en un byte. Un ejemplo
sera:
i n i c i o :
MOV AL, a
LEA DI, vect or 01
MOVCX, 4
almacenamos :
REP STOSB
car gar :
MOV AL, 0
LEA BX, vect or 01
MOVCX, 1
56
l e e r :
MOV AL, [BX]
INC BX
LOOP l e e r
f i n :
RET
va r i a bl e s :
vect or 01 DB 4 dup( 0)
STOSW, almacena la palabra del registro AX en la direccin ES:DI, in-
crementando o decrementando el registro ndice DI en dos bytes. Un ejemplo
sera:
i n i c i o :
MOVAX, 256
LEA DI, vect or 01
MOVCX, 4
al macenar :
REP STOSW
car gar :
MOVAX, 0
LEA BX, vect or 01
MOVCX, 4
57
l e e r :
MOVAX, [BX]
LOOP l e e r
f i n :
RET
va r i a bl e s :
vect or 01 DW 4 dup( 0)
5.10.6. Instrucciones de Comparacin de un Elemento
SCASB, compara el byte del registro AL en la direccin ES:DI incremen-
tando o decrementando en un byte el registro ndice DI. Donde:
ZF = 1, son iguales.
ZF = 0, no son iguales.
Un ejemplo sera:
i n i c i o :
MOV AL, b
LEA DI, vect or 01
MOVCX, 7
comparar :
REPNE SCASB
JZ i gual
JNZ noi gual
58
noI gual :
MOVDX, 0
JMP f i n
i gual :
MOVDX, 1
JMP f i n
f i n :
RET
va r i a bl e s :
vect or 01 DB " abcde$ "
SCASW, compara la palabra del registro AX en la direccin ES:DI incre-
mentando o decrementando el registro ndice DI.
ZF = 1, son iguales.
ZF = 0, no son iguales.
Un ejemplo sera:
i n i c i o :
MOVAX, 300
LEA DI, vect or 01
MOVCX, 5
comparar :
59
REPNE SCASW
JZ i gual
JNZ noI gual
noI gual :
MOVDX, 0
JMP f i n
i gual :
MOVDX, 1
JMP f i n
f i n :
RET
va r i a bl e s :
vect or 01 DW 100 , 200 , 300 , 400 , 500
Como observacin podemos destacar que al explicar la direccin a seguir
de los registros de ndice est denida por la bandera DF.
5.11. Codicacin BCD
La codicacin BCD (binary code decimal) consiste en dado un nmero en
notacin decimal, cada dgito se codica a su simil en base binaria de cuatro
bits, es decir, si tenemos el nmero 125, en codicacin BCD corresponde
0001 0010 0101 [2] y [3].
Al usar cuatro bits podemos codicar 2
4
combinaciones. Donde los n-
meros tienen la siguiente tabla:
60
Decimal: 0 1 2 3 4 5 6 7 8 9
BCD: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
El objetivo de este tipo de codicacin es que la conversin de un nmero
en base decimal a base binario y manipulacin es menos costoso en com-
paracin si usaramos un nmero decimal completo y lo convirtieramos a su
similar en base binaria.
Existen dos tipos de nmeros de codicacin BCD:
Empaquetado es el cual en un byte caben dos dgitos, es decir cuatro
bits por dgito.
Desempaquetado donde cada dgito se representa por un byte, donde
los 4 bits superiores son ceros.
A continuacin tomamos el nmero en base decimal 2731 y lo expresamos
en su notacin BCD empaquetado y desempaquetado en el siguiente ejemplo:
Nmero Decimal: 2 7 3 1
BCD empaquetado: 0010 0111 0011 0001
BCD desempaquetado: 0000 0010 0000 0111 0000 0011 0000 0001
Observacin: en ensamblador 8086 un nmero en codicacin BCD tiene
la notacin desde 0 hasta 9, donde un nmero empaquetado tiene notacin
XX en cambio un nmero desempaquetado tiene notacin 0X o X, este
ltimo corresponde a un caracter.
Ensamblador posee instrucciones que nos permiten manipular nmeros
en codicacin BCD tanto empaquetado o desempaquetado.
61
5.12. Instrucciones BCD de Ajuste ASCII (desempa-
quetados) y de Ajuste Decimal (empaquetado)
En primer lugar se indicarn el uso y explicacin de instrucciones para el
manejo de numeros en codicacin BCD desempaquetados:
5.12.1. Ajuste Nmero con codicacin BCD desempaquetado
despus de la suma
La instruccin que nos permite un ajuste en numeros con condicacin
BCD desempaquetado despus de una suma es la instruccin AAA, un ejem-
plo sera:
.DATA
numero01 DB 9
numero02 DB 1
.CODE
decl aramos :
MOV AL, numero01
MOV BL, numero02
oper aci on :
ADD AL, BL
aj us t e :
AAA
f i n :
RET
62
El algoritmo interno de AAA es el siguiente:
Si AL >9 o AF = 1 entonces:
AL = AL + 6
AH = AH + 1
AF = 1
CF = 1
de lo contrario:
AF = 0
CF = 0
5.12.2. Ajuste Nmero con codicacin BCD desempaquetado
despus de la resta
La instruccin que nos permite un ajuste en numeros con condicacin
BCD desempaquetado despus de una resta es la instruccin AAS, un ejemplo
sera:
.DATA
numero01 DB 8
numero02 DB 9
.CODE
decl aramos :
MOV AL, numero01
MOV BL, numero02
63
oper aci on :
SUB AL, BL
aj us t e :
AAS
f i n :
RET
El algoritmo interno de AAS es el siguiente:
Si AL >9 o AF = 1 entonces:
AL = AL - 6
AH = AH - 1
AF = 1
CF = 1
de lo contrario:
AF = 0
CF = 0
Observacin: en el caso en que la resta entregue como resultado un nmero
negativo, el nibble bajo, AL, se resta 6 dgitos quedando el resultado despus
del ajuste en un rango entre 0 y 9 y el nibble alto, AH, se resta uno y se
activa la bandera de acarreo (CF).
64
5.12.3. Ajuste Nmero con codicacin BCD desempaquetado
despus de la multiplicacin
La instruccin que nos permite un ajuste en numeros con condicacin
BCD desempaquetado despus de una multiplicacin es la instruccin AAM,
un ejemplo sera:
decl aramos :
MOV AL, 07h
MOV BL, 08h
oper aci on :
MUL BL
aj us t e :
AAM
f i n :
HLT
Observacin: la multiplicacin solo se puede realizar en nmeros con la
siguiente notacin; si tenemos el nmero 5 decimal se escribe en codicacin
desempaquetado BCD: 05h = 0000 0101b.
El algoritmo interno de AAM es el siguiente:
AH = AL / 10
AL = resto
65
5.12.4. Ajuste Nmero con codicacin BCD desempaquetado
despus de la divisin
La instruccin que nos permite un ajuste en numeros con condicacin
BCD desempaquetado antes de una divisin es la instruccin AAD, un ejem-
plo sera:
decl aramosDi vi dendo :
MOVAX, 0307h
aj us t e :
AAD
decl ar amos Di vi s or :
MOV BL, 05h
oper aci on :
DIV BL
f i n :
HLT
Observacin: en la operacin inversa de la multiplicacin tiene que reali-
zarse antes de la divisin, esto para ajustar el dividendo.
El algoritmo interno de AAD es el siguiente:
AL = (AH * 10) + AL
AH = 0
A continuacin se indicarn instrucciones para el manejo de nmeros en
codicacin BCD empaquetados.
66
5.12.5. Ajuste Nmero con codicacin BCD empaquetado des-
pus de la Suma
La instruccin que nos permite un ajuste en numeros con condicacin
BCD empaquetado despus de la suma es la instruccin DAA, un ejemplo
sera:
decl aramos :
MOV AL, 35h
MOV BL, 48h
oper aci on :
ADD Al , BL
aj us t e :
DAA
f i n :
HLT
El algoritmo interno de DAA es el siguiente:
Si el nibble bajo de AL >9 o AF = 1 entonces:
AL = AL + 6
AF = 1
Si AL >9Fh o CF = 1 entonces:
AL = AL + 60h
CF = 1
67
5.13. Ajuste Nmero con codicacin BCD empaque-
tado despus de la Resta
La instruccin que nos permite un ajuste en Nmeros con condicacin
BCD empaquetado despus de la resta es la instruccin DAS, un ejemplo
sera:
decl aramos :
MOV AL, 85h
MOV BL, 48h
oper aci on :
SUB Al , BL
aj us t e :
DAS
f i n :
HLT
El algoritmo interno de DAS es el siguiente:
Si el nibble bajo de AL >9 o AF = 1 entonces:
AL = AL - 6
AF = 1
Si AL >9Fh o CF = 1 entonces:
AL = AL - 60h
CF = 1
68
5.14. Instrucciones Miscelneas
A continuacin se indicarn algunas instrucciones miscelaneas o que tiene
un uso especco y que estan clasicadas como las instrucciones ya descritas.
HLT, instruccin abreviada de halt (parada) esta instruccin tiene co-
mo objetivo parar la ejecucin de un programa si o si.
NOP, no hace nada, se utiliza para generar retrasos.
69
6. Subrutinas
Como en todo lenguaje de programacin se llega a un punto en que la
mantecin y actualizacin de cdigo se vuelve una tarea compleja, mas an si
es un cdigo extenso carente de formato que permita la facilidad de realizar
modicaciones sin caer en ms errores de los que se puede caer.
Por ende como en todo lenguaje de programacin, el lenguaje ensambla-
dor existen pseudoinstrucciones o directivas que permiten el desarrollo de
subrutinas para poder realizar una mantencin, actualizacin o eliminacin
de una parte del cdigo.
A continuacin explicaremos tres tipos de subrutinas que son: segmentos,
procedimientos y macros.
6.1. Denicin de Segmentos
Este tipo de pseudoinstruccin permite seccionar o segmentar cdigo.
Para segmentar tenemos tres pseudoinstrucciones:
.DATA: esta pseudoinstruccin contiene el rea de las variables.
.CODE: esta pseudoinstruccin contiene el rea de las instrucciones.
.STACK: esta pseudoinstruccin contiene el rea de la pila en tiempo
de ejecucin.
Observacin: pila en tiempo de ejecucin es un arreglo de memoria que
la CPU administra mediante los registros SS (zona de memoria que se va a
utilizar como pila) y SP (apunta a la parte superior de la pila).
Un ejemplo sera:
.DATA
numero01 DW 1
70
numero02 DW 2
.CODE
suma :
mov ax, @data
mov ds , ax
mov ax, numero01
add ax, numero02
jmp f i n
f i n :
RET
.STACK
Cabe mencionar que para poder operar las variables declaradas en el seg-
mento de datos, primero se tiene que leer la direccin de memoria y copiarse
al registro segmento de datos lo cual se realiza mediante las operaciones:
mov ax, @data
mov ds , ax
As podemos leer las variables y realizar cualquier operacin.
6.2. Denicin de Procedimientos
Un procedimiento es una parte del cdigo que puede ser llamado desde un
programa en orden para realizar alguna tarea especca. Los procedimientos
permiten que un programa sea mas estructural y fcil de comprender. Gene-
ralmente el procedimiento retorna al mismo punto desde donde fue llamado
71
[2]. Su sintaxis es:
nombre PROC
. . .
RET
nombre ENDP
donde:
nombre: es el nombre del procedimiento.
RET: sirva para retornar desde el procedimiento.
PROC y ENDP: son palabras reservadas que solo indican la direccin
del procedimiento en memoria.
Un ejemplo sera:
CALL procedi mi ento01
MOVAX, 1
RET
procedi mi ento02 PROC
MOVBX, 2
RET
procedi mi ento02 ENDP
En el ejemplo el procedimiento llamado procedimiento01 hace MOV AX, 1
y retorna a la siguiente instruccin despus de CALL, en este caso MOV BX, 2.
Cabe mencionar que para pasar parmetros a los procedimientos es a
travs de registros, un ejemplo sera:
72
MOV AL, 1
MOV BL, 2
CALL procedi mi ento02
CALL procedi mi ento02
CALL procedi mi ento02
CALL procedi mi ento02
RET
procedi mi ento02 PROC
MUL BL
RET
procedi mi ento02 ENDP
6.3. Denicin de Macros
Los macros son como procedimiento, pero no realmente. Los macros se
ven como procedimientos, pero ellos existen hasta que el cdigo es compilado,
despus de la compilacin todos los macros son remplazados con instrucciones
reales [2].
Su sintaxis es la siguiente:
nombre MACRO [ parametros ]
. . .
ENDM
donde:
nombre: es el nombre del macro.
73
MACRO y ENDM: son palabras reservadas que indican la direccin del
macro en memoria.
[parametros]: son valores o variables que se pasan a la macro.
Un ejemplo sera:
miMacro MACRO p1 , p2 , p3
MOVAX, p1
MOVBX, p2
MOVCX, p3
miMacro ENDM
miMacro 1 , 2 , 3
RET
6.4. Caractersticas de los Procedimientos y Macros.
A continuacin se presentan algunas diferencias entre un procedimiento
y un macro [2].
74
Procedimientos Macros
Cuando se quiere usar un procedi-
miento se debe usar la instruccin
CALL. Por ejemplo: CALL miPro-
cedimiento.
Cuando se quiere usar un macro, se
puede escribir su nombre. Por ejem-
plo: miMacro.
EL procedimiento es localizado en
alguna direccin especca en la me-
moria, y si se usa algn procedimien-
to 100 veces, la CPU transere el
control de esta parte de la memoria.
El control ser devuelto al programa
por la instruccion RET. La instruc-
cin CALL tarda unos 3 bytes, as el
tamao del archivo ejecutable de sa-
lida crece muy insignicativamente,
sin importar cuantas veces el proce-
dimineto es usado.
EL macro es expandido directamen-
te en el cdigo del programa. As si
se usa el mismo macro 100 veces, el
compilador expande el macro 100 ve-
ces, haciendo el archivo ejecutable
de salida cada vez mas largo, cada
vez que todas las instrucciones de un
macro son insertada.
Debe usar la pila o algn registro de
propsito general para pasar par-
metros al procedimiento.
Para pasar parametros a un macro,
puede solo escribirlos despus del
nombre del macro. Por ejemplo: mi-
Macro 1,2,3.
Para marcar el n de un procedi-
miento, se debe escribir el nombre
del procedimiento despus de la di-
rectiva ENDP.
Para marcar el n de un macro con
la directiva ENDM es suciente.
Un procedimiento se declara abajo
del codigo.
Un macro se declara arriba del codi-
go.
75
Si queremos reutilizar un procedimiento o un macro en otros cdigos, se
puede escribir procedimientos y macros en un archivo separado e invocar
como si fuesen una biblioteca.
Para poder invocar un procedimiento como biblioteca se tiene que hacer
una adaptacin de este ltimo, es decir, transformalo en un macro y el macro
llama al procedimiento, un ejemplo sera:
DEFINE_procedimiento01 macro
procedi mi ento01 PROC
MOVBX, 2
RET
procedi mi ento01 ENDP
DEFINE_procedimient01 ENDM
donde el macro DEFINE_procedimiento01 llama al procedimiento pro-
cedimiento01, este codigo se almancena en un archivo llamado misProcedi-
mientos.inc.
Ahora para invocarlos tenemos el siguiente codigo.
INCLUDE mi s Pr ocedi mi ent os . i nc
CALL procedi mi ento01
MOVAX, 1
RET
DEFINE_procedimiento01
donde:
INCLUDE: es pseudointruccin o directiva usada para incorporar el
76
archivo que posee los procedemientos o macros que queremos invocar.
misProcedimientos.inc: es el nombre del archivo externo que posee los
procedimientos que queremos invocar en varios cdigos.
Para poder invocar al procedimiento procedimiento01 se usa la palabra
reservada CALL y el nombre del procedimiento, pero antes se tiene que
declarar el macro donde esta contenido el procedimiento abajo del codigo
que tiene nombre DEFINE_procedimiento01.
Ahora para poder invocar macros como bibliotecas solo basta con declarar
el archivo donde estan contenidos nuestros macros e invocarlos con el nombre
de estos, un ejemplo seria:
miMacro MACRO p1 , p2 , p3
MOVAX, p1
MOVBX, p2
MOVCX, p3
miMacro ENDM
El cual ser almacenado en un archivo cuyo nombre es misMacros.inc.
Ahora para invocarlos tenemos el siguiente codigo:
INCLUDE mi sMacros. i nc
miMacro 1 , 2 , 3
RET
donde:
INCLUDE: es pseudointruccin o directiva usada para incorporar el
archivo que posee los procedemientos o macros que queremos invocar.
77
misMacros.inc: es el nombre del archivo externo que posee los macros
que queremos invocar en varios cdigos.
A diferencia de invocar los procedimientos, en los macros solo basta con
invocarlos con el nombre del macro e incluir el archivo externo donde estan
contenidos.
78
Referencias
[1] J. Fuster Cabaero and F. Prez Aliaga, Lenguajes Ensambladores, vol. 1.
McGraw-Hill, 1991.
[2] B. Allyn, Documentation for emu8086 - assembler and microprocessor
emulator., 2005.
[3] K. R. Irvine, Lenguaje ensamblador para computadoras basadas en intel
5ED. Pearson Educacin, 2008.
79

También podría gustarte