apuntes

79
Universidad Católica del Maule Facultad de Ciencias de la Ingeniería Escuela de Ingeniería Civil Informática Apuntes de Lenguaje Ensamblador Arquitectura de Computadores II Sergio Antonio Baltierra Valenzuela Talca, Semestre II, 2013 1

Transcript of apuntes

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

Page 2: apuntes

Í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

Page 3: apuntes

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

Page 4: apuntes

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

Page 5: apuntes

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

Page 6: apuntes

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

Page 7: apuntes

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

Page 8: apuntes

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

Page 9: apuntes

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

Page 10: apuntes

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

Page 11: apuntes

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

Page 12: apuntes

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

Page 13: apuntes

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

Page 14: apuntes

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

Page 15: apuntes

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

Page 16: apuntes

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

Page 17: apuntes

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

Page 18: apuntes

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

Page 19: apuntes

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

Page 20: apuntes

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

Page 21: apuntes

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

Page 22: apuntes

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

Page 23: apuntes

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

Page 24: apuntes

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

Page 25: apuntes

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

Page 26: apuntes

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

Page 27: apuntes

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

Page 28: apuntes

ETI1 :MOVAX, 13MOVBX, 14

28

Page 29: apuntes

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

Page 30: apuntes

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

Page 31: apuntes

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

Page 32: apuntes

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

Page 33: apuntes

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

Page 34: apuntes

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

Page 35: apuntes

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

Page 36: apuntes

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

Page 37: apuntes

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

Page 38: apuntes

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

Page 39: apuntes

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

Page 40: apuntes

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

Page 41: apuntes

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

Page 42: apuntes

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

Page 43: apuntes

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

Page 44: apuntes

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

Page 45: apuntes

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

Page 46: apuntes

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

Page 47: apuntes

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

Page 48: apuntes

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

Page 49: apuntes

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

Page 50: apuntes

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

Page 51: apuntes

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

Page 52: apuntes

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

Page 53: apuntes

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

Page 54: apuntes

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

Page 55: apuntes

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

Page 56: apuntes

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

Page 57: apuntes

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

Page 58: apuntes

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

Page 59: apuntes

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

Page 60: apuntes

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

Page 61: apuntes

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

Page 62: apuntes

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

Page 63: apuntes

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

Page 64: apuntes

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

Page 65: apuntes

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

Page 66: apuntes

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

Page 67: apuntes

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

Page 68: apuntes

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

Page 69: apuntes

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

Page 70: apuntes

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

Page 71: apuntes

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

Page 72: apuntes

[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

Page 73: apuntes

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

Page 74: apuntes

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

Page 75: apuntes

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

Page 76: apuntes

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

Page 77: apuntes

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

Page 78: apuntes

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

Page 79: apuntes

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