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