apuntes
Transcript of apuntes
Universidad Católica del MauleFacultad de Ciencias de la IngenieríaEscuela de Ingeniería Civil Informática
Apuntes de Lenguaje EnsambladorArquitectura de Computadores II
Sergio Antonio Baltierra Valenzuela
Talca, Semestre II, 2013
1
Índice
1. Introducción 51.1. Introducción al Lenguaje Máquina y Ensamblador . . . . . . . 51.2. Sistemas Numéricos . . . . . . . . . . . . . . . . . . . . . . . . 71.3. Números Negativos . . . . . . . . . . . . . . . . . . . . . . . . 81.4. Códigos Alfanuméricos . . . . . . . . . . . . . . . . . . . . . . 10
2. Arquitectura Básica del 8086 112.1. Registro Generales o de Datos . . . . . . . . . . . . . . . . . . 122.2. Registro de Segmento . . . . . . . . . . . . . . . . . . . . . . . 122.3. Registros Puntero e Índices . . . . . . . . . . . . . . . . . . . 132.4. Registro de Estado . . . . . . . . . . . . . . . . . . . . . . . . 14
3. Instrucciones Básicas del Procesador 8086 163.1. Antes de Comenzar . . . . . . . . . . . . . . . . . . . . . . . . 163.2. Instrucciones de Transferencia de Datos . . . . . . . . . . . . . 173.3. Instrucciones Aritméticas . . . . . . . . . . . . . . . . . . . . . 18
3.3.1. Suma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.3.2. Resta . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.3.3. Multiplicación . . . . . . . . . . . . . . . . . . . . . . . 203.3.4. División . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4. Otras Instrucciones Aritméticas . . . . . . . . . . . . . . . . . 213.5. Instrucciones Lógicas . . . . . . . . . . . . . . . . . . . . . . . 22
4. Pseudoinstrucciones 254.1. Definición de Variables . . . . . . . . . . . . . . . . . . . . . . 254.2. Definición de Arreglos . . . . . . . . . . . . . . . . . . . . . . 264.3. Definición de Constantes . . . . . . . . . . . . . . . . . . . . . 274.4. Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5. Otras Instrucciones del procesador 8086 295.1. Instrucciones de Repetición (Loop) . . . . . . . . . . . . . . . 295.2. Instrucción de Salto . . . . . . . . . . . . . . . . . . . . . . . . 305.3. Instrucciones de Subprogramas . . . . . . . . . . . . . . . . . 325.4. Instrucciones del Registro de Estado . . . . . . . . . . . . . . 335.5. Instrucciones de Comparación . . . . . . . . . . . . . . . . . . 345.6. Instrucciones de Pila . . . . . . . . . . . . . . . . . . . . . . . 355.7. Instrucciones de Traslado de Datos . . . . . . . . . . . . . . . 375.8. Instrucciones de Conversión . . . . . . . . . . . . . . . . . . . 385.9. Instrucciones de Transferencia de Direcciones . . . . . . . . . . 39
5.9.1. Manejo de Arreglos . . . . . . . . . . . . . . . . . . . . 415.9.2. Manejo de Caracter, Caracteres y String . . . . . . . . 45
5.10. Instrucciones de Tratamiento de Cadenas de Caracteres . . . . 505.10.1. Instrucciones de Repeticion . . . . . . . . . . . . . . . 505.10.2. Instrucciones de Copiado . . . . . . . . . . . . . . . . . 505.10.3. Instrucciones de Comparacion entre Strings . . . . . . 525.10.4. Instrucciones de Carga . . . . . . . . . . . . . . . . . . 555.10.5. Instrucciones de almacenado . . . . . . . . . . . . . . . 565.10.6. Instrucciones de Comparación de un Elemento . . . . . 58
5.11. Codificación BCD . . . . . . . . . . . . . . . . . . . . . . . . . 605.12. Instrucciones BCD de Ajuste ASCII (desempaquetados) y de
Ajuste Decimal (empaquetado) . . . . . . . . . . . . . . . . . 625.12.1. Ajuste Número con codificación BCD desempaquetado
después de la suma . . . . . . . . . . . . . . . . . . . . 625.12.2. Ajuste Número con codificación BCD desempaquetado
después de la resta . . . . . . . . . . . . . . . . . . . . 635.12.3. Ajuste Número con codificación BCD desempaquetado
después de la multiplicación . . . . . . . . . . . . . . . 65
3
5.12.4. Ajuste Número con codificación BCD desempaquetadodespués de la división . . . . . . . . . . . . . . . . . . . 66
5.12.5. Ajuste Número con codificación BCD empaquetado des-pués de la Suma . . . . . . . . . . . . . . . . . . . . . . 67
5.13. Ajuste Número con codificación BCD empaquetado despuésde la Resta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.14. Instrucciones Misceláneas . . . . . . . . . . . . . . . . . . . . 69
6. Subrutinas 706.1. Definición de Segmentos . . . . . . . . . . . . . . . . . . . . . 706.2. Definición de Procedimientos . . . . . . . . . . . . . . . . . . . 716.3. Definición de Macros . . . . . . . . . . . . . . . . . . . . . . . 736.4. Características de los Procedimientos y Macros. . . . . . . . . 74
4
1. Introducción
1.1. Introducción al Lenguaje Máquina y Ensamblador
Se denomina lenguaje máquina a la serie de datos que la parte física dela computadora o hardware, que es capaz de interpretar [1].
La parte física de una computadora solo distingue datos de tipo binario,ceros y unos, que físicamente son tensiones comprendidas entre 0 y 0, 4 voltiosy 4 y 5 voltios respectivamente.
La información que hace que el hardware de una computadora realiceuna determinada actividad se llama instrucción. En consecuencia una ins-trucción es un conjunto de ceros y unos, dichas instrucciones que son inter-pretadas por las máquinas y representan acciones elementales se denominanlenguaje máquina (LM).
El LM es el primer lenguaje de programación de las primeras computado-ras. Una instrucción en LM puede representarse de la siguiente manera:
011011001010010011110110
Es fácil interpretación para una computadora, pero difícil interpretaciónpara un ser humano. La anterior secuencia de dígitos binarios puede indicara la computadora que:
"Traslade el contenido de la posición de memoria X a la posición dememoria Y".
Si lo vemos de esta forma, entendemos fácilmente ya que esta en nuestrolenguaje natural (LN), pero la máquina será incapaz de entender. Por loque se debe implementar un sistema de traducción de una forma en que seentienda tanto para LN como LM.
5
Con la práctica se podría utilizar la propia máquina para ayudar en latraducción de estos dos lenguajes. Es decir, dotar a la máquina de un progra-ma elemental que tradujera un número determinado de caracteres alfabéticosen una secuencia de ceros y unos. Se podría escribir un programa constituidopor una secuencia de grupos de caracteres alfabéticos en la que cada grupoindicará una acción a realizar por el ordenador y una vez escrito el programasería la propia máquina la que traslada los grupos de caracteres a bits.
Esto trae consigo ventajas, ya que al ser humano le es más fácil manipu-lar grupos de caracteres y la traducción se haría de forma automática, porejemplo se podría escribir:
TRASLADAR 11010110,00011101
esto indica que la posición 11010110 hay que pasarlo a la posición 00011101si se sabe que el grupo alfabético TRASLADAR corresponde a la secuenciade bits 11110101. La máquina traduciría la anterior instrucción como:
11110101 11010110 00011101
al grupo alfabético se le denomina mnemotécnico y existe un mnemo-técnico por cada instrucción. De esta forma nace el Lenguaje Ensamblador(LE), con el tiempo, se comenzaron a complejizar las instrucciones permi-tiendo además emplear otros mnemotécnicos para indicar los operando porejemplo, la anterior instrucción se podría escribir de la siguiente forma:
TRASLADAR POS-A POS-B
El LE es conocido como un lenguaje de bajo nivel porque esta ligado alhardware de una máquina determinada.
6
1.2. Sistemas Numéricos
El sistema de numeración que utilizamos comúnmente se denomina deci-mal, o de base 10, porque para formar cantidades utiliza 10 símbolos:
0, 1, 2, 3, 4, 5, 6, 7, 8 y 9
Ahora para usar el sistema numérico binario, un sistema de numeraciónque utilizara dos símbolos (0 y 1), tiene el problema de utilizar mucho mascombinación de símbolos que en cualquier otro sistemas de numeración. Laoperacion de contar seria:
1, 10, 11, 100, 101, 110, 111, 1000, ...
Ahora mostraremos una tabla con los cuatro sistemas numéricos que seusan en la programación en LE.
7
Binario Octal Decimal Hexadecimal0 0 0 01 1 1 110 2 2 211 3 3 3100 4 4 4101 5 5 5110 6 6 6111 7 7 71000 10 8 81001 11 9 91010 12 10 A1011 13 11 B1100 14 12 C1101 15 13 D1110 16 14 E1111 17 15 F
En la tabla 1.2 muestra los sistemas numéricos binario, octal, decimal yhexademical.
1.3. Números Negativos
Los números negativos tienen una representación particular, para los nú-mero binarios su representación es añadiendo un digito de signo que es eldigito mas a la izquierda del número quedando su representación 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 números en hexadecimal su representación es el máximonumero de 32 bits en hexadecimal es FFFFFFFFh, por ende solo la mitad deeste numero se reserva para los numeros con signo positivo y la otra mitad sereserva para los numeros negativos quedando su representación como sigue acontinuación:
Decimal Hexadecimal+0 00000000+1 00000001+2 00000002+3 00000003+4 00000004... ...-1 FFFFFFFF-2 FFFFFFFE-3 FFFFFFFD-4 FFFFFFFC... ...
Observación: Para saber si un entero hexadecimal es positivo o negativo,inspeccionamos su dígito más significativo (más alto). Si el dígito es ≥ 8, el
9
número es negativo; si el dígito es ≤ 7, el número es positivo. Por ejemplo,el número hexadecimal 8A20 es negativo y el 7FD9 es positivo.
1.4. Códigos Alfanuméricos
Las máquinas tiene que tratar con caracteres alfabéticos, de puntuacióny de control; por eso será necesario establecer unas correspondientes entreconjuntos de ceros y unos, y dichos caracteres para permitir que estos puedanser entendidos por la máquina. De los existentes, el más utilizado es el ASCII(american standard code for information interchange).
bits 000 001 010 011 100 101 110 1110000 NUL DLE SP 0 @ P p0001 SOH DC1 ! 1 A Q a q0010 STX DC2 " 2 B R b r0011 ETX DC3 # 3 C S c s0100 EOT DC4 $ 4 D T d t0101 ENQ NAK % 5 E U e u0110 ACK SYN & 6 F V f v0111 BEL ETB ’ 7 G W g w1000 BS CAN ( 8 H X h x1001 HT EM ) 9 I Y i y1010 LF SUB * : J Z j z1011 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 Básica del 8086
De todos lo procesadores el 8086 tiene la ventaja de ser el primero enmanejar registros, antes lo que se manipulaba eran direcciones de memoria,ademas posee otras características que se mencionarán a lo largo de estecapítulo.
Ahora veremos un dibujo a modo de ilustración del procesador 8086.
Figura 1: Arquitectura interna del procesador 8086
En la figura 1 se aprecia el procesador 8086 y que a diferencia de proce-sadores elementales, posee dispositivos nuevos como son: registros generaleso 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 utilidadconcreta:
AX (Registro acumulador), que va a continuar teniendo el protagonis-mo de todos conocido en las operaciones aritméticas principalmente.
BX (Registro de base), se utiliza, como su nombre lo indica, para hacerreferencia a direcciones base de memoria a partir de las cuales se en-cuentra situaciones vectores, matrices o tablas en general, y a las queaccederemos 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 tiporepetitivo.
DX (Registro de datos), se utiliza en algunos operaciones aritméticas,como complemento de las acciones del acumulador, y en algunas ope-raciones de entrada/salida, para especificar la dirección del dispositivoutilizado.
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 másalto o más significativo de AX) y AL (byte más bajo o menos significativode AX) y análogamente BH, BL, CH, CL, DH y DL.
2.2. Registro de Segmento
El microprocesador dispone de cuatro registros, denominados registros desegmento, que van a servir de base para el cálculo de la dirección absolutapor medio de un desplazamiento:
12
CS (segmento de código), es el que define la zona de memoria donde seencuentran las instrucciones a ejecutar o programa.
DS (segmento de datos), es la que define la zona donde se encuentranlos datos que van a ser utilizados por el programa.
SS (segmento de stack o pila), define la zona de memoria que se va autilizar como pila.
ES (segmento extra), contiene la dirección del segmento extra, que seutiliza cuando se sobrepasa la capacidad de segmento de datos y pararealizar determinadas transferencias de datos entre segmentos.
2.3. Registros Puntero e Índices
Se clasifican 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 dirección inicial para queuna cadena sea manipulada, apuntada por DS.
DI (índice de destino), proporciona la dirección de destino donde porlo general una cadena será almacenada después de alguna operación detransferencia, apuntada por ES.
Registros apuntadores, estos registros reciben su nombre por su funciónprincipal de apuntar a alguna dirección de memoria específica, en combina-ción con el registro de segmento del stack SS.
SP (puntero de pila), apunta siempre a la posición superior de la pila.
BP (puntero base), sirve para efectuar desplazamientos dentro de lapila.
13
Registro apuntador de instrucciones
IP (apuntador de instrucciones), contiene la dirección de desplazamien-to del lugar de memoria donde está la siguiente instrucción que seráejecutada por el microprocesador.
2.4. Registro de Estado
Esta formado por 16 bits de los caules 9 se utilizan para indicar diferentessituaciones que se producen durante la ejecución de un programa, los otros7 bits restantes no se utilizan.
Se pueden agrupar en dos tipos:Indicadores o banderas de condición, que reflejan los resultados de ope-
raciones del programa:
CF, bandera de acarreo, que se pone en 1 cuando una operación arit-mética produce algún 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 entregrupos 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 flujo o desbordamiento, se pone en 1 cuando haydesbordamiento en una operación aritmética.
Los indicadores o banderas de control son:
14
DF, bandera de dirección, cuando está en 1 indica que las cadenas decaracteres se van a procesar en el sentido de las posiciones de memoriamás altas a las más bajas decrementando los registros indices SI o DI;mientras que cuando esté en 0, las cadenas se procesarán en sentidocontrario, es decir, de las direcciones de memoria más bajas a las másaltas.
IF, bandera de interrupción, cuando está en 1 indica que están permi-tidas las interrupciones enmascaradas, mientras que cuando está en 0no estarán permitidas.
TF, bandera de paso simple, cuando está en 1 indica que el llamadomodo de intercepción está activado, con lo que se genera una interrup-ción después de la ejecución de cada instrucción con objeto de podervisualizar los registros de trabajo y poder detectar los posibles errores.
15
3. Instrucciones Básicas del Procesador 8086
3.1. Antes de Comenzar
Primero recordaremos algunas cosas vistas para programar en lenguajeensamblador:
Los números y sus bases tienen una manera de representarse directa enel lenguaje ensamblador, su sintaxis va de la mano en que cada cuenta denúmero, al final 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.
También se puede representar constantes alfanuméricas encerradas entrecomillas 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 intérprete les asigna la posición de memoriacorrespondiente.
16
3.2. Instrucciones de Transferencia de Datos
La instrucción 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 , 1mov bx , 2mov cx , 0
mov cx , axmov ax , bxmov bx , cx
Una instrucción en la transferencia de datos cuyo resultado final es similara la anterior pero que ahorra tiempo es:
XCHG dato01, dato02
que intercambia los contenidos de las posiciones de memoria o registrosrepresentados por AX y BX. Un ejemplo de esta instrucción:
mov ax , 2mov bx , 4
xchg ax , bx
17
3.3. Instrucciones Aritméticas
3.3.1. Suma
Para sumar, el 8086 dispone de dos instrucciones, la primera es la ins-trucción es la suma sin acarreo y tiene la siguiente sintaxis:
ADD destino, fuente
Un ejemplo es el siguiente:
mov al , 15mov bl , 30
add al , bl
Donde el resultado: La variable AL = 45 (decimal) o 2Dh (hexadecimal).Ahora la segunda instrucción de la suma es conocida como suma con
acarreo la cual solo se aplica si el registro de estado CF = 1, si sintaxis es lasiguiente:
ADC destino, fuente
Un ejemplo sería:
mov al , 15mov bl , 30
cmcadc al , bl
Donde el resultado: La variable AL = 46 (decimal), si CF = 1 y 45decimal, si CF = 0.
18
3.3.2. Resta
Para la resta tenemos dos tipos de instrucciones, la primera es concidacomo resta sin acarreo y su sintaxis es:
SUB destino, fuente
Un ejemplo sería:
mov al , 30mov bl , 25
sub al , bl
Dando como resultado: AL = 5 (decimal).Ahora la segunda instrucción 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 sería:
mov al , 30mov bl , 25
cmcsbb al , bl
El resultado final es AL = 05 (decimal), si CF = 0 y AL = 04 (decimal),si CF = 1.
19
3.3.3. Multiplicación
En la multiplicación tenemos dos tipos de instucciones, la primera es lamultiplicación sin signo:
MUL fuente
donde fuente siempre multiplica a AX y el resultado lo almacena en AX.Un ejemplo es:
mov al , 12mov bl , 20
mul bl
La segunda instrucción de multiplicación se conoce como la multiplicacióncon signo y su sintaxis es:
IMUL fuente
Donde fuente multiplica el número que es almacenado en DX-AX en lugarde AX. Un ejemplo es:
mov ax , −2mov bx , 4mov cx , 10
imul bximul cx
20
3.3.4. División
En la división tenemos dos instrucciones, la primera instrucción 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 palabrase depostia en AX y el resto en DX. Un ejemplo sería:
mov al , 15mov bl , 5
div bl
La segunda instrucción es conocida como cociente con signo, su sintaxises:
IDIV fuente
Donde el resultado o cociente con signo se almacena en AL y el resto enAH, si la operación es de dos bytes, una palabra, el resultado o cociente sealmancena en AX y el resto en DX. Un ejemplo sería:
mov al , 15mov bl , −5
idiv bl
3.4. Otras Instrucciones Aritméticas
Las instrucciones a continuación son de tipo aritmética que simplificanpasos y costos de cómputo:
21
La instrucción incrementar tiene sintaxis:
INC fuente
Incrementa un valor y este se almacena en el registro fuente.La instrucción decrementar tiene sintaxis:
DEC fuente
Decrementa un valor y este se almacena en el registro fuente.Por Ejemplo:
mov al , 10mov bl , 10
inc aldec bl
3.5. Instrucciones Lógicas
A continuación mostraremos las instruciones lógicas:La primera operación lógica es AND y su sintaxis es la siguiente:
AND destino, fuente
Realiza la operación AND lógico entre dos operandos, quedando el resul-tado en el operando destino, un ejemplo sería:
mov ax , 01100001band ax , 11011111b
22
Donde cada digito es procesado por separado, es decir: 1 and 1 = 1, 0and 1 = 0, 0 and 1 = 1, ... , 1 and 1 = 1 y 0 and 1 = 0.
La segunda operación lógica es OR y su sintaxis es la siguiente:
OR destino, fuente
Realiza la operación OR lógica entre dos operandos, quedando el resultadoen el destino, un ejemplo sería:
mov ax , 01100001bor 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 operación lógica es XOR y su sintaxis es la siguiente:
XOR destino, fuente
Realiza la operación OR exclusivo lógico entre dos operandos, quedandoel resultado en el operando destino, un ejemplo sería:
MOVAX, 01100001bXOR AX, 11011111b
La penúltima operación lógica es NOT y su sintaxis es la siguiente:
NOT operando
Realiza la operación lógica NOT, la cual invierte cada bit del operando,0 a 1 y viceversa. Un ejemplo sería:
MOVAX, 01100001bNOTAX
23
El resultado final es: 10011110b.La última operación lógica es NEG y su sintaxis es la siguiente:
NEG operando
Calcula la negación de un valor mediante la siguiente ecuación: 0 −operando, un ejemplo sería:
MOVAX, 01100001bNEGAX
El resultado final es: 10011111b.Observación: NEG equivale un NOT y luego un INC, un ejemplo sería:
mov bx , 01100001bnot bxinc bx
24
4. Pseudoinstrucciones
Las pseudoinstrucciones, también conocidas como Directivas del Lengua-je Ensamblador, son informaciones que se dan al ordenador para hacer yfacilitar la traducción del programa a LM. Estas se escriben junto al pro-grama como si fuesen una instrucción más, pero no son traducidas al códigomáquina porque carecen de código equivalente.
4.1. Definición de Variables
Las variables deberán estar formadas por una combinación de caracteresalfabéticos, numéricos y especiales que no excedan los 255 caracteres, aunqueel LE sólo reconoce 31 caracteres.
El tamaño 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 unnúmero de tipo DB o DW. Un ejemplo sería:
; v a r i a b l e s de t i p o db y dwMOVAL, dato01MOVBX, dato02RET
; declaramos v a r i a b l e s
25
dato01 DB 255dato02 DW 256
4.2. Definición de Arreglos
Una propiedad característica de LE es el manejo de arreglo. Para la de-claración de arreglos se usan las directivas: DB y DW, su sintaxis es como semuestra a continuación:
nombreArreglo DB/DW expresión
donde nombreArreglo es el nombre que le daremos a nuestro arreglo yexpresión son los valores que agregaremos a nuestro arreglo, unos ejemplosson:
dato01 DB 1 ,2 ,3 ,4 ,5dato02 DW 256 ,257 ,258 ,259 ,260
Si queremos crear un arreglo con valores duplicados se usa la expresiónDUP, su sintaxis es como se muestra a continuación:
nombreArreglo DB/DW n DUP(valor(es))
donde nombreArreglo es el nombre que le daremos a nuestro arreglo, n
indica el tamaño de nuestro arreglo y valor(es) indica que valores se dupli-carán. Un ejemplo sería:
dato03 DB 5 DUP(0)dato04 DB 5 DUP(1 , 2 )
26
donde el número después de DB, 5, es el tamaño del arreglo, DUP(0)indica que el valor duplicado a llenar es 0, DUP(1,2) indica que el valorduplicado a llenar es 1,2,1,2,...
Ahora si no sabemos que valores queremos determinar se indica como noinicializado y se usa el símbolo ?, un ejemplo sería:
dato05 DB 5 DUP(? )
donde 5 DUP(?) significa: arreglo de nombre dato05 de tamaño de 5celdas y cuyos valores no están inicializados (por defecto son valores nulos ocero).
4.3. Definición de Constantes
Otra pseudoinstrucción es EQU, el cual no podrá cambiarse a lo largo dela ejecución del programa fuente (constante), un ejemplo es:
COLUMNAS EQU 80
en el segmento de datos de un programa nos permitirá referirnos a 80 oa COLUMNAS de forma indistinta a lo largo del programa.
4.4. Etiquetas
Una etiqueta es una marcador de posición para las instrucciones y datos,su ubicación es antes de una secuencia de instrucciones donde queremos hacerreferencia en específico. Su sintaxis es como se muestra a continuación:
ETI1:...
donde ETI1 es el nombre de nuestra etiqueta y va acompañada siempredel signo de dos puntos (:). Un ejemplo seria:
27
ETI1 :MOVAX, 13MOVBX, 14
28
5. Otras Instrucciones del procesador 8086
5.1. Instrucciones de Repetición (Loop)
Instrucción útil a la hora de implementar una secuencia iterativa, es decirun loop, su sintaxis es la siguiente:
ETI1:...
LOOP ETI1
Esta instrucción realiza las siguientes operaciones
1. Decrementa en una unidad el contador CX: CX ← CX − 1.
2. Si CX > 0, bifurcar a la dirección IP: desplazamiento; si no, continuarcon la siguiente instrucción.
Un ejemplo sería:
MOVCX, 6MOVAX, 0MOVBX, 1
suma :ADDAX, BXINC BXLOOP suma
Existen las instrucciones de salto condicional como son:
LOOPE (LOOP si igual) y LOOPZ (LOOP si cero), que al igual queLOOP, decrementan CX en una unidad y se producirá el salto si CX6= 0 y ZF = 1.
29
LOOPNE (LOOP si no igual) y LOOPNZ (LOOP si no cero) es opuestaa las intrucciones mencionadas anteriormente, o sea, CX 6= 0 y ZF =0.
5.2. Instrucción de Salto
En el 8086 existen dos tipos de saltos:El salto incondicional cuya sintaxis se muestra a continuación:
JMP etiqueta
Nos va a permitir transferir el control del programa a la dirección espe-cífica en la instrucción, una etiqueta, un ejemplo sería:
jmp de c l a r a r :
func ion :add ax , bxret
de c l a r a r :mov ax , 10mov bx , 12jmp func ion
El segundo tipo de salto es el salto condicional que como su nombre lodice se aplica bajo ciertas condiciones como se muestran en la siguiente tabla:
30
Instrucción Definición CondiciónJA Saltar si está por encima CF = 0 y ZF = 0JAE Saltar si está por encima o igual CF = 0JB Saltar si está por abajo CF = 1JBE Saltar si está por debajo o igual CF = 1 o ZF = 1JC Saltar si hay acarreo CF = 1
JCXZ Saltar si CX es cero (CX) = 0JE Saltar si es igual ZF = 1JG Saltar si es mayor ZF = 0 y SF = OFJGE Saltar si es mayor o igual SF = OFJL Saltar si es menor SF 6= OFJLE Saltar si es menor o igual ZF = SF <>OFJNA Saltar si no está por encima CF = 1 o ZF = 1JNAE Saltar si no está por encima ni igual CF = 1JNB Saltar si no está por debajo CF = 0JNBE Saltar si no está por debajo ni igual CF = 0 y ZF = 0JNC Saltar si no hay acarreo CF = 0JNE Saltar si no es igual ZF = 0
JNG(*) Saltar si no es mayor ZF = 1 o SF <>OFJNGE(*) Saltar si no es mayor o igual SF 6= OFJNL(*) Saltar si no es menor SF = OFJNLE(*) Saltar si no es mayor o igual ZF = 0 y SF = OFJNO(*) Saltar si no hay desbordamiento OF = 0JNP Saltar si no hay paridad (impar) PF = 0
JNS(*) Saltar si no hay signo SF = 0JNZ Saltar si no es cero ZF = 0JO(*) Saltar si hay desbordamiento OF = 1JP Saltar si hay paridad (par) PF = 1JPE Saltar si hay paridad par PF = 1JPO Saltar si hay paridad impar PF = 0JS(*) Saltar si hay signo SF = 1JZ Saltar si es cero ZF = 1
31
(*) Se usan para cálculos aritméticos con signo.
5.3. Instrucciones de Subprogramas
Veremos instrucciones que llaman y retornan a un subprograma.La instrucción que llama una rutina es:
CALL rutina
bifurca incondicionalmente a la dirección representada por la etiquetarutina.
La instrucción que permite retornar es:
RET
retorna al procedimiento, que previamente ha sido llamado por medio deCALL.
Un ejemplo sería:
ca l l i n i c i oret
mu l t i p l i c a c i o n :mul bxret
suma :add ax , cxret
i n i c i o :
32
mov ax , 10mov bx , 2mov cx , 11ca l l sumaca l l mu l t i p l i c a c i o n
5.4. Instrucciones del Registro de Estado
Son las más sencillas y fáciles 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 1si 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 habilitadaslas 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 enel registro AH, ocupando las mismas posiciones que ocupaban en elregistro de estado.
SAHF operación inversa de LAHF.
33
5.5. Instrucciones de Comparación
La instrucción CMP compara dos operando, y su sintaxis es:
CMP destino, fuente
donde el operando fuente es comparado con el operando destino. Estainstrucción modifica los registros de bandera de la siguiente manera:
Resultados CMP CF ZF SF OF PF AF DFDestino <Fuente 1 0 1 0 1 1 0Destino >Fuente 0 0 0 0 0 0 0Destino = Fuente 0 1 0 0 1 0 0
Un ejemplo sería:
declaramos :MOVAX, num1MOVBX, num2
comparamos :CMPAX, BXJA mayorJB menor
mayor :MOVAX, num1JMP f i n
menor :MOVAX, num2JMP f i n
34
f i n :RET
cons tante s :num1 EQU 0num2 EQU 5
5.6. Instrucciones de Pila
Todo programa escrito en LE requiere de una pila, la pila se emplea paraalmacenar temporalmente direcciones y datos. Hay un modo de direcciona-miento que utiliza la pila mediante un registro base (BP) sobre porciones dela pila.
Recordemos que para acceder a los elementos de la pila debemos utilizarun registro de segmento SS y un desplazamiento sobre dicho segmento SP,de forma que la dirección resultante:
SS:SP (o SS x 10H + SP)
Señala la posición del último elemento añadido 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 instrucción que establece el tamaño de una pila es STACK y su sintaxis
es:
STACK tamPila
Crea una pila de tamaño tamPila. El registro SS apunta la pila, en cambioel registro SP es el tamaño 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, además la instrucción PUSH de-crementa el registro apuntador SP en dos, después copia el valor especificadoa la localidad cuya dirección está dada por SS:SP.
Ahora la instrucción POP extrae un valor de la pila del programa y susintaxis es:
POP destino
Donde destino (excepto CS) es el lugar que se almacena el valor tope dela pila. La instrucción POP extrae una palabra de la localidad cuya direcciónestá dada por SS:SP, después incrementa el valor del registro apuntador depila SP en dos.
Ahora un ejemplo de las intrucciones ilustradas anteriormente:
mov ax , 123mov bx , 987
push axpush bx
pop cxpop dx
Ahora existen instrucciones de pila que nos permite almacenar valores delos registros de banderas a la pila o extraer valores desde la pila a los registrosde banderas.
36
La instrucción que nos permite almacenar valores a la pila desde los re-gistros de bandera es PUSHF y tiene la siguiente sintaxis:
PUSHF
La instrucción que nos permite extraer valores de la pila a los registrosde bandera es POPF y tiene la siguiente sintaxis:
POPF
Un ejemplo sería:
MOVAH, 11111111bSAHF ; i nve r so de LAHF
PUSHF ; copia v a l o r 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, 00000000bSAHF
POPF ; copia v a l o r 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 instrucción en particular que nos permite acceder a cualquierposición de un arreglo, sin tener que emplear los registros de índice [2].
Esta instrucción es la XLATB y copia el valor de memoria de la siguienteexpresión:
DS:[BX+unsigned AL]
37
AL nos sirve para indicar a que elementro del arreglo queremos accedery una vez ejecutada la instrucción XLATB en el mismo registro se almacenasu valor, un ejemplo sería:
cargar :LEA BX, a r r e g l o01
leemos :MOVAL, 2XLATB
va r i a b l e s :a r r e g l o01 DB 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
5.8. Instrucciones de Conversión
Ahora como en todo lenguaje de programación existe instrucciones parala conversión de byte a palabra y palabra a doble palabra.
Para convertir un byte en palabra tenemos la instrucción CBW cuyasintexis es la siguiente:
CBW
Un ejemplor sería:
MOVAX, 0 ; AH = 0 , AL = 0MOVAL, −5 ; AX = 000FBh (251)CBW ; AX = 0FFFBh (−5)RET
38
Para convertir una palabra en doble palabra tenemos la instrucción CWDcuya sintaxis es la siguiente:
CWD
Un ejemplo sería:
MOVDX, 0 ; DX = 0MOVAX, 0 ; AX = 0MOVAX, −2 ; DX AX = 00000h :0FFFBhCWD ; 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 dedato y de un segmento de registro extra.
Existen tres tipos de instrucciones para el manejo de direcciones:LEA es un instrucción que nos permite cargar en un registro la dirección
efectiva, su sintaxis:
LEA destino, fuente
Un ejemplo sería:
cargar :lea bx , pa labramov ax , [bx ]
f i n :ret
39
va r i a b l e s :pa labra dw 1234h
LDS es una instrucción que sirve para cargar una doble palabra, dondese carga la primera palabra en el registro destino y la segunda palabra en elregistro DS, su sintaxis es:
LDS destino, fuente
Un ejemplo sería:
cargar :lds ax , pa labras
f i n :ret
va r a i b l e s :pa labras dw 1234h
dw 5678h
LES es una instrucción similar a LDS, con la excepción que la segundapalabra se carga en el registro ES, su sintaxis es:
LES destino, fuente
Un ejemplo sería:
cargar :les ax , pa labras
40
f i n :ret
va r i a b l e s :pa labras dw 1234h
dw 5678h
5.9.1. Manejo de Arreglos
Ahora el como acceder a un arreglo en LE es totalmente distinto que enlos lenguajes de alto nivel ( que no accede a control del hardware, EjemploJava, C++, C#), en los LE el recorrido se hace mediante desplazamientousando la siguiente ecuación:
Desplazamiento = tamDato ∗ indice (1)
donde indice es una de las posiciones del vector de tamaño 1 y tamDato
es de tamaño según el tipo de dato de cada elemento del arreglo, es decir:
Tipo Tamañodb 1dw 2
Ahora para almacenar datos en un arreglo de tipo DB, se indica a travésdel siguiente ejemplo:
i n i c i amos :MOV DI , 0MOVCX, 5JMP l e e r
41
l e e r :LEA BX, datosJMP r e c o r r i d o
r e c o r r i d o :MOV [BX+DI ] , DIINC DILOOP r e c o r r i d o
f i n :RET
va r i a b l e s :datos DB 5 dup (0)
donde usamos el registo DI para recorrer el arreglo, la forma de agregardatos al arreglo es de la forma [BX+desplazamiento]. En el ejemplo anteriorsería de la forma:
MOV [BX+DI ] , DI
Ahora veremos la lectura de un arreglo de tipo DB, se indica a través delsiguiente ejemplo:
i n i c i amos :MOV SI , 0MOVCX, 5JMP l e e r
42
l e e r :LEA BX, datosJMP r e c o r r i d o
r e c o r r i d o :MOVAL, [BX+SI ]INC SILOOP r e c o r r i d o
v a r i a b l e s :datos DB 1 ,2 ,3 ,4 ,5
donde usamos el registo SI para recorrer el arreglo, la forma de agregardatos al arreglo es de la forma [BX+desplazamiento].
MOVAL, [BX+SI ]
La formula para calcular el desplazamiento en arreglos de tipo DB, tantopara el almacenado como para la lectura, esta dada por la siguiente ecuacion:
desplazamiento = DB ∗ indice (2)
donde DB es el tamaño de dato cuyo valor es 1 e indice, registro depuntero e índice, de tamaño 1, segun lo indicado en la ecuacion 1.
Ahora para el almacenamiento de datos en un arreglo de tipo DW tenemosel siguiente ejemplo:
i n i c i amos :MOV DI , 0MOVCX, 5JMP l e e r
43
l e e r :LEA BX, datosJMP r e c o r r i d o
r e c o r r i d o :MOV [BX+DI ] , DIADD DI , 2LOOP r e c o r r i d o
f i n :RET
va r i a b l e s :datos DW 5 dup (0)
donde usamos el registo DI para recorrer el arreglo, la forma de agregardatos 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 elsiguiente ejemplo:
i n i c i amos :MOV SI , 0MOVCX, 5JMP l e e r
l e e r :
44
LEA BX, datosJMP r e c o r r i d o
r e c o r r i d o :MOVAX, [BX+SI ]ADD SI , 2LOOP r e c o r r i d o
v a r i a b l e s :datos DW 256 ,257 ,258 ,259 ,260
donde usamos el registo SI para recorrer el arreglo, la forma de agregardatos al arreglo es de la forma [BX+desplazamiento].
MOVAX, [BX+SI ]
Como el arreglo es de tipo DW, tanto para el almacenado como para lalectura, la ecuación de desplazamiento esta dada por:
desplazamiento = DW ∗ indice (3)
donde DW es el tamaño de dato cuyo valor es 2 e índice, registro depuntero e índice, de tamaño 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 unregistro como si fuesen un número, un ejemplo sería:
mov ah , ’ a ’mov al , ’ b ’
45
Para declarar una serie de caracteres en LE 8086, estos se declaran igualcomo si fuesen un arreglo, un ejemplo sería:
i n i c i amos :MOVAX, 0MOVBX, 0LEA BX, c a r a c t e r e sMOVCX, 0MOVDX, 0MOV SI , 0JMP leemos
leemos :MOVCH, [BX+SI ]INC SIMOV CL, [BX+SI ]INC SIMOVDH, [BX+SI ]INC SIMOVDL, [BX+SI ]JMP f i n
f i n :RET
declaramos :c a r a c 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 término de este van entre comillas.
Antes del cierre de comillas se escribe el signo peso ($).
A continuación se escribe en un string vacio el mensaje "Hola Mundo":
i n i c i a r :MOVAX, 0MOV SI , 0MOVDL, ’ $ ’JMP l e e r
l e e r :MOVAL, ’H ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ o ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ l ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ a ’MOV [ s t r i n g01+SI ] , ALINC SI
47
MOVAL, ’ ␣ ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’M’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ u ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ n ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ d ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ o ’MOV [ s t r i n g01+SI ] , ALINC SI
MOVAL, ’ ␣ ’MOV [BX+SI ] , ALINC SI
48
MOVAL, ’ $ ’MOV [ s t r i n g01+SI ] , ALINC SI
JMP f i n
f i n :RET
de c l a r a r :s t r i n g01 DB 12 dup (0) ; " Hola Mundo $ "
A continuación se lee un string el mensaje de "Hola Mundo 2se almacenaen el registro AL:
i n i c i a r :MOVAX, 0MOV SI , 0MOVCX, 12LEA BX, s t r i n g01
JMP l e e r
l e e r :MOVAL, [BX+SI ]
INC SILOOP l e e r
s a l i r :RET
49
de c l a r a r :s t r i n g01 DB " Hola␣Mundo␣$ "
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 instrucción de repetición pa-recida a la instrucción LOOP y sus derivados que son empleadas para elmanejo de arreglos, estas son:
REP repite la operación a la que precede y, además, hace CX ← CX− 1 hasta que CX = 0.
REPE y REPZ repiten la operacion a la que preceden y la operacionCX ← CX − 1 mientras que CX > 0 y ZF = 1.
REPNE y REPNZ repiten la operación a la que preceden y la operaciónCX ← CX − 1 si CX > 0 y ZF = 0.
5.10.2. Instrucciones de Copiado
MOVSB, copia el byte de la dirección DS:SI sobre la posición direccionadapor ES:DI e incrementa o decrementa en una unidad el contenido SI y DIpara que apunten al siguiente byte de la cadena.
Un ejemplo sería:
50
cargar :LEA SI , vector01LEA DI , vector02
copiamos :MOVCX, 5REPMOVSB
r e s u l t ado s :LEA BX, vector02MOVCX, 5
leemos :MOVAL, [BX]INC BXLOOP leemos
f i n :RET
va r i a b l e s :vector01 DB 1 ,2 ,3 ,4 ,5vector02 DB 5 dup (0)
MOVSW, copia la palabra de la dirección DS:SI sobre la posición direc-cionada por ES:DI e incrementa o decrementa en dos unidades el contenidoSI y DI para que apunten a los dos bytes siguientes de la cadena.
Un ejemplo sería:
51
cargamos :LEA SI , pa labra01LEA DI , pa labra02MOVCX, 4
copiamos :REPMOVSW
cargamos :LEA BX, pa labra02MOVCX, 4
l e e r :MOVAX, [BX]ADD BX, 2LOOP l e e r
f i n :RET
va r i a b l e s :palabra01 DW 256 ,257 ,258 ,259palabra02 DW 4 dup (0)
5.10.3. Instrucciones de Comparacion entre Strings
CMPSB, compara el byte direccionado por DS:SI y ES:DI modificandolos bits del registro de estado según el resultado de la operación. Donde:
52
ZF = 1, son iguales.
ZF = 0, no son iguales.
Además incrementa o decrementa en una unidad el contenido SI y DI.Un ejemplo sería:
carga :LEA SI , s t r i n g01LEA DI , s t r i n g02MOVCX, 11
compara :REPE CMPSBJZ i g u a l e sJNZ noIgua l e s
i g u a l e s :MOVAX, 1 ; verdaderoJMP f i n
no Igua l e s :MOVAX, 0 ; f a l s oJMP f i n
f i n :RET
va r i a b l e s :s t r i n g01 DB " s t r i n g ␣01␣$ "
53
s t r i n g02 DB " s t r i n g ␣02␣$ "
CMPSW, compara la palabra direccionada por DS:SI y ES:DI modifican-do los bits del registro de estado según el resultado de la operación. Donde:
ZF = 1, son iguales.
ZF = 0, no son iguales.
Además incrementa o decrementa en dos bytes el contenido SI y DI. Unejemplo sería:
cargamos :LEA SI , vector01
LEA DI , vector02MOVCX, 4
comparamos :REPECMPSWJZ i g u a lJNZ noIgua l
i g u a l :MOVAX, 1JMP f i n
noIgua l :MOVAX, 0JMP f i n
f i n :
54
RET
va r i a b l e s :vector01 DW 300 ,301 ,302 ,303vector02 DW 300 ,301 ,302 ,304
5.10.4. Instrucciones de Carga
LODSB, carga el byte de la dirección DS:SI en el registro AL, incremen-tando o decrementando el registro índice SI en un byte. Un ejemplo sería:
d e c l a r a r :LEA SI , s t r i n g01MOVCX, 12
cargar :REP LODSB
f i n :RET
va r i a b l e s :s t r i n g01 DB " Hola␣Mundo␣$ "
LODSW, carga la palabra en la dirección DS:SI en el registro AX, incre-mentando o decrementando el registro índice SI en dos bytes. Un ejemplo
d e c l a r a r :lea si , vector01
55
mov cx , 4
cargar :rep lodsw
f i n :ret
va r i a b l e s :vector01 dw 600 , 700 , 800 , 900
5.10.5. Instrucciones de almacenado
STOSB, almacena el byte del registro AL en la dirección ES:DI, incre-mentando o decrementando el registro índice DI en un byte. Un ejemplosería:
i n i c i o :MOVAL, ’ a ’LEA DI , vector01MOVCX, 4
almacenamos :REP STOSB
cargar :MOVAL, 0LEA BX, vector01MOVCX, 1
56
l e e r :MOVAL, [BX]INC BXLOOP l e e r
f i n :RET
va r i a b l e s :vector01 DB 4 dup (0)
STOSW, almacena la palabra del registro AX en la dirección ES:DI, in-crementando o decrementando el registro índice DI en dos bytes. Un ejemplosería:
i n i c i o :MOVAX, 256LEA DI , vector01MOVCX, 4
almacenar :REP STOSW
cargar :MOVAX, 0LEA BX, vector01MOVCX, 4
57
l e e r :MOVAX, [BX]LOOP l e e r
f i n :RET
va r i a b l e s :vector01 DW 4 dup (0)
5.10.6. Instrucciones de Comparación de un Elemento
SCASB, compara el byte del registro AL en la dirección 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 sería:
i n i c i o :MOVAL, ’ b ’LEA DI , vector01MOVCX, 7
comparar :REPNE SCASBJZ i g u a lJNZ no igua l
58
noIgua l :MOVDX, 0JMP f i n
i g ua l :MOVDX, 1JMP f i n
f i n :RET
va r i a b l e s :vector01 DB " abcde␣$ "
SCASW, compara la palabra del registro AX en la dirección ES:DI incre-mentando o decrementando el registro índice DI.
ZF = 1, son iguales.
ZF = 0, no son iguales.
Un ejemplo sería:
i n i c i o :MOVAX, 300LEA DI , vector01MOVCX, 5
comparar :
59
REPNE SCASWJZ i g u a lJNZ noIgua l
noIgua l :MOVDX, 0JMP f i n
i g ua l :MOVDX, 1JMP f i n
f i n :RET
va r i a b l e s :vector01 DW 100 ,200 ,300 ,400 ,500
Como observación podemos destacar que al explicar la dirección a seguirde los registros de índice está definida por la bandera DF.
5.11. Codificación BCD
La codificación BCD (binary code decimal) consiste en dado un número ennotación decimal, cada dígito se codifica a su simil en base binaria de cuatrobits, es decir, si tenemos el número 125, en codificación BCD corresponde0001 0010 0101 [2] y [3].
Al usar cuatro bits podemos codificar 24 combinaciones. Donde los nú-meros tienen la siguiente tabla:
60
Decimal: 0 1 2 3 4 5 6 7 8 9BCD: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
El objetivo de este tipo de codificación es que la conversión de un númeroen base decimal a base binario y manipulación es menos costoso en com-paración si usaramos un número decimal completo y lo convirtieramos a susimilar en base binaria.
Existen dos tipos de números de codificación BCD:
Empaquetado es el cual en un byte caben dos dígitos, es decir cuatrobits por dígito.
Desempaquetado donde cada dígito se representa por un byte, dondelos 4 bits superiores son ceros.
A continuación tomamos el número en base decimal 2731 y lo expresamosen su notación BCD empaquetado y desempaquetado en el siguiente ejemplo:
Número Decimal: 2 7 3 1BCD empaquetado: 0010 0111 0011 0001BCD desempaquetado: 0000 0010 0000 0111 0000 0011 0000 0001
Observación: en ensamblador 8086 un número en codificación BCD tienela notación desde 0 hasta 9, donde un número empaquetado tiene notaciónXX en cambio un número desempaquetado tiene notación 0X o ’X’, esteúltimo corresponde a un caracter.
Ensamblador posee instrucciones que nos permiten manipular númerosen codificación BCD tanto empaquetado o desempaquetado.
61
5.12. Instrucciones BCD de Ajuste ASCII (desempa-quetados) y de Ajuste Decimal (empaquetado)
En primer lugar se indicarán el uso y explicación de instrucciones para elmanejo de numeros en codificación BCD desempaquetados:
5.12.1. Ajuste Número con codificación BCD desempaquetadodespués de la suma
La instrucción que nos permite un ajuste en numeros con condificaciónBCD desempaquetado después de una suma es la instrucción AAA, un ejem-plo sería:
.DATAnumero01 DB ’ 9 ’numero02 DB ’ 1 ’
.CODEdeclaramos :
MOVAL, numero01MOV BL, numero02
operac ion :ADD AL, BL
a j u s 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 Número con codificación BCD desempaquetadodespués de la resta
La instrucción que nos permite un ajuste en numeros con condificaciónBCD desempaquetado después de una resta es la instrucción AAS, un ejemplosería:
.DATAnumero01 DB ’ 8 ’numero02 DB ’ 9 ’
.CODEdeclaramos :
MOVAL, numero01MOV BL, numero02
63
operac ion :SUB AL, BL
a j u s 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
Observación: en el caso en que la resta entregue como resultado un númeronegativo, el nibble bajo, AL, se resta 6 dígitos quedando el resultado despuésdel ajuste en un rango entre 0 y 9 y el nibble alto, AH, se resta uno y seactiva la bandera de acarreo (CF).
64
5.12.3. Ajuste Número con codificación BCD desempaquetadodespués de la multiplicación
La instrucción que nos permite un ajuste en numeros con condificaciónBCD desempaquetado después de una multiplicación es la instrucción AAM,un ejemplo sería:
declaramos :MOVAL, 07hMOV BL, 08h
operac ion :MUL BL
a j u s t e :AAM
f i n :HLT
Observación: la multiplicación solo se puede realizar en números con lasiguiente notación; si tenemos el número 5 decimal se escribe en codificacióndesempaquetado BCD: 05h = 0000 0101b.
El algoritmo interno de AAM es el siguiente:
AH = AL / 10
AL = resto
65
5.12.4. Ajuste Número con codificación BCD desempaquetadodespués de la división
La instrucción que nos permite un ajuste en numeros con condificaciónBCD desempaquetado antes de una división es la instrucción AAD, un ejem-plo sería:
declaramosDividendo :MOVAX, 0307h
a j u s t e :AAD
dec la ramosDiv i sor :MOV BL, 05h
operac ion :DIV BL
f i n :HLT
Observación: en la operación inversa de la multiplicación tiene que reali-zarse antes de la división, esto para ajustar el dividendo.
El algoritmo interno de AAD es el siguiente:
AL = (AH * 10) + AL
AH = 0
A continuación se indicarán instrucciones para el manejo de números encodificación BCD empaquetados.
66
5.12.5. Ajuste Número con codificación BCD empaquetado des-pués de la Suma
La instrucción que nos permite un ajuste en numeros con condificaciónBCD empaquetado después de la suma es la instrucción DAA, un ejemplosería:
declaramos :MOVAL, 35hMOV BL, 48h
operac ion :ADD Al , BL
a j u s 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 Número con codificación BCD empaque-tado después de la Resta
La instrucción que nos permite un ajuste en Números con condificaciónBCD empaquetado después de la resta es la instrucción DAS, un ejemplosería:
declaramos :MOVAL, 85hMOV BL, 48h
operac ion :SUB Al , BL
a j u s 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 Misceláneas
A continuación se indicarán algunas instrucciones miscelaneas o que tieneun uso específico y que estan clasificadas como las instrucciones ya descritas.
HLT, instrucción abreviada de halt (parada) esta instrucción tiene co-mo objetivo parar la ejecución de un programa si o si.
NOP, no hace nada, se utiliza para generar retrasos.
69
6. Subrutinas
Como en todo lenguaje de programación se llega a un punto en que lamanteción y actualización de código se vuelve una tarea compleja, mas aún sies un código extenso carente de formato que permita la facilidad de realizarmodificaciones sin caer en más errores de los que se puede caer.
Por ende como en todo lenguaje de programación, el lenguaje ensambla-dor existen pseudoinstrucciones o directivas que permiten el desarrollo desubrutinas para poder realizar una mantención, actualización o eliminaciónde una parte del código.
A continuación explicaremos tres tipos de subrutinas que son: segmentos,procedimientos y macros.
6.1. Definición de Segmentos
Este tipo de pseudoinstrucción permite seccionar o segmentar código.Para segmentar tenemos tres pseudoinstrucciones:
.DATA: esta pseudoinstrucción contiene el área de las variables.
.CODE: esta pseudoinstrucción contiene el área de las instrucciones.
.STACK: esta pseudoinstrucción contiene el área de la pila en tiempode ejecución.
Observación: pila en tiempo de ejecución es un arreglo de memoria quela CPU administra mediante los registros SS (zona de memoria que se va autilizar como pila) y SP (apunta a la parte superior de la pila).
Un ejemplo sería:
.DATAnumero01 DW 1
70
numero02 DW 2
.CODEsuma :
mov ax , @datamov ds , axmov ax , numero01add ax , numero02jmp 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 dirección de memoria y copiarseal registro segmento de datos lo cual se realiza mediante las operaciones:
mov ax , @datamov ds , ax
Así podemos leer las variables y realizar cualquier operación.
6.2. Definición de Procedimientos
Un procedimiento es una parte del código que puede ser llamado desde unprograma en orden para realizar alguna tarea específica. Los procedimientospermiten que un programa sea mas estructural y fácil 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 direccióndel procedimiento en memoria.
Un ejemplo sería:
CALL procedimiento01MOVAX, 1RET
procedimiento02 PROCMOVBX, 2RET
procedimiento02 ENDP
En el ejemplo el procedimiento llamado procedimiento01 hace MOV AX, 1y retorna a la siguiente instrucción después de CALL, en este caso MOV BX, 2.
Cabe mencionar que para pasar parámetros a los procedimientos es através de registros, un ejemplo sería:
72
MOVAL, 1MOV BL, 2
CALL procedimiento02CALL procedimiento02CALL procedimiento02CALL procedimiento02RET
procedimiento02 PROCMUL BLRET
procedimiento02 ENDP
6.3. Definición de Macros
Los macros son como procedimiento, pero no realmente. Los macros seven como procedimientos, pero ellos existen hasta que el código es compilado,después de la compilación todos los macros son remplazados con instruccionesreales [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 dirección delmacro en memoria.
[parametros]: son valores o variables que se pasan a la macro.
Un ejemplo sería:
miMacro MACRO p1 , p2 , p3MOVAX, p1MOVBX, p2MOVCX, p3
miMacro ENDM
miMacro 1 ,2 ,3
RET
6.4. Características de los Procedimientos y Macros.
A continuación se presentan algunas diferencias entre un procedimientoy un macro [2].
74
Procedimientos MacrosCuando se quiere usar un procedi-miento se debe usar la instrucciónCALL. Por ejemplo: CALL miPro-cedimiento.
Cuando se quiere usar un macro, sepuede escribir su nombre. Por ejem-plo: miMacro.
EL procedimiento es localizado enalguna dirección específica en la me-moria, y si se usa algún procedimien-to 100 veces, la CPU transfiere elcontrol de esta parte de la memoria.El control será devuelto al programapor la instruccion RET. La instruc-ción CALL tarda unos 3 bytes, así eltamaño del archivo ejecutable de sa-lida crece muy insignificativamente,sin importar cuantas veces el proce-dimineto es usado.
EL macro es expandido directamen-te en el código del programa. Así sise usa el mismo macro 100 veces, elcompilador expande el macro 100 ve-ces, haciendo el archivo ejecutablede salida cada vez mas largo, cadavez que todas las instrucciones de unmacro son insertada.
Debe usar la pila o algún registro depropósito general para pasar pará-metros al procedimiento.
Para pasar parametros a un macro,puede solo escribirlos después delnombre del macro. Por ejemplo: mi-Macro 1,2,3.
Para marcar el fin de un procedi-miento, se debe escribir el nombredel procedimiento después de la di-rectiva ENDP.
Para marcar el fin de un macro conla directiva ENDM es suficiente.
Un procedimiento se declara abajodel codigo.
Un macro se declara arriba del codi-go.
75
Si queremos reutilizar un procedimiento o un macro en otros códigos, sepuede escribir procedimientos y macros en un archivo separado e invocarcomo si fuesen una biblioteca.
Para poder invocar un procedimiento como biblioteca se tiene que haceruna adaptación de este último, es decir, transformalo en un macro y el macrollama al procedimiento, un ejemplo sería:
DEFINE_procedimiento01 macroprocedimiento01 PROC
MOVBX, 2RET
procedimiento01 ENDPDEFINE_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 misProced imientos . inc
CALL procedimiento01MOVAX, 1RET
DEFINE_procedimiento01
donde:
INCLUDE: es pseudointrucción 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 losprocedimientos que queremos invocar en varios códigos.
Para poder invocar al procedimiento procedimiento01 se usa la palabrareservada CALL y el nombre del procedimiento, pero antes se tiene quedeclarar el macro donde esta contenido el procedimiento abajo del codigoque tiene nombre DEFINE_procedimiento01.
Ahora para poder invocar macros como bibliotecas solo basta con declararel archivo donde estan contenidos nuestros macros e invocarlos con el nombrede estos, un ejemplo seria:
miMacro MACRO p1 , p2 , p3MOVAX, p1MOVBX, p2MOVCX, p3
miMacro ENDM
El cual será almacenado en un archivo cuyo nombre es misMacros.inc.Ahora para invocarlos tenemos el siguiente codigo:
INCLUDE misMacros . inc
miMacro 1 ,2 ,3
RET
donde:
INCLUDE: es pseudointrucción o directiva usada para incorporar elarchivo que posee los procedemientos o macros que queremos invocar.
77
misMacros.inc: es el nombre del archivo externo que posee los macrosque queremos invocar en varios códigos.
A diferencia de invocar los procedimientos, en los macros solo basta coninvocarlos con el nombre del macro e incluir el archivo externo donde estancontenidos.
78
Referencias
[1] J. Fuster Cabañero and F. Pérez Aliaga, Lenguajes Ensambladores, vol. 1.McGraw-Hill, 1991.
[2] B. Allyn, “Documentation for emu8086 - assembler and microprocessoremulator.,” 2005.
[3] K. R. Irvine, Lenguaje ensamblador para computadoras basadas en intel5ED. Pearson Educación, 2008.
79