Está en la página 1de 39

1

LENGUAJE ASSEMBLER.

INTRODUCCIN

El ASSEMBLER es el lenguaje ms bsico y sin embargo es un lenguaje complejo que da al programador el control absoluto sobre la mquina. El lenguaje ASSEMBLER es realmente el cdigo simblico asociado a cada funcin del microprocesador del ordenador. El cdigo es un nemotcnico (representacin simblica abreviada) de una instruccin mquina binaria real. La forma especfica de un lenguaje ensamblador depende de la arquitectura y configuracin de la mquina a la que proporcionar soporte. El componente que tiene mayor impacto sobre el diseo del ensamblador es la unidad central de procesamiento (CPU). El trmino original Assembly denota el lenguaje simblico (programa fuente) y el trmino Assembler se refiere al compilador (programa que traduce el lenguaje fuente a objeto). Normalmente se hace referencia a ambos, sin distincin, como ASSEMBLER. Algunas de las ventajas que ofrece el aprender a escribir un programa en lenguaje ASSEMBLER son: Conocer en mayor profundidad el funcionamiento bsico de la mquina. Ganar rapidez en la ejecucin de los programas. Tener acceso a TODAS las posibilidades del ordenador. Entender mejor cmo funcionan los lenguajes de alto nivel. Reducir el tamao final de un programa. En esta bolilla estudiaremos el ASSEMBLER del procesador 8088/8086 bajo el sistema operativo DOS. Este ASSEMBLER es un subconjunto del ASSEMBLER de los procesadores 80286 en adelante.

CAPTULO 1:

LA MEMORIA. EL ALMACENAMIENTO

BIT El dgito binario es la unidad de almacenamiento BYTE Un byte es la unidad de direccionamiento de la memoria. Los bits de la memoria se agrupan en bytes, a razn de 8 bits por byte.

Figura 1. Nibble, byte y palabra. El 1er. byte de la memoria corresponde a la direccin 0 (cero), el 2do. a la direccin 1, ..., etc. Los bits dentro del byte se numeran de derecha a izquierda . Es decir desde el LSB (bit menos significativo) al MSB (bit mas significativo). Un Byte puede ser descompuesto en 2 grupos de 4 bits denomi nados Nibbles. Un Nibble puede almacenar un carcter hexadecimal . Agrupaciones de bits: Los ocho bits de un byte no permiten manipular confortablemente los datos de todos los problemas de programacin, por lo que existen otras formas de agrupar los mismos. Definicin DB DW Denominacin BYTE PALABRA ( WORD) Longitud 8 bits 2 Bytes Valor Mximo 162-1 = 28-1 = 255 164-1 = 65535 = 64K Positivo +27-1 = 127 +215-1 Negativo -27 = 128 -215

2 DD DQ DT DOBLE PALABRA CUADRUPLE PALABRA DECABYTE 4 Bytes 8 Bytes 10 Bytes 168-1 1616-1 +231-1 +263-1 -231 -263

Tabla 1. Agrupaciones de bits. En longitud, cuando decimos 2 o ms byte, nos referimos a 2 o ms bytes consecutivos en direcciones de memoria. Los valores contenidos dentro de estas agrupaciones, se almacenan en memoria en orden inverso . El LSB (byte menos significativo) se almacena primero y el MSB (byte mas significativo) ltimo. Ejemplo: Tipo BYTE PALABRA ( WORD) DOBLE PALABRA CUADRUPLE PALABRA Valor 01h 0123h 01234567h 0123456789ABCDEFh Almacenamiento 01 2301 67452301 EFCDAB8967452301

Tabla 2. Almacenamiento de bytes en memoria. Otras agrupaciones de bytes: Prrafo Pgina Segmento 16 bytes 256 bytes 64 KBytes

TIPOS DE DATOS Nmeros Binarios: pueden ser con o sin signo y ocupan desde 1 byte hasta 4 palabras (ver "Agrupaciones de bits"). Cuando se trata un nmero con signo, el Bit mas significativo indica si es positivo (0) o negativo (1). Nmeros Decimales Desempaquetados: Cada byte contiene un dgito BCD (Binary-Coded Decimal o decimal codificado en binario) en el nibble inferior. El nibble superior es cero. Cada byte puede almacenar un dgito decimal (0 a 9). Ej.: el nmero 1234D (1234 decimal) se almacena en 4 bytes como 01020304h Nmeros Decimales Empaquetados: Cada byte contiene dos dgitos BCD. El dgito ms significativo se almacena en el nibble superior. Cada byte puede almacenar del valor 00D al 99D (dos dgitos decimales). Por ejemplo, el nmero 1234D se almacena en dos bytes como 1234h. Caracteres ASCII: El ASCII (American Standard Code for Information Interchange) es un convenio adoptado para asignar a cada caracter un valor numrico nico. En un byte podemos representar los caracteres ASCII estndard en los primeros siete bits (del 0 al 127) y, considerando el octavo bit (el MSB) los caracteres ASCII extendidos (del 128 al 255). Ejemplo: El carcter 0 (cero) , como representacin grfica, corresponde al valor numrico interno codigo ASCII 30h. Este mismo byte, en forma interna, ser interpretado de manera diferente, dependiendo del uso o tratamiento que le demos, puesto que, como caracter es un cero, como decimal empaquetado ser un 30d (treinta decimal) y como binario ser un 48d (cuarenta y ocho decimal).

CAPTULO 2 :

EL ORDENADOR

Los componentes bsicos de un ordenador son: La unidad central de procesos, la memoria, los controladores auxiliares y las unidades de entrada/salida. Los tres primeros estn vinculados por un BUS que los comunica.

Figura 2. Elementos de un microordenador. Interconexin.

La unidad central de proceso (CPU). La CPU es un microprocesador que realiza tareas de control y clculo. Se compone de: La unidad de control. Interpreta las instrucciones y genera las rdenes para que se ejecuten. La unidad de clculo (o aritmtico-lgica). Siguiendo las rdenes generadas por la unidad de control, recibe los datos de la memoria, opera con ellos y almacena el resultado en la memoria o en los registros internos. Los clculos son del tipo aritmtico o lgico. Dentro de la CPU existen una serie de registros internos que forman un rea de trabajo para almacenamiento temporal de datos, direcciones de memoria y banderas (flags) de estado y control del procesador. Un microprocesador es un procesador de un solo chip (pastilla de circuito integrado). La CPU es un microprocesador. El microprocesador est conectado a un oscilador (o reloj) que genera impulsos igualmente espaciados en el tiempo. El microprocesador generalmente divide la frecuencia base por una constante para implementar un ciclo de mquina. Cada instruccin que ejecuta el microprocesador consume un nmero determinado de ciclos.

La memoria. La constituyen una serie de chips que sirven para almecenar informacin. Hay dos tipos de memoria: ROM (de slo lectura) y RAM (lectura/escritura). Si consideramos la memoria como un gran espacio direccionable, cualquier direccin puede contener memoria ROM o memoria RAM y no hay diferencias en su tratamiento. El hecho de que la memoria ROM est agrupada en un espacio de direcciones predeterminado es exclusivamente por convensin. Los controladores auxiliares. Como el microprocesador principal no puede realizar todo el trabajo del ordenador, se vale de otros procesadores para realizar ciertas funciones de control, como, por ejemplo: el control del flujo de informacin entre el procesador principal y los dispositivos externos conectados, constituyendose en este caso en el interfaz entre el ordenador y las unidades de entrada/salida. Algunos controladores auxiliares son: Controlador de interrupciones: Supervisa las interrupciones. Controlador DMA (Direct Memory Access): Permite realizar transferencias (leer/escribir) entre la memoria y una unidad de E/S sin la intervencin de la CPU. Est orientado principalmente a unidades de disco. El oscilador: suministra la seal de reloj. El controlador de pantalla. Conocido como adaptador de video. El controlador de diskette.

Las unidades de entrada/salida. Unidades de diskettes, impresoras, etc.

4 Recuperacin y ejecucin de instrucciones El ciclo de ejecucin de las instrucciones consta bsicamente de dos fases. La primera consiste en la recuperacin y decodificacin de la instruccin que estn en la memoria y la segunda es la ejecucin en s. Para optimizar estos dos procesos, el microprocesador posee dos unidades separadas: El BIU (Bus Interface Unit). Para la recuperacin de instrucciones. El EU (Execution Unit). Para la ejecucin de instrucciones. Una instruccin recuperada por el BIU se la pasa a la EU para que la ejecute. Mientras se ejecuta la instruccin, el BIU recupera la siguiente instruccin en memoria, que ser la que se ejecute a continuacin (si no hay bifurcacin). El coprocesador El procesador principal solamente trabaja con nmeros enteros con o sin signo. Los nmeros de punto flotante o los llamados "reales" se manejan de un modo especial, normalmente mediante subrutinas de soft, con el correspondiente costo en velocidad. La alternativa es un circuito integrado que se instala en la placa principal, llamado coprocesador, que ejecuta operaciones con nmeros en punto flotante con mayor velocidad y con mejor presicin. El BUS Es el canal de comunicacin entre todas las unidades funcionales del sistema. Cada vez que un dato pasa de un componente a otro, viaja a lo largo de este camino comn para llegar a destino. Cada chip de control y cada byte de memoria estn conectados al BUS directa o indirectamente. La interconexin entre estas unidades se realiza al "pinchar" o "colgar" cada unidad al bus. Cuando se aade una nueva unidad, se conecta a una de las ranuras (slots) de expansin, conectada al bus. Un bus se compone de varias lneas o hilos (uno por bit) por el que circula informacin. Hay tres tipos de buses, segn la informacin que circule por el mismo: Bus de datos. Funciona en conjuncin con el bus de direcciones para transmitir datos. Bus de direcciones. Son n lneas de seales que se utilizan para transmitir las direcciones de las posiciones de memoria y de los dispositivos conectados al bus. Se podrn transmitir, en consecuencia, 2 n direcciones distintas. Bus de control. Sirve para indicar el tipo de informacin que viaja por el bus. Cuando un dato est preparado para ser transmitido, primero se enva su direcin de destino por el bus de direcciones, y a continuacin se enva el dato por el bus de datos. Puertos (ports) A lo largo del bus se encuentran los puertos (ports) de entrada/salida que conectan la memoria y los controladores auxiliares con el bus. Un puerto de E/S es una va de comunicacin con otros componentes del ordenador. Con exepcin del envo de datos a la pantalla, todo el resto del hardware se controla y usa enviando datos a traves de los puertos. Cuando los datos se transmiten de un componente a otro, viaja por el bus desde el componente fuente al de destino, almacenandose temporalmente en puertos y registros. Como las posiciones de memoria, cada puerto se identifica con una direccin, pudiendose leer o escribir datos sobre un puerto. Recursos del sistema Los recursos del sistema se utilizan a travs de un conjunto de rutinas que realizan una serie de funciones. Existen dos tipos de rutinas: BIOS (Basic Input Output System). Son rutinas bsicas de entrada/salida, como: leer una tecla, escribir un carcter por pantalla, acceder a un sector del disco, etc. DOS (Disk Operating System). Son las rutinas del sistema operativo que facilitan el desarrollo de aplicaciones. En ltimo trmino invocan a las rutinas elementales del BIOS. Comunicacin con el exterior El microprocesador se comunica con el exterior de tres maneras:

5 Mediante acceso (directo o indirecto) a memoria. El acceso directo se logra a travs del controlador DMA (Direct Memory Access). Las unidades de disco y las puertas de comunicacin serie pueden acceder a la memoria directamente a travs de este controlador. El acceso indirecto se logra a travs de los registros internos que se utilizan para transferir datos a y desde memoria. A travs de puertas de E/S. Es el medio normal de comunicacin con otros procesadores. Mediante interrupciones. Interrupciones Son seales que se le envan a la CPU para que termine la ejecucin de la instruccin en curso y atienda una peticin determinada. Hay cuatro tipos de interrupciones: Interrupciones hardware. Son las generadas por la circuitera del ordenador en respuesta a algn evento como pulsar una tecla. Este tipo de interrupciones la maneja el controlador de interrupciones, que establece la prioridad antes de enviar la seal a la CPU. Interrupciones internas. Son las generadas por la propia CPU cuando se produce una situacin anormal, como, por ejemplo, una divisin por cero. Interrupcin software. Son las generadas por el propio programa para invocar a ciertas rutinas almacenadas en memoria (RAM o ROM). Es posible cambiar estas rutinas o desarrollar otras nuevas. Interrupcion no enmascarable. Se usa para pedir la atencin inmediata de la CPU en situaciones de emergencia, como caida de voltaje o error de paridad de la memoria. Cada interrupcin lleva asociada un nmero que identifica el tipo de servicio que debe realizar, a partir del nmero de la interrupcin calcula la direccin de la rutina que realizar el servicio requerido, la ejecuta y retorna a la instruccin siguiente a la ltima que ejecut antes de que se produjera la interrupcin. Existen en total 256 interrupciones posibles (cdigos 0 a 255 = FFh). Mediante este cdigo se apunta a una tabla de vectores de interrupcion. Cada vector de interrupcin ocupa una doble palabra y contiene la direccin de la rutina de tratamiento de la interrupcin (rutina de servicio de la interrupcin) en el formato desplazamiento |segmento . El vector de interrupciones empieza en la direccin cero de la memoria. Nro. Nro.(hex.) Tipo Direccin Algunas de las interrupciones se reservan para el (decimal) vectores BIOS (Basic Input Output System) y otras para el sistema 0 - 31 0 - 1F BIOS 0h - 7Fh operativo (Ej.: DOS). 32 - 63 20 - 3F DOS 80h - FFh 64 - 127 40 - 7F usuario 100h - 1FFh 128 - 255 80 - FF BASIC 200h - 3FFh Tabla 3. Tipos de interrupcion. Caractersticas generales Existen varios tipos de microprocesadores, por ejemplo : El 8088, de arquitectura de 16 bits, pero que trabaja con un BUS de datos de 8 bits. El 8086, de arquitectura y BUS de 16 bits. El 80286, de arquitectura y BUS de 16 bits con soporte de multitarea, modo protegido y memoria virtual y el 80386 con arquitectura y BUS de 32 bits con los mismos soportes que el 80286 pero con relojes ms veloces. Caractersticas generales: El bus de datos es de 8 bits en el 8088, de 16 bits en el 8086 y 80286 (los datos se transmiten de a una palabra) y de 32 bits en el 80386. El bus de direcciones es de 20 bits para el 8088 y el 8086, lo que les permite direccionar un megabyte, es de 24 bits para el 80286, permitiendo direccionar 16 megabytes y es de 32 bits en el 80386 permitiendole direccionar hasta 4 gigabyte. Las palabras pueden residir en cualquier direccin de memoria, no es necesario ajuste de frontera. Puede operar con nmeros Binarios (con o sin signo) y con decimales (empaquetados o no). Una instruccin puede requerir de 2 a mas de 200 ciclos para ejecutarse. Existen ocho modos de direccionamiento. Se pueden direccionar hasta 64K puertas de E/S. Desde el 80286 en adelante, se tiene capacidad de proceso multitarea y almacenamiento de memoria virtual. El cdigo desarrollado para el 8088/8086 se ejecuta en el modo de direcciones reales mientras que el cdigo para el 80286 en adelante, se puede ejecutar en ese modo o en el modo de direcciones virtuales (o modo protegido). Por lo que en el modo de direccionamiento real, se tiene compatibilidad con el cdigo objeto existente del 8088/8086. Un programa desarrollado para el 8088/8086 funciona en un entorno 80286 en adelante, pero estos microprocesadores poseen instrucciones adicionales.

CAPTULO 3 : REGISTROS INTERNOS DEL MICROPROCESADOR

Son catorce (14) registros, todos de una palabra (16 bits). Los bits se numeran de derecha a izquierda, por tanto el bit 0 (cero) es el bit menos significativo.

Cuatro registros de Datos o de Almacenamiento temporal


AX Acumulador. Este registro puede ser utilizado para almacenamiento de programacin en general. Es el registro principal utilizado en las operaciones aritmticas. BX Base. Se usa para indicar un desplazamiento (offset). CX Contador. Se usa de contador en bucles (loops) y en operaciones de tipo repetitivo. DX Dato. Se usa tambin en operaciones aritmticas como complemento de AX y en algunas operaciones de E/S para especificar la direccin del dispositivo. Byte superior (bits 15 a 8) AH BH CH DH Byte inferior (bits 7 a 0) AL BL CL DL En estos cuatro registros es posible referirse al byte superior (mas significativo) o al byte inferior (menos significativo) en forma independiente, como si fueran dos registros de 8 -ocho- bits c/u.

Registro AX BX CX DX

Tabla 4. Registros de Datos o Almacenamiento. Diviones posibles.

Cuatro registros de segmentos: Contienen las direcciones de comienzo de los segmentos de memoria que se
manejan. CS Code segment. Contiene la direccin de inicio del segmento de cdigo, es decir, de las instrucciones del programa en ejecucin. DS Data segment. Contiene la direccin de inicio del segmento de datos, es decir, el rea de memoria donde se encuentran las variables y constantes del programa. SS Stack segment. Contiene la direccin de inicio del segmento de pila. La pila es un espacio de memoria temporal que se utiliza para almacenar valores de una longitud de una palabra (16 bits). ES Extra segment. Contiene la direccin de inicio de un segmento extra (adicional) de datos que se utiliza para superar las limitaciones de 64 Kb del segmento de datos y para hacer transferencias de datos entre segmentos.

Dos registros punteros de pila:


SP Stack pointer. Puntero o apuntador de la pila. Contiene la direccin relativa (desplazamiento) del segmento de pila. Siempre apunta a la posicin superior de la pila. BP Base pointer. Puntero o apuntador de la base. Se utiliza para fijar el puntero de pila y asi poder acceder a los elementos de la pila. Ambos registros, en combinacin con SS, nos van a permitir operar en la pila, es decir apilar y desempilar

Dos registros de ndices: Son utilizados como desplazamiento relativo de los datos con respecto a los registros de
segmentos ES y DS. SI Source index. Indice fuente u origen. DI Destination index. Indice destino. En operaciones con caracteres, ES:SI se asocia a la zona llamada fuente, mientras que DS:DI a la zona de destino.

Un registro puntero de instrucciones.


IP Instruction pointer. Puntero de instruccin. (En muchos aspectos es muy similar al contador de programa -Program Counter PC-). Contiene el desplazamiento de la instruccin siguiente a ejecutar respecto al segmento de cdigo actualmente activo.

En conjuncin con el registro CS, indica la direccin completa de la siguiente instruccin a ejecutar, es decir, CS:IP. Los programas no pueden manejar directamente este registro.

Un registro de banderas (flags) o sealizadores. Cada bandera (flag) es un bit y se usa para registrar la
informacin de estado y de control de las operaciones del microprocesador. Hay 9 (nueve) banderas (los otros siete bits no se utilizan).

Figura 3. Registro de banderas (flags). Seis banderas de estado ( status ). Registran el estado del procesador, normalmente asociado a una comparacin o a una instruccin aritmtica: CF Carry flag. Bandera de acarreo. Se pone en 1 si se produce un acarreo o un prstamo en las instrucciones aritmticas. Tambin se utiliza en instrucciones de desplazamiento y rotacin, en cuyo caso contiene el bit desplazado o rotado fuera del registro. PF Parity flag. Bandera de paridad (nmero par de bits). Se pone en uno, cuando el resultado de una operacin contiene un nmero par de 1, caso contrario, en cero. AF Auxiliar flag. Bandera auxiliar. Indica si hay necesidad de ajuste en las operaciones aritmticas con nmeros BCD (decimal codificado en binario). Trabaja con los cuatro bits menos significativos de un valor BCD. ZF Zero flag. Se pone en 1 cuando el resultado de una operacin es cero. SF Sign flag. Se pone en 1 cuando el resultado o comparacin es negativo y en 0 cuando para resultados positivos. OF Overflow flag. Bandera de desbordamiento o rebose (aritmtico). Indica si una operacin ha generado arrastre en el bit de orden superior del resultado, pero no un arrastre de otro bit diferente del de orden superior. Es decir, cuando el resultado de una operacin es mayor que el mximo nmero que se puede representar con el tamao de palabra disponible. Tres banderas de control. Registran el modo de funcionamiento del microprocesador. TF Trap flag. Bandera de atrape o de traza. Controla la operacin modo paso a paso. Cuando est en 1 indica que el llamado modo de intercepcin est activado, con lo que se genera una interrupcin despus de la ejecucin de cada instruccin (usada por el programa DEBUG). IF Interrupt flag. Bandera de interrupciones. Si est en 1 indica que estn permitidas las interrupciones externas, mientras que cuando est en 0, no estn permitidas o estn inhabilitadas. DF Direction flag. Bandera de direccin. Controla la direccin (hacia adelante o hacia atrs) en las operaciones con cadenas de caracteres incrementando o decrementando automticamente los registros ndices (SI y DI). Cuando est en 1 indica que la cadena de caracteres se van a procesar en el sentido de las posiciones de memoria ms altas a las ms bajas, es decir, decrementando los registros ndices (SI y DI).

CAPTULO 4 :

DIRECCIONAMIENTO DE LA MEMORIA

Bajo el control del DOS, las direcciones asociadas con datos e instrucciones corresponden a direcciones fsicas en el hardware. Este esquema, conocido como modo de direcciones reales , se utiliza en las CPU 8088 y 8086. Por direccin fsica debe entenderse una localidad de memoria o puerto en el sistema de la microcomputadora que corresponde a una entidad de hardware. Los microprocesador 80286 en adelante (80386, 80486, ...), pueden operar en el modo de direcciones reales, en cuyo caso, el direccionamiento se calcula de la misma manera que en los procesadores 8088 y 8086, pero se tiene un modo de direccionamiento adicional denominado modo de direcciones virtuales o protegido, que es el que emplea OS/2, WINDOWS y otros. Nosotros estudiaremos slo el modo de direccionamiento real. Direccin Completa Un procesador de 16 bits no puede trabajar directamente con valores superiores a una palabra, por lo tanto el valor decimal mximo que puede manejar es 65535, 64K. Tericamente, esto significa que slo se podra acceder a 64K de direcciones de memoria. Para lograr el direccionamiento de un espacio de memoria de hasta un megabyte (2 20 -1 = 0FFFFFh), se utiliza un esquema de direccionamiento de 20 bits, que se corresponde con el BUS de direcciones, ampliando, de esta manera, el rango de posiciones de memoria con el que el procesador puede trabajar. Pero como dijimos, el procesador est limitado a trabajar con una palabra (16 bits), entonces, para acceder a direcciones de 20 bits necesita utilizar un procedimiento de direccionamiento que se adapte al formato propio de 16 bits: El procesador divide el espacio de memoria direccionable en un nmero arbitrario de SEGMENTOS , cada uno de los cuales contiene como mximo 64K bytes (la divisin del espacio direccionable es una divisin lgica, no es una divisin fsica). Cada segmento empieza en una direccin mltiplo de 10h. A esta direccin se la llama direccin del segmento o prrafo del segmento. Para acceder a los bytes individuales, se emplea una palabra (16 bits) adicional, llamada desplazamiento u offset , la cual apunta a la posicin de un byte exacto dentro del segmento designado por la direccin de segmento. Los desplazamientos siempre son relativos al comienzo del segmento, por lo que tambin se denominan direcciones relativas. Las direcciones se crean y se manipulan combinando la direccin del segmento del 16 bits y un desplazamiento de 16 bits. La direccin de segmento se trata como si estubiera desplazada a la izquierda cuatro bits, y cuando se aade el desplazamiento se obtiene una direccin completa de 20 bits. Direccin del segmento Desplazamiento Direccin completa 8AB90 21A3 8CD33 16 bits + 4 bits que se obtiene de multiplicar por 10h 16 bits 20 bits

Figura 4. Direccin completa a partir de una direccin segmentada La direccin del segmento se escribe mediante 5 dgitos en hexadecimal y siempre tienen un cero en el ltimo dgito. El cero proviene de multiplicar los 16 bits originales (cuatro dgitos hexadecimales), por 10h, o, lo que es lo mismo, por desplazar el nmero 4 bits a la izquierda. Este es el motivo por el cual la direccin del segmento debe apuntar a direcciones de memoria que sean mltiplo de 10h. Un desplazamiento o direccin relativa siempre se escribe con valores hexadecimales de cuatro dgitos, los cuales, sumados a la direccin del segmento calculado en 20 bits, forman otro nmero de 20 bits que es la direccin completa. Por ejemplo: Si tenemos una direccin de segmento en hexadecimal, como 8AB9h y lo multiplicamos por 10h, obtenemos 8AB90h. Entonces, si le sumamos un desplazamiento como 21A3h, obtenemos una direccin completa de 20 bits que en este caso sera: 8CD33h La direccin completa es de 5 (cinco) nibbles, es decir, 20 bits, que es la longitud del bus de direcciones y que surge, como vimos, del sig. clculo:.10h x segmento + desplazamiento. Mediante este sistema podremos direccionar 2 20 bytes = 16 x 64 Kb = 1024 Kb = 1Mb = 16 5 que corresponden a las direcciones 00000h a FFFFFh. Cuando se escribe una direccin de memoria con sus dos componentes, es decir segmento y desplazamiento, se utiliza la notacin 0000:0000, con la direccin del segmento del lado izquierdo y el desplazamiento del lado derecho: segmento:desplazamiento segmento:[desplazamiento]

A la direccin as expresada se la denomina direccin segmentada. Una misma direccin de memoria puede expresarse de diferentes maneras. Por ejemplo, las siguientes direcciones (en hexadecimal) son equivalentes: 100:50 = 1050 = 105:0 = 0:1050 = 10:950

9 El espacio de direcciones del 80286 es de 16 Mbytes (2 24 bytes) RAM o ROM puesto que posee un BUS efectivo de direcciones de 24 lneas, sin embargo, slo el modo de direccionamiento virtual protegido permite hacer uso de la capacidad de direccionamiento de este BUS. El espacio virtual de direcciones es de 1 GByte (2 30 bytes). Segmentos y registros asociados El 8088/8086 soporta cuatro mdulos de cdigo accesibles simultneamente, denominados segmentos. Por lo tanto un programa consta de cuatro tipos de segmentos. Cada segmento se direcciona mediante un determinado registro de segmento de 16 bits c/u. La direccin fsica de cualquier elemento dado en un segmento seleccionado se obtiene por la combinacin de la direccin del segmento y el desplazamiento. Este desplazamiento puede estar contenido en uno de los registros puntero, base o ndice. Segmento Cdigo. El cdigo del programa actualmente en ejecucin, residente en memoria, est direccionado por CS. Cada instruccin se direcciona mediante: CS Registro de Segmento IP Registro de desplazamiento Segmento de Datos . La base del segmento de datos activo actualmente est direccionada por DS. Los datos se direccionan mediante: DS Registro de Segmento BX, SI DI Registros de desplazamiento Segmento de Pila. La pila es una estructura de datos en memoria donde pueden colocarse bytes o palabras (instruccin PUSH), una despus de otra, y que, posteriormente se pueden recuperar (instruccin POP), con la caracterstica de que la primera en salir es la ltima que ingres (LIFO). Es utilizada normalmente para resultados intermedios y para llamadas a subrutinas. La direccin base del segmento de pila activa actualmente est en SS. Los datos se direccionan mediante: SS Registro de segmento SP BP Registros de desplazamiento Segmento Extra. El programa tiene acceso a un segundo segmento de datos activo concurrentemente, denominado Segmento Extra, que se direcciona con el registro ES. Los datos se direccionan mediante: ES Registro de Segmento BX, SI DI Registros de desplazamiento Modos de direccionamiento Una instruccin contiene informacin sobre la operacin a realizar e incluye las especificaciones para el tipo de operando a manipular, as como la direccin ( posicin) de estos operandos. La sintxis de la instruccin determina el modo de direccionamiento utilizado. Hay ocho modos de direccionamiento para acceder a los datos en la memoria: 1 Implcito Hay instrucciones que no necesitan ir seguidas por ningn operando por estar implcitas en el cdigo de la instruccin. Por ejemplo: CLC ; (Clear Carry Flag) puesta a cero del bit CF AAA ; ajuste ASCII para la suma. Corrige en AL la suma de dos nros. desempaq. ; Si AL > 9 AF = 1. Ocupa AH, AL y AF. 2 Inmediato (o de valor inmediato) El operando se indica explcitamente. El valor del operando est contenido en la instruccin y puede ser de 8 16 bits. En el valor del operando inmediato siempre se contempla el signo, esto significa que el bit ms significativo del valor del operando fuente es replicado (de ser necesario) para contemplar el bit del operando destino. Por ejemplo: MOV AL,12h ,cargar el valor hexadecimal 12 en el registro AL. Formato interno: B012h MOV AL,142 ; cargar el valor decimal 142 al registro AL. Formato 8 bits: b08eh MOV AX,142 ; cargar el valor decimal 142 al registro AX. Formato 16 bits: b88e00h ADD AH,1AH ; sumar al registro AH el valor hexadecimal 1A 3 De registros Los operandos son los contenidos de los registros especificados en la instruccin. La longitud del operando viene dada por el nombre del registro utilizado. Por ejemplo: MOV AL,DL ; copia el contenido del registro DL en el registro AL ADD AH,CL ; suma al registro AH el contenido del registro CL 4 Directo o absoluto En la direccin se especifica la BASE (opcional cuando es DS) y el DESPLAZAMIENTO. El operando de direccionamiento directo es normalmente un rtulo ( nombre de campo).

10 Por ejemplo: MOV AX,NUM ; carga en el registro AX los 16 bits de la direccin de memoria resultante de DS x 10h + NUM (Direccin Efectiva EA) Tener presente que cuando especificamos NUM, nos estamos refiriendo a la direccin de inicio (o primer byte) de la variable definida con el nombre "NUM" y no a su contenido . MOV AX,ES:NUM ; dem anterior pero ahora es ES x 10h + NUM

Figura 5. Direccionamiento directo o absoluto. 5 Indirecto ( indirecto de registro) Es similar al anterior, pero en este caso el DESPLAZAMIENTO se encuentra en uno de los registros ndices o base (BX, BP, SI o DI) y se indica encerrando entre corchetes el nombre de registro referido. Por ejemplo: MOV AX,[BX] ; copia en el registro AX el contenido de la direccin de memoria que resulta de la siguiente operacin: DS x 10h + BX Indirecto relativo a base Es una combinacin entre el directo y el indirecto. La direccin efectiva de un operando se obtiene de la suma de un desplazamiento (normalmente una constante) y el contenido de un registro base (BX BP) , relativo al segmento seleccionado. Por ejemplo: MOV AX,[BX+8] ; copia en AX el contenido de la direccin de memoria que resulta de DS x 10h + BX + 8 Es til para direccionar estructuras de datos, como registros, y tambin para acceder a vectores en memoria formado por varios campos, donde la constante a sumar nos da el desplazamiento del campo dentro del elemento del vector. Indexado directo La direccin de desplazamiento del operando se calcula sumando el desplazamiento a un registro ndice (SI DI) en el segmento seleccionado. Por ejemplo: ADD AX,VECTOR[DI] ; sumar al registro AX el contenido de la direccin de memoria que resulta de DS x 10h + DI + VECTOR Indexado respecto a una base El operando se localiza en el segmento seleccionado en un desplazamiento determinado por la suma de los contenidos de un registro de base (BX BP), un registro de ndice (DI SI) y, opcionalmente, por un desplazamiento adicional dado por una variable o constante. Por ejemplo: ADD AX,NUM[BX][DI] ; sumar a AX el dato contenido en la direccin DS x 10h + BX + DI + NUM 1. 2. 3. 4. 5. Denominacin del modo Implcito Inmediato (o de valor inmediato) De registros Directo o absoluto Indirecto ( indirecto de registro) Operando valor registro variable [BX] [BP] [DI] [SI] [BX]+desp [BP]+desp [DI]+desp [SI]+desp [BX][SI]+desp [BX][DI]+desp [BP][SI]+desp [BP][DI]+desp Reg. DS DS SS DS DS DS SS DS DS DS DS SS SS Ejemplos . AAA MOV AX,500 MOV AX,BX MOV AX,NUM MOV AX,[BX] MOV AX,[BP] MOV AX,[DI] MOV AX,[SI] MOV AX,4[BX] MOV AX,4[BP] MOV AL,NUM[DI] MOV AL,NUM[SI] MOV AX,NUM[BX][SI] MOV AX,NUM[BX][DI] MOV AX,NUM[BP][SI] MOV AX,NUM[BP][DI]

6. 7. 8.

Indirecto relativo a base Indexado directo Indexado respecto a una base

Tabla 5. Modos de direccionamiento. Referencias de la Tabla Modos de Direccionamiento

10

11 En la columna "Ejemplo", el modo est expresado en el segundo operando (operando fuente). La columna Reg. se refiere al registro de segmento que se asume por defecto: DS si el desplazamiento (offset) se expresa con BX, SI DI SS si el desplazamiento se expresa con BP SP Los modos de 4 a 8 se refieren a direcciones de memoria. El microprocesador debe calcular la direccin del operando en la base de la direccin del segmento, desplazamiento del segmento y posiblemente un registro ndice. Esta direccin derivada del operando es referenciada como la direccin efectiva del operando EA. En el modo 2, un valor inmediato puede ser: K EQU 500 ; definicin de constante MOV AX,K ; utilizado como valor inmediato Especificar un nombre de variable (NUM en los ejemplos) es equivalente a especificar el desplazamiento de la variable ( rtulo) dentro del segmento en el que est definido. Por tanto, ejemplos alternativos a los modos 7 y 8 son, respectivamente: MOV AL,[DI]+4 MOV AX,[BX][SI]+4 En el modo 6, las siguientes instrucciones son equivalentes: MOV AX,[BX]4 MOV AX,4[BX] MOV AX,[BX]+4 MOV AX,[BX+4] En el modo 8, las siguientes instrucciones son equivalentes: MOV AX,4[BX][DI] MOV AX,[BX+DI+4] MOV AX,[BX+4][DI] MOV AX,[BX][DI+4] En los modos de direccionamiento del 4 al 8, es decir, los que se refieren a direcciones de memoria, pueden estar precedidos por el nombre de un registro de segmento. Por ejemplo: MOV AX,ES:NUM[SI] Esto quiere decir que el registro de segmento que se debe utilizar es ES y no el que normalmente se asumira por defecto, que en este caso es DS. Las posibles combinaciones entre los registros de segmentos y los de desplazamiento son: p significa CS SS DS ES prefijo IP si No no no SP no Si no no BP p D p p BX p P D p SI p P D p DI p P D D (cadenas) Tabla 6. Posibles combinaciones registro-segmento:registro-desplazamiento D es el asumido por defecto no puede utilizarse utilizando

11

12

CAPTULO 5 :

HERRAMIENTAS DE PROGRAMACIN

El Editor Es el programa con el que construimos el programa fuente. Puede utilizarse cualquier editor de textos,preferiblemente de pantalla completa, que genere archivos ASCII y desprovisto de todo cdigo de control especial para subrayados, ajustes, superndices, negrita, etc. Los ficheros con programas fuentes deben tener la extensin ..ASM. El Compilador Es el programa que convierte el cdigo fuente en cdigo objeto, es decir, convierte las sentencias escritas en lenguaje ASSEMBLER a instrucciones de lenguaje mquina. El compilador es un programa muy especfico ya que guarda estrecha relacin con la arquitectura del hardware especfico de cada computadora. Entrada del compilador:...................mdulo.ASM ; programa fuente Salida.................................................mdulo.OBJ ; programa objeto ...........................................................otros conteniendo el listado (.LST) , ref. cruzadas (.CRF), etc El compilador tiene dos pasos, que realizan bsicamente lo siguiente: Paso 1: Comprobacin de sintxis, construccin de una tabla de smbolos y reemplazo de las psudo-op por los cdigos de operaciones correspondientes. Paso 2: Reemplazo de smbolos y construccin de instrucciones definitivas. El Montador (LINK) Este programa convierte el programa objeto (.OBJ) en un programa ejecutable (.EXE). Permite combinar varios mdulos (programas) objetos, realizando las conexiones necesarias entre ellos. El LINK se encarga de asignar direcciones de memoria absolutas para relocalizar el cdigo objeto. Entrada del LINK:............................mdulo.OBJ,[modulo2.OBJ, . . .] ...........................................................librera.LIB,[librera2.LIB, . . .] Salida.................................................mdulo.EXE ; programa ejecutable ...........................................................listado de mapas del mdulo generado Proceso tpico de ensamblamiento 1. Crear el programa fuente con un editor de textos. programa.ASM 2. Generar el programa objeto ejecutando el compilador. programa.OBJ 3. Enlazar el programa objeto (con el LINK) para generar el programa ejecutable. programa.EXE Figura 6. Proceso de ensamblaje. Programas en formato .EXE y .COM. Programa EXE2BIN. Un programa .EXE (programa ejecutable) no es la imagen exacta y tal como se ejecutar en memoria. Cuando se carga en memoria, el sistema operativo (el DOS en nuestro caso), realiza una serie de operaciones previas: Crear el PSP (prefijo de segmento de programa). Inicializar los registros Indicarle al programa donde ha sido cargado Calcular el tamao del mdulo ejecutable Crear una pila para uso del programa Pasarle el control Un programa .COM es una imagen exacta del programa tal y como se cargar en memoria. Es mas compacto que el formato EXE y se carga ms rapidamente. Con este tipo de programas, el sistema operativo slo tiene que hacer lo siguiente:

12

13 Crear el PSP (prefijo de segmento de programa). Inicializar los registros Pasarle el control

Para que pueda crearse un programa .COM a partir de un programa fuente, es necesario: Que el programa conste de un slo segmento fsico, es decir, su longitud debe ser menor a 64Kb. Que la primera instruccin ejecutable del programa se encuentre en el desplazamiento 100h = 256d respecto del origen del segmento. Esto se logra mediante la directiva ORG 100h tras la sentencia SEGMENT El programa EXE2BIN es el programa que convierte un programa en formato .EXE en un programa .COM. Librerias Una librera de mdulos objetos, es una coleccin de objetos reunidos en un solo fichero. Al indicar al montador (LINK) el nombre de una o varias libreras, se evita tener que especificar cada uno de los mdulos objetos que se utilizan en el programa. Para utilizar un procedimiento perteneciente a un mdulo objeto, es necesario en el mdulo llamador: Invocar al procedimiento con la instruccin CALL. Decrarar al procedimiento llamado como externo (sentencia EXTRN) Ejemplo: EXTRN RUTINA01:FAR . . CALL RUTINA01 Y en el mdulo llamado: Declarar el procedimiento como pblico (sentencia PUBLIC) Ejemplo: PUBLIC RUTINA01 . . RUTINA01 PROC FAR Programa DEBUG Es un programa de utilidad para la depuracin de programas, que nos permite realizar operaciones como: Examinar la memoria en ASCII y hexadecimal Examinar los registros y banderas Ejecutar un programa paso a paso, es decir, una instruccin cada vez. Parar la ejecucin de un programa en un punto determinado Desensamblar, es decir, obtener cdigo simblico (si existen) corresp. a una zona de memoria o de un fichero. Acceder a disco

13

14

CAPTULO 6 : COMIENZO Y TERMINACIN DE UN PROGRAMA

El PSP Antes de que el procesador de comandos (COMMAND.COM) del DOS pase el control al programa, construye un bloque de 256 bytes (100h) a partir de la primera posicin de memoria disponible. Esta rea se llama el Prefijo de Segmento de Programa (PSP o Program Segment Prefix) y contiene campos como la direccin de retorno al DOS cuando acabe de ejecutarse el programa, la cantidad de memoria disponible, los parmetros del programa, etc. Despl. 0h 2h 4h 5h Ah Eh 12h 16h 2Ch 2Eh 5Ch 6Ch 80h 81h 100h Long. 2h 2h 1h 5h 4h 4h 4h 16h 2h 2Eh 10h 14h 1h FFh Campo Instruccin INT 20h Tamao de memoria disponible para el programa (en prrafos) Reservado Llamada al despachador (dispacher) de trabajos Direccin de terminacin (normalmente del COMMAND.COM) Direccin si Ctrl+Breack Direccin si error crtico Reservado para el DOS Segmento de entorno (environment) Reservado para el DOS FCB sin abrir el parmetro 1 FCB sin abrir el parmetro 2 Longitud de los parmetros. Inicialmente es la DTA (Disk Transfer Area) Parmetros Direccin del primer byte despus del PSP

Tabla 7. Estructura del PSP Cuando el programa toma el control: DS y ES apuntan al PSP El registro AL contiene un cdigo que indica si es correcta o no la unidad correspondiente al primer nombre de fichero. El valor cero indica que es correcta. El registro AH, lo mismo para el segundo nombre de fichero. El DTA apunta al desplazamiento 80h del PSP En los programas tipo EXE: CS e IP se inicializan con los valores especificados por el montador (LINKER), es decir, los valores especificados en el operando de la sentencia END del programa y cero si no se especific operando. SS apunta el segmento de pila (Stack) SP se inicializa con la direccin ms alta dentro del segmento de pila. En los programas tipo COM: CS y SS apuntan al PSP IP = 100h (el byte siguiente al PSP), es decir que la primera instruccin del programa sigue al PSP. SP se inicializa con la direccin ms alta dentro del segmento del PSP Los dos primeros bytes del PSP contienen el cdigo correspondiente a la instruccin INT 20h. Por ello, los programas se deben iniciar siempre con: PUSH DS ; poner DS en la pila SUB AX,AX ; AX=0 PUSH AX ; poner AX en la pila Con estas tres instrucciones, se pone sobre la pila la direccin DS:00, o sea, el comienzo del PSP. La ltima instruccin del programa ser: RET ; volver al DOS que recupera la direccin de retorno de la pila y bifurca, en este caso, al principio del PSP, donde est la instruccin INT 20h. La nica manera de terminar normalmente un programa EXE es ejecutando la instruccin INT 20h con el registro CS apuntando al PSP y SS debe tener la misma direccin de cuando se pas el control a nuestro programa. En los programas COM, como CS apunta al PSP, es posible terminar directamente con INT 20h Ejemplo de cmo se cargan campos asociados a los parmetros pasados: Desplazamiento 80h: contiene el nro. de caracteres de los parmetros. Por ejemplo, el comando MIPROGRM XXX pondra el valor 4 -cuatro- en este campo, pues considera el blanco y las tres equis. Desplazamiento 81h contiene los caracteres de los parmetros. En el ejemplo anterior, cargara el blanco y las tres equis.

14

15

CAPTULO 7 :

ESTRUCTURA DEL LENGUAJE

El programa traductor o compilador ASSEMBLER, necesita que el programa fuente se escriba con unas determinadas reglas, es decir que, como en cualquier otro lenguaje, tiene una sintaxis predefinida. Un programa fuente en ASSEMBLER contiene dos tipos de sentencias: INSTRUCCIONES Son representaciones simblicas del juego de instrucciones del microprocesador y se aplican en tiempo de ejecucin. DIRECTIVAS, SEUDO-OPERACIONES SEUDO-OP indican al compilador qu hacer con las instrucciones y los datos, por lo que se aplican en tiempo de compilacin. Una sentencia (instrucciones o directivas) escrita en ASSEMBLER debe guardar una estructura determinada para que el compilador pueda interpretarla. INSTRUCCIONES Una lnea de instruccin tiene cuatro partes o "campos": etiqueta mnemotcnico operandos comentario

El nico campo obligatorio es el mnemotcnico, los restantes son opcionales. Cada Instruccin se escribe en una sola lnea. Los campos se separan entre s por al menos un blanco. Ejemplo: MOVER: MOV AX,300 ; incializar contador Donde el campo etiqueta es . . . mnemotcnico . . . operandos . . . comentario . . . MOVER: MOV AX y 300 ; inicializar contador

Campo etiqueta Asigna un nombre simblico a la direccin de comienzo (primera posicin) de una instruccin. Un nombre debe comenzar con un carcter alfabtico y puede contener hasta 31 caracteres. Los caracteres pueden ser: * Las letras de la A a la Z (las minsculas son tratadas como maysculas) * Dgitos numricos del 0 al 9 * Los siguientes signos especiales: _ $ . @ ? Si un nombre incluye un punto (.), entonces el punto debe ser el el primer carcter. No se puede utilizar un nombre que coincida con una palabra reservada o directiva del compilador. La utilizacin de nombres simblicos simplifica la tarea de programacin, puesto que es el compilador el que se encarga de calcular automticamente la direccin de la instruccion o definicin de datos referenciada con un nombre simblico. Por lo tanto, no es necesario que en el programa se trabaje con direcciones de memoria en forma explcita. Normalmente se utilizan etiquetas para aquellas instrucciones que sern referenciadas en las definiciones de datos, constantes, segmentos, bifurcaciones, bucles y llamadas a subrutinas. Rtulo . Llamaremos rtulo a las etiquetas aplicadas a instrucciones ejecutables en los programas. Un rtulo puede ser referenciado desde dentro del mismo segmento de cdigo o desde otro segmento de cdigo. En el primer caso, el rtulo debe definirse con el atributo NEAR, en el segundo caso con el atributo FAR. Para direccionar un rtulo desde dentro del mismo segmento (rtulo NEAR), slo se necesita el desplazamiento (cargar el registro IP), puesto que la direccin del segmento es la del segmento activo (ya est en el registro CS). En caso de que el rtulo se referencie desde otro segmento (rtulo FAR), se necesita cargar la direccin del segmento y la del desplazamiento. El atributo NEAR de un rtulo se puede definir de dos maneras: 1. Implcitamente. Colocando dos puntos (:) inmediatamente despus del rtulo. 2. Explcitamente. Utilizando la pseudo-op NEAR Ejemplos: LOOP1: LOOP2 LABEL NEAR

15

16

El atributo FAR de un rtulo se define explicitamente utilizando la pseudo-op FAR Por ejemplo: SUMA LABEL FAR Variables : Llamamos variable al nombre simblico dado a una posicin de memoria que es accesible por programa, y cuyo contenido puede cambiar durante la ejecucin del mismo. Las definiciones de variables incluyen informacin sobre la direccin de posicin de memoria, tipo de dato y tamao. Las variables pueden ser utilizadas como operandos en forma simple, indexada o estructurada. Por ejemplo: NUM decimal DD 8 ; define variable NUM con formato de DoblePalabra, inicializada con un 8 (ocho)

Constantes: Podemos asignar nombres simblicos a valores o constantes. Por ejemplo: EQU 1000B ; asigna el nombre "OCHO" al nro. 1000B ( 8 Decimal )

OCHO

Campo mnemotcnico Es el nombre simblico de la instruccin. Es de dos a seis letras (puede variar dependiendo del compilador). Ejemplos: IN, ADD, PUSH, PUSHF, LOOPNE Campo Operandos Indica dnde se encuentran los datos e incluye las especificaciones para el tipo de datos a manejar. Pueden haber 0 (cero), 1 2 operandos. Si hay dos operandos, el primero se llama destino, y el segundo, fuente, y deben separarse por una coma. Ejemplos: PUSHF PUSH MOV AX AX,BX ; sin operandos. Poner banderas en la pila. ; un operando. Poner contenido de AX en la pila. ; dos operandos (destino = AX, fuente = BX)

Los operandos de las intrucciones pueden ser: Registros de 8 16 bits, Direcciones de memoria ( variables) un valor inmediato (un dato) que pueda almacenarse en 8 o 16 bits. De los operandos utilizados en las intrucciones, depende el "modo de direccionamiento" . Campo comentarios Debe empezar con punto y coma ";". La lnea completa es de comentarios, si en columna 1 se empieza con ";". Se utiliza para documentar el programa fuente. Ejemplos: MOV AX,0 ; inicializa registro AX en cero. SUB BX,BX ; inicializa registro BX en cero. MOV AH,45H ; cargo en AH, parmetro para leer un carcter. DIRECTIVAS El formato de una sentencia directiva es: etiqueta nombre_directiva operandos comentario El nico campo obligatorio es "nombre_directiva". La directiva se especifica en una sola lnea. Los campos se separan entre s por al menos un blanco. Ejemplo: CR EQU 13 ;asignar el nombre CR al valor 13 El campo etiqueta se define de la misma manera que en una instruccin, solo que no existe el sufijo ":".

16

17

CONSTANTES Y OPERADORES Las sentencias fuentes (tanto las instrucciones como las directivas) pueden contener constantes y operadores. Constantes Existen 5 (cinco) tipos de constantes: Tipo 1. Binaria 2. Decimal 3. Hexadecimal 4. Octal 5. Carcter Ejemplo 1011B 40D 0E23H 35H 1477Q "ABC" "Dije 'Buenos das' " 'Dije "Buenos das" ' Notas ;la letra "D" es opcional ;no puede empezar con una letra ;puede especificarse "Q" u "O" ;las comillas pueden se simples o dobles ;Lo encerrado entre comillas dobles ;Lo encerrado entre comillas simples Tabla 8. Tipos de constantes. El sufijo que indica el tipo puede ser en mayscula o minscula. Es posible especificar nmeros negativos. Si el nmero es decimal, se precede del signo menos, en caso contrario hay que especificar su complementario: 32 = 00100000B = 20H = 40Q -32 = 11100000B = 0E0H = 340Q Operadores Un operador es un modificador que se usa en el campo de operandos de una sentencia. Se pueden utilizar varios operadores y combinarse entre s en una misma sentencia. Los operadores pueden ser: Aritmticos. Operan sobre valores numricos. Ejemplo de operador "-" (signo menos): DIF DW TAB1-TAB2 ;(despl. de TAB1) - (despl. de TAB2) Operan sobre valores binarios bit a bit. Compara dos valores numricos o dos direcciones de memoria del mismo segmento y producen: 0 (cero) si la relacin es falsa. 0FFFFH si la relacin es verdadera De retorno de valores. Son operadores pasivos que suministran informacin acerca de las variables y los rtulos del programa. De atributos. Permite redefinir el atributo de una variable o de un rtulo. Los atributos para variables de memoria son: BYTE = byte WORD = palabra DWORD = doble palabra TBYTE = diez bytes Los atributos para rtulos son: NEAR = se puede referenciar dentro del mismo segmento FAR = se puede referenciar desde fuera del segmento en el que est definido Lgicos. Relacionales.

17

18

CAPTULO 8 :

ESTRUCTURA DE UN PROGRAMA

TITLE Programa fuente en lenguaje ASSEMBLER. Ejemplo con dos segmentos. No usa Segmento de Datos. ; ; Este programa realiza las siguientes operaciones: ; Guarda en la PILA ( STACK) la direccin de retorno al DOS ; Coloca en el registro BX el valor 18. ; Limpia el contenido del registro BX dejando ceros. ; Finaliza, devolviendo el control al DOS. ; PILA SEGMENT STACK 'STACK' ; Defino el segmento de STACK DB 128 DUP ('Pila') ; Reservo e inicializo el espacio destinado al STACK PILA ENDS ; Finaliza el segmento de STACK CODIGO EJEMPL01 SEGMENT 'CODE' ; Defino el segmento de cdigo llamado "CODIGO" PROC FAR ; Defino el procedimiento "EJEMPL01" como lejano ASSUME CS:CODIGO,SS:PILA ; Asocio registro con segmentos ; ----------------------------------; Instucciones iniciales obligatorias ; ----------------------------------PUSH DS ; Guardo en el STACK el contenido de DS SUB AX,AX ; Resto AX de AX dejandolo en cero PUSH AX ; Muevo ceros al STACK completando DS:00 ; ; ----------------------------------; Cuerpo del programa. ; A partir de aqu empieza a codificarse el programa especfico. ; ----------------------------------; MOV BX,18D ; Muevo el valor inmediato 18 decimal en BX SUB BX,BX ; Resto BX de BX dejndolo en cero ; ; ----------------------------------; Finalizacin del programa devolviendo el control al sistema operativo (DOS) ; ----------------------------------; RET ; Bifurco a CS:00 que saco del STACK regresando al DOS EJEMPL01 ENDP ; Finaliza el procedimiento "EJEMPL01" CODIGO ENDS ; Finaliza el segmento "CODIGO" END EJEMPL01 ; Finaliza el programa con "END" y establezco el procedimiento ; "EJEMPL01" como punto de ingreso al mismo.

Figura 7. Programa ejemplo Nro. 001 Un programa requiere como mnimo de dos segmentos: Uno de cdigo y uno de stack. La directiva SEGMENT sirve para definir un segmento. Cada segmento debe terminar con la sentencia: nombre-seg ENDS En nuestro ejemplo los dos segmentos tienen la misma alineacin PARA y sus clases son 'STACK' y 'CODE' respectivamente. La directiva TITLE indica el ttulo que ser impreso en el listado generado por el compilador. Toda escritura luego de un punto y coma es comentario y se utiliza como documentacin. La directiva (de datos) DB significa define byte y tiene la siguiente forma: [nombre-de-variable] DB expresin En nuestro ejemplo se utiliza para reservar un area de memoria que tendr una longitud de 128*4 bytes=512 bytes en total inicializados con la palabra 'PILA' repetida 128 veces. No se asocia un nombre-de-variable puesto que no se la referenciar con un nombre simblico en la codificacin del programa. La directiva ASSUME sirve para relacionar un registro de segmento a un segmento especfico y tiene el siguiente formato: ASSUME registro-segmento:nombre-segmento, ... En nuestro ejemplo, asociamos el registro CS al segmento "CODIGO" y el registro SS al segmento "PILA".

18

19 El formato de la intruccin SUB es el siguiente: SUB destino,fuente En el ejemplo, en la instruccin "SUB AX,AX" el compilador entiende que se debe restar el contenido de los registros referenciados (direccionamiento de registros) , que al ser el mismo, el resultado ser cero. En la instruccin "MOV BX,18D" sin embargo, se utiliza el direccionamiento inmediato para colocar la constante 18 en base decimal en el registro BX. La instruccin "SUB BX,BX" hace uso nuevamente del direccionamiento de registros, dejando el registro BX en cero. La instruccin "RET" no tiene operandos. Mediante esta instruccin la direccin de retorno al DOS se recupera de la pila y se bifurca a ella, por lo que termina la ejecucin del programa retornando al DOS. Por ltimo se utiliza la directiva END cuyo formato es: END [expresin] La expresin es opcional y sirve para identificar el punto de inicio del programa al tomar el control. Si se tiene un slo procedimiento como en nuestro ejemplo, es necesario mensionarlo, y si un programa est compuesto por varios mdulos fuentes, solo se debe especificar en uno de ellos. TITLE Programa fuente en lenguaje ASSEMBLER. Ejemplo con tres segmentos. ; ; Este programa realiza las siguientes operaciones: ; Guarda en la PILA ( STACK) la direccin de retorno al DOS ; Coloca en los registro AX, BX, CX y DX el valor 18 en decimal. ; Limpia el contenido de los registro cargados dejando ceros. ; Finaliza, devolviendo el control al DOS. ; PILA SEGMENT STACK 'STACK' ; Defino el segmento de STACK DB 64 DUP ('PilaPila') ; Reservo e inicializo el espacio destinado al STACK PILA ENDS ; Finaliza el segmento de STACK DATOS SEGMENT DIEZy8 EQU 18 Dieciocho DW 18 DieciseisMasDos DB DATOS ENDS CODIGO EJEMPL02 ;Defino el segmento de datos ;defino constante dieciocho ;defino palabra inicializada con 18 12h ;defino byte inicializado con 18d ;Finaliza el segmento de datos

SEGMENT 'CODE' ; Defino el segmento de cdigo llamado "CODIGO" PROC FAR ; Defino el procedimiento "EJEMPL01" como lejano ASSUME CS:CODIGO,SS:PILA,DS:DATOS ; Asocio registro con segmentos ; ----------------------------------; Instucciones iniciales obligatorias ; ----------------------------------PUSH DS ; Guardo en el STACK el contenido de DS SUB AX,AX ; Resto AX de AX dejandolo en cero PUSH AX ; Muevo ceros al STACK completando DS:00 MOV AX,DATOS ; Cargo direccin del segm. DATOS en AX. No puedo direccionar en DS directamente MOV DS,AX ; Direcciono el segmendo con su corresp. registro ; ; ----------------------------------; Cuerpo del programa. ; A partir de aqu empieza a codificarse el programa especfico. ; ----------------------------------; Muevo el valor 18d a los registros AX, BX, CX y DX ; MOV AX,18D ; Muevo el valor inmediato 18 decimal en AX MOV BX,DIEZy8 ; Muevo el valor inmediato 18 decimal en BX MOV CX,Dieciocho ; Muevo contenido de la variable "Dieciocho" SUB DX,DX ; ceros en DX MOV DL,DieciseisMasDos ;Muevo contenido de variable con formato byte ; ; Deja en cero los registros cargados SUB AX,AX ; Resto AX de AX MOV BX,0h ; Muevo el valor inmediato cero en hexadecimal MOV CX,BX ; Muevo el contenido de BX en CX. Est condicionado al movim. anterior

19

20 SUB DX,DX ; Resto DX de si mismo ; ; ----------------------------------; Finalizacin del programa devolviendo el control al sistema operativo (DOS) ; ----------------------------------; RET ; Bifurco a CS:00 que saco del STACK regresando al DOS EJEMPL02 ENDP ; Finaliza el procedimiento "EJEMPL01" CODIGO ENDS ; Finaliza el segmento "CODIGO" END EJEMPL02 ; Finaliza el programa con "END" y establezco el procedimiento ; "EJEMPL02" como punto de ingreso al mismo.

Figura 8. Programa ejemplo Nro. 002 Las diferencias entre este programa y el anterior, est en la definicin y uso de variables. Se ha definido un segmento de datos, al que denominamos "DATOS", en dicho segmento hemos definido las diferentes variables que se utilizan en el programa, tambin hemos definido dentro de este segmento, las constantes, pero exclusivamente por una cuestin de orden, puesto que pueden estar definidas en cualquier lugar. La directiva (de datos) DW significa Define Word y tiene la siguiente forma: [nombre-de-variable] DW expresin En este ejemplo la PILA (o STACK) sigue teniendo 512 bytes y est inicializado con el mismo valor que en el ejemplo anterior, pero se ha utilizado una forma levemente diferente En la sentecia ASSUME vemos que se agreg ...,DS:DATOS para asociar el registro DS a nuestro segmento "DATOS" Se ha utilizado diferentes maneras de cargar el valor 18d (diecioco decimal) a los diferentes registros: para AX y BX se ha utilizado el movimiento de un valor inmediato, la diferencia est en que para BX se utiliza el nombre de una constante. Para inicializar CX se mueve el valor contenido en una variable que tiene formato de una palabra (dos bytes). Para DX en cambio, se desea mover el contenido de una variable pero de un byte de longitud, para lo cual, primero ponemos en cero DX y luego cargamos el byte de la izquierda del registro (es decir DL). Para borrar el contenido del registro CX, se est utilizando un movimiento de registro a registro. Como sabemos que BX fue cargado con el valor cero en la instruccin anterior, es ese el valor que estamos cargando aqu. Pero queda claro que esta forma de inicializar est condicionada por lo que movemos al registro BX.

20

21

CAPTULO 9 :

CLASIFICACION DE LAS DIRECTIVAS

Las directivas o pseudo-operaciones se pueden dividir en cuatro grupos funcionales: Directivas de datos Directivas condicionales Directivas de listados Directivas de macros Se detallan a continuacin las directivas bsicas que estn contempladas en la mayora de los compiladores. Dependiendo del compilador ASSEMBLER que se utilize, la presente lista de directivas puede ser mas variada, pero dificilmente se ver reducida. DIRECTIVAS DE DATOS A su vez, se pueden agrupar en las seis categoras siguientes: Directivas de definicin de smbolos Asignan nombres simblicos a expresiones o constantes. Una vez definido el nombre, se lo puede usar en lugar de la expresin equivalente. EQU Asigna un nombre simblico a una expresin fija. No puede cambiar durante la ejecucin. = Asigna un nombre simblico a una expresin variable. Puede cambiar durante la ejecucin. TABSUMA EQU [BP+16] BASNUM = 1980 El nombre TABSUMA y la expresin [BP+16] podrn ser utilizados indistintamente en el programa fuente. Igualmente BASNUM y 1980, pero en este caso, a BASNUM se le podr asignar un valor diferente a 1980 durante la ejecucin del programa. Directivas de definicin de segmentos y procedimientos SEGMENT Indica el inicio de un segmento ENDS Indica la finalizacin de un segmento ASSUME Relaciona registros de segmentos con los segmentos PROC Indica el incio de un procedimiento ENDP Indica la finalizacin de un procedimiento Ejemplos: CODIGO SEGMENT ;inicio del segmento CODIGO PPAL PROC FAR ;inicio del procedimiento PPAL ASSUME CS:CODIGO,SS:PILA,DS:DATOS . . . (instrucciones ... ) PPAL ENDP ;fin del procedimiento PPAL CODIGO ENDS ;fin del segmento CODIGO Directivas de definicin de datos Se utilizan para reservar memoria para las variables del programa y opcionalmente asignar valores iniciales. . DB Define bytes. La longitud de la variable definida es de 1 (un) byte. DW Define palabra. La longitud de la variable definida es de una palabra: 2 bytes. DD Define doble palabra. La long. de la variable definida es de dos palabras: 4 bytes. DQ Define cudruple palabra. Longitud de cuatro palabras: 8 bytes. DT Define diez bytes Ejemplos: DATOS SEGMENT NOMBRE DB 1 ;variable de 1 byte con valor inicial 1 APELLIDO DW 1A03H ;una palabra con valor inicial 1A03H DOMICILIO DD ? ;dos palabras sin inicializar Directivas de control del ensamblador END Fin del mdulo fuente ORIGIN Fin de segmento o fin de estructura Ejemplos:

21

22 EVEN Poner contador de posiciones en nmero par Directiva de referencias externas Hacen referencia a informacin que se ewncuentra en mdulos o ficheros distintos PUBLIC Definir smbolo pblico EXTRN Definir smbolo externo INCLUDE Incluir fichero fuente Directiva de definicin de bloques GROUP Agrupar segmentos NAME Nombre de un mdulo LABEL Asignar un atributo a un nombre RECORD Definir registro STRUC Definir estructura DIRECTIVAS CONDICIONALES Sirven para que el ensamblador incluya o ignore ciertas porciones del programa fuente, segn si una determinada condicin sea cierta o falsa en tiempo de compilacin. La estructura general es: IFxxx [ condicin ] ... ELSE ... ENDIF Ejemplo: . . . PRUEBA = 0 ;inicializa variable PRUEBA ... IF PRUEBA EQ 0 ;si PRUEBA es igual a 0 ... ; sentencias que se incluyen slo si la variable PRUEBA = 0 ENDIF DIRECTIVAS DE LISTADO Indican al compilador la informacin a obtener en el listado de salida y el formato de esta informacin. PAGE Formato de la pgina del listado TITLE Ttulo del listado SUBTTL Subttulo del listado .LALL Listar macros y expansiones .SALL Suprimir el listado de las macros y las expansiones .XALL Listar slo las macros que generan cdigo objeto .XCREF Suprimir referencias cruzadas .CREF Restaurar listado de referencias cruzadas .XLIST Suprimir listado del ensamblador .LIST Restaurar listado del ensamblador COMMENT Comentarios %OUT Emitir mensaje durante el ensamblaje DIRECTIVAS DE MACROS Una macro es un conjunto de sentencias (instrucciones y directivas) que pueden utilizarse varias veces en el programa fuente con algunas modificaciones opcionales cada vez que se utilizan. A cada macro se le asigna un nombre. Especificar este nombre en el programa equivale a la inclusin del conjunto de instrucciones. Directivas de definicin de macros MACRO Comienzo de una macro ENDM Fin de una macro LOCAL Define etiquetas dentro de una macro EXITM Terminar expansin de la macro PURGE Borrar las macros de la memoria REPT Repetir bloque de sentencias un cierto nmero de veces IRP Repetir bloque de sentencias con un valor cada vez IRPC Repetir bloque de sentencias con un carcter cada vez Operadores de macros

22

23 & ;; ! % Concatenar textos o smbolos Comentarios que no aparecen en la expresin Interpretar carcter en sentido literal Convertir una expresin en un nmero

23

24

CAPTULO 10 :

CLASIFICACIN DE LOS OPERADORES

OPERADORES ARITMETICOS
Operador + * / MOD (mdulo) SHL (SHift Left) SHR (SHift Right) Formato valor1 + valor2 valor1 - valor2 valor1 * valor2 valor1 / valor2 valor1 MOD valor2 valor SHL expresin valor SHR expresin Funcin suma valor1 y valor2 resta valor2 de valor1 multiplica valor2 por valor1 divide y retorna el cociente divide y retorna el resto desplaza a la izquierda "valor" el nro de bits que indica "expresin" desplaza a la derecha "valor" el nro de bits que indica "expresin"

Ejemplos.Para los ejemplos, MASCARA es una constante definida de la sig. manera: MASCARA EQU 110010B ; se asigna a MASCARA el valor 110010B Operador Ejemplo Valor calculado + TABLA_MAS_2 DW TABLA+2 ;(desplazamiento de TABLA) + 2 DIF DW TAB1-TAB2 ;(despl. de TAB1) - (despl. de TAB2) * MINS_DIA EQU 60*24 ; el valor de MINS_DIA ser 1440 / PI_COCIEN EQU 31416/10000 ; el valor de PI_COCIEN ser 3 MOD PI_RESTO EQU 31416 MOD 10000 ; el valor de PI_RESTO ser 1416 SHL MASC_IZQ_2 EQU MASCARA SHL 2 ; el valor ser 11001000B SHR MASC_DER_2 EQU MASCARA SHR 2 ; el valor ser 1100B

OPERADORES LOGICOS
Operador AND AND OR OR XOR XOR NOT NOT Ejemplo BIN EQU 00110100B AND 11010111B HEX EQU 34H AND 0D7 BIN EQU 00110100B OR 11010111B HEX EQU 34H OR 0D7H BIN EQU 00110100B XOR 11010111B HEX EQU 34H XOR 0D7H BIN EQU NOT 00110100B HEX EQU NOT 34H Valor calculado ; 00010100B ; 14H ; 11110111B ; F7H ; 11100011B ; E3H ; 11001011B ; CBH

OPERADORES RELACIONALES
* Para los ejemplos consideramos que se ha definido: VALOR EQU 20 Operador EQ (igual) NE (no igual) LT (menor) GT (mayor) LE (menor o igual) GE (mayor o igual) Ejemplo MOV AX,VALOR MOV AX,VALOR MOV AX,VALOR MOV AX,VALOR MOV AX,VALOR MOV AX,VALOR EQ 20 NE 20 LT 20 GT 20 LE 20 GE 20 Equivale a ; MOV AX,0FFFFH ; MOV AX,0 ; MOV AX,0 ; MOV AX,0 ; MOV AX,0FFFFH ; MOV AX,0FFFFH ; MOV AX,5

Se pueden combinar operadores. Ejemplo:

MOV AX,((VALOR GE 20) AND 5)

OPERADORES DE RETORNO DE VALORES


Operador SEG OFFSET TYPE SIZE LENGTH MASK Formato SEG etiqueta OFFSET etiqueta TYPE etiqueta SIZE variable LENGTH variable MASK variable Devuelve El valor del segmento de la etiqueta El valor del desplazamiento de la etiqueta. Ejemplo: MOV AX, OFFSET MiVariable ; deja en AX el desplazamiento de MiVariable Si la etiqueta es una variable, devuelve: 1 si est definida como byte. 2 si palabra. 4 si doble palabra. 8 si cudruple palabra. 10 si est definida como decabyte. Si la etiqueta es un rtulo, devuelve: -1 = 0FFFFh si es NEAR. -2 = 0FFFEh si es FAR El nro de bytes reservados de "variable" Slo se aplica a variables definidas con DUP Nro. de unidades (bytes o palab.) de "variable".Se aplica a var. def. con DUP La conf.en bits del reg.al que pertenece "variable", con 1 en los bits del cpo especificado

Ejemplos: Para los ejemplos, NRO es una variable definida de la siguiente manera: NRO DW 20 DUP(0) ; 20 palabras inicializadas con cero Asimismo, se define REGIS como una estructura de bits con los campos:

24

25 REGIS RECORD A:3,B:1,C:2,D:4,E:6 Operador SEG OFFSET TYPE SIZE LENGTH MASK Ejemplo MOV AX,SEG NRO MOV AX,OFFSET NRO MOV AX,TYPE NRO MOV AX,SIZE NRO MOV AX,LENGTH NRO MOV AX,MASK C El valor de AX ser ; el segmento de NRO ; el desplazamiento de NRO ;2 ; 40 ; 20 ; 0000110000000000B

OPERADORES DE ATRIBUTOS
Operador PTR (pointer) DS:,ES:,SS: SHORT $ (signo pesos) HIGH LOW Formato atributo PTR expresin Reg_segmento:etiqueta Reg_segmento:variable Reg_segmento:expresin JMP SHORT etiqueta $ HIGH valor HIGH expresin LOW valor LOW expresin Funcin Asigna a "expresin" un nuevo "atributo" : BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR sustituye el atributo de segmento de una etiqueta o de una variable o de una expresin de direccin Indica al compilador que la etiqueta se encuentra entre -128 y +127 bytes de la instruccin Nos referimos al contador de posiciones Devuelve el byte superior de un valor numrico de 16 bits expresin de direccin. Devuelve el byte inferior de un valor numrico de 16 bits expresin de direccin. ; reserva 100 palabras ; asigna un nombre al primer byte de TABLA ; asigna un nombre al quinto byte de TABLA ; reserva memoria y la inicializa ; A LONG se le asigna la longitud de la var. TEXTO puesto que "$", por su ubicacin, apunta a la posicion sig. de TEXTO

Ejemplo 1 (operadores PTR y $): TABLA DW 100 DUP(?) PRIMER_B EQU BYTE PTR TABLA QUINTO_B EQU BYTE PTR TABLA+4 TEXTO DB 'ESTO ES UN TEXTO' LONG EQU $ - TEXTO Ejemplo 2 ( operadores PTR, SHORT y $ ): Primer segmento de cdigo:

EMPEZAR: MOV AX,100 ; la etiqueta es NEAR (los dos puntos lo indican) ... JMP SHORT EMPEZAR; bifurca al rtulo EMPEZAR (rango -128 +127 bytes) JMP EMPEZAR ; bifurcar al rtulo EMPEZAR en el mismo segmento ... Segundo segmento de cdigo: LEJANO EQU FAR PTR EMPEZAR ; asigna a LEJANO la direccin de EMPEZAR pero con ; el atributo FAR porque est en otro segmento

... JMP LEJANO ; bifurca al rtulo EMPEZAR del otro segmento ... JE $+5 ; bifurca si igual (ZF = 1) a la direccin de IP + 5 ... Ejemplo 3 ( operadores HIGH, LOW y ES:): CONST EQU MOV MOV MOV

0ABCDh AL,HIGH CONST ; equivale a MOV AL,0ABh AH,LOW CONST ; equivale a MOV AH,0CDh AX,ES:[BP] ; el ES sustituye al SS que se asumira por defecto

25

26

CAPTULO 11:

INSTRUCCIONES

Instrucciones de transferencia de control Instruccin JMP desplazamiento Jxxx desplazamiento CALL destino LOOP desplazamiento LOOPE desplazam. LOOPZ desplazam. LOOPNE desplazam. LOOPNZ desplazam. RET Propsito Bifurcacin incondicional Bifurcacin condicional Llamar a un procedimiento Bucle hasta que acabe contador Bucle mientras igual y CX <> 0 Bucle mientras cero y CX <> 0 Bucle mientras no igual y CX <> 0 Bucle mientras no cero y CX <> 0 retornar de un procedimiento Comentarios "xxx" es condicin a cumplir contador = CX ambas instrucciones generan el mismo cdigo ambas instrucciones generan el mismo cdigo

JMP desplazamiento Bifurcacin incondicional. La instruccin JMP transfiere el control del programa a una instruccin diferente sin almacenar ninguna informacin de vuelta. JMP puede bifurcar: - Dentro del mismo segmento. En este caso, IP se sustituye por el valor del desplazamiento de la instruccin referenciada. El desplazamiento puede estar hasta de 32 KBytes. - A distinto segmento. En este caso CS e IP se sustituyen por los valores correspondientes a la instruccin referenciada. La instruccin tambin puede ser: Directa, es decir, especificando una etiqueta. Indirecta, es decir, especificando una direccin. Ejemplo: SALTO1 DW LABEL1 ;desplazamiento de LABEL1 SALTO2 DD LABEL2 ;segmento y desplazamiento de LABEL2 ... JMP ETIQUETA ; bifurcacin directa a ETIQUETA JMP [BX] ; bifurcacin indirecta al desplazamiento contenido en BX JMP SALTO1 ;indirecta a LABEL1 del mismo segmento JMP SALTO2 ;indirecta a LABEL2 de otro segmento ... Jxxx desplazamiento Bifurcacin (salto) corto si se encuentra condicin. "xxx" es la condicin que se debe cumplir para transferir en control (Bifurcar o Saltar) a la instruccin que est direccionada por (IP + desplazam.) . Las bifurcaciones condicionales cortas testean los sealizadores (o banderas). El operando de condicin (desplazamiento) debe estar entre -128 y +127 bytes (etiquetas corta o NEAR) de la sig. instruc. Esta restriccin es necesaria para que el compilador construya un desplazam. con signo de 1 byte. Instruc JA JNBE JAE JNB JB JNAE JC JBE JNA JCXZ JE JZ JG JNLE Bifurcar (o saltar) si: por arriba de (above) / no por debajo (not below) o es igual (equal) por arriba o es igual/ si no por debajo por debajo/ si, no por arriba y no es igual/ si existe acarreo inferior o igual/ si no superior CX es cero igual (equal) / si cero (zero) mayor (greater) / si no es menor ni igual Descripcin y estado de las banderas que se verifican para que ocurra el salto Se emplean las banderas de acarreo (CF) y cero (ZF). Si cualquiera de ellas o ambas estn activas no efecta el salto. Ejemplo: se comparan dos operandos que llamaremos destino y fuente, si el destino es mayor que el fuente (por arriba de), CF = ZF = 0 , entonces occurre el salto. Es similar a JA con exepcin de que slo se verifica la bandera de acarreo (CF). Si se lleva a cabo, por ejemplo, una comparacin previa y el operando destino es mayor que o igual al fuente (por arriba o igual), CF = 0, entonces ocurre el salto. El comportamiento es opuesto al de JAE. Si la bandera de acarreo est activa, ocurrir un salto. SI se lleva a cabo un comparacin y el operando destino es menor que el fuente (por debajo de). Entonces CF = 1 y ocurre el salto. Si CF = 1 ZF = 1 ocurre el salto. Si CF = 0 y ZF = 0 no ocurre el salto. Si CX = 0 ocurre el salto Si ZF = 1 ocurre el salto Si ZF = 0 y SF = OF ocurre el salto. Si ZF = 1 SF <> OF no ocurre el salto

26

27 JGE JNL JL JNGE JLE JNG JNC JNE JNZ JNO JNP JPO JNS JO JP JPE JS es mayor o igual / si no es menor es menor (less) / si no es mayor ni igual es menor o igual / si no es mayor no hay acarreo no igual / si no cero no desbordamiento (not overflow) no paridad / si paridad impar no signo o si es positivo hay desbordamiento (overflow) paridad / si paridad par si signo (negativo) SF = OF SF <> OF ZF = 1 SF <> OF CF = 0 ZF = 0 OF = 0 PF = 0 SF = 0 OF = 1 PF = 1 SF = 1

En el cuadro anterior, se han agrupado en un mismo rengln, todas aquellas instrucciones de bifurcacin que producen el mismo cdigo de mquina luego de ser decodificada. Ejemplo: JB, JNAE y JC. Banderas OF DF IF TF SF ZF AF PF CF desbordamiento direccin activar interrupcin atrape signo cero auxiliar paridad acarreo overflow direction interrupt enable trap sign zero auxiliar parity carry 11 10 9 8 7 6 4 2 0

La instruccin de bifurcacin condicional, se utiliza normalmente luego de una operacin matemtica (averiguar resultado en cero, negativo, etc) o luego de una instruccin de comparacin (CMP) Para preguntas que se refieran a la relacin entre dos valores sin signo se utilizan: ABOVE (por encima de ..., si superior que ...) y BELOW (por debajo de ..., si inferior que ...) Para preguntas que se refieran a la relacin entre dos valores con signo se utilizan: GREATER (Mayor que ...) y LESS ( Menor que ...) Para bifurcar si destino < fuente destino = fuente destino > fuente destino <= fuente destino => fuente destino <> fuente Para nro. sin signo utilizar: JB JE JA JBE JAE JNE Nro. con signo utilizar: JL JE JG JLE JGE JNE

CALL destino Llamar a un procedimiento. Bifurca a un procedimiento, salvando previamente en la pila la direccin de la instruccin siguiente, para poder volver a sta una vez ejecutado el procedimiento. El procedimiento llamado puede estar: - en el mismo segmento (llamada NEAR). En este caso se almacena en la PILA (STACK) slo el desplazamiento de la instruccin siguiente al CALL. - en otro segmento (llamada FAR). En este caso, se almacenan en la PILA, primero el segmento y luego el desplazamiento de la instruccin siguiente al CALL. La llamada puede ser, a su vez: - directa, es decir, a etiquetas relativas a CS. Se supone siempre NEAR salvo que se especifique FAR en la declaracin del destino.

27

28 - indirecta, es decir, a variables, pudiendo especificarse WORD PTR DWORD PTR para llamadas NEAR y FAR respectivamente. Si se especifica una variable tipo WORD, el contenido de esa variable es el nuevo desplazamiento (direccin). Si se especifica una DWORD, la primer palabra contiene el desplazamiento y la segunda el segmento. Tambin se pueden usar registros de 16 bits entre corchetes. Para retornar de un procedimiento se utiliza la instruccin RET. Lgica si bifurca a distinto segmento (FAR) SP = SP - 2 CS se guarda en el STACK ; segmento para retornar CS = Segmento de destino ; nueva direccin de segmento SP = SP - 2 IP se guarda en el STACK ; desplazamiento para retornar IP = desplazamiento de destino Lgica si bifurca al mismo segmento (NEAR) SP = SP - 2 IP se guarda en el STACK ; desplazamiento para retornar IP = desplazamiento de destino Ejemplo: CALL PROC1 ; llamada directa CALL WORD PTR VARIABLE_PALABRA ;llamada indirecta CALL DWORD PTR [BX] ; llamada FAR indirecta LOOP desplazamiento La instruccin decrementa CX en 1 (uno). Si CX es distinto de cero, entonces IP = IP + desplazamiento (bifurca a desplazamiento). Si CX es cero, ejecuta la siguiente instruccin a LOOP .... El desplazamiento debe estar entre -128 y +127 bytes de esta instruccin (1 byte). Mediante esta instruccin es posible implementar bucles, es decir una serie de instrucciones que se ejecutan una serie de veces. El esquema es el sig.: Ejemplo 1: MOV CX,contador ; CX = nro. de veces que se va a ejecutar BUCLE BUCLE: ... ... LOOP BUCLE ; CX = CX - 1 y bifurca a BUCLE si CX distinto de cero Ejemplo 2: implementacin de bucles anidados : MOV CX,contador1 ; CX = nro. de veces que se va a ejecutar BUCLE1 BUCLE1: ... ... PUSH CX ; salva CX MOV CX,contador2 ; veces que se ejecutar BUCLE2 BUCLE2: ... ... LOOP BUCLE2 ; CX = CX - 1 y bifurca a BUCLE2 si CX distinto de cero POP CX ; recupera CX ... LOOP BUCLE1 ; CX = CX - 1 y bifurca a BUCLE1 si CX distinto de cero Ejemplo 3: ; calculo de la suma de los nmeros del 1 al 10 MOV AX,0 ; inicializa AX que contendr el resultado MOV CX,10 ; repetir el bucle 10 (diez) veces SUMA: ADD AX,CX ; AX = AX + CX LOOP SUMA Ejemplo 4: ; Colocar los valores 254 a 263 (ambos inclusives) en el STACK. Luego sacarlos. MOV BX,254 ; BX primer valor MOV CX,10 ; son 10 valores PONER: PUSH BX ; coloca el valor en la PILA INC BX ; BX = BX + 1 LOOP PONER ; CX = CX - 1 y si CX <> 0 va a PONER ... ; MOV CX,10 ; sacar 10 valores SACAR: POP AX ; saca el valor de la PILA sobre AX ... ; LOOP SACAR ; CX = CX - 1 y si CX <> 0 va a SACAR LOOPE desplazamiento = LOOPZ desplazamiento

28

29 Bifurcar mientras igual o mientras cero. La instruccin decrementa CX en 1 (uno). Si CX es distinto de cero y ZF = 1 (zero flag on), entonces bifurca a desplazamiento. Si ZF=0 CX = 0 ejecuta la instruccin siguiente al LOOPE ( LOOPZ). Ejemplo: ; encontrar el primer valor distinto de cero en una tabla de bytes (TABLA) MOV SI,-1 ; valor inicial del ndice MOV CX,LENGTH TABLA ; CX = longitud de la TABLA BUSCA: INC SI ; incrementa el ndice CMP TABLA[SI],0 ; compar el byte con cero LOOPE BUSCA la ltima instruccin es equivalente a: JNE FIN LOOP BUSCA FIN: ... LOOPNE desplazamiento = LOOPNZ desplazamiento Bifurcar mientras no igual o mientras no cero. La instruccin decrementa CX en 1 (uno). Si CX es distinto de cero y ZF = 0 (zero flag off), entonces bifurca a desplazamiento. Si ZF=1 CX = 0 ejecuta la instruccin siguiente. Ejemplo: ; encontrar el primer valor cero en una tabla de bytes (TABLA) MOV SI,-1 ; valor inicial del ndice MOV CX,LENGTH TABLA ; CX = longitud de la TABLA BUSCA: INC SI ; incrementa el ndice CMP TABLA[SI],0 ; compar el byte con cero LOOPNE BUSCA la ltima instruccin es equivalente a: JE FIN LOOP BUSCA FIN: ... RET [valor] Retorna de un procedimiento, previamente invocado mediante un CALL, utilizando como direccin de retorno la direccin salvada en la PILA por el CALL (y que corresponder a la instruccin siguiente a dicha sentencia CALL). El compilador genera un retorno distinto, segn se haya definido el procedimiento: - Procedimiento definido como NEAR: en este caso, se quita de la PILA una palabra, que corresponde al desplazamiento de la direccin de retorno (reemplazar IP). Se genera un retorno dentro del mismo segmento. - Procedimiento definido como FAR: en este caso se quitan de la PILA dos palabras, que corresponden al desplazamiento (primera palabra) y al segmento (segunda palabra) de la direccin de retorno (reemplazar CS e IP). Se genera un retorno a un segmento distinto. El val opcional de RET es el valor que se desea que se sume a SP con la finalidad de descartar parmetros. CMP destino,fuente Comparar dos operandos. La instruccin resta el operando fuente del operando destino (destino - fuente) , sin modificar los operandos ni retornando el resultado, pero las banderas se actualizan, pudiendose consultar luego con una instruccin de bifurcacin condicional. Los operandos pueden ser del tipo byte o palabra, pero ambos del mismo tipo. ejemplo: CMP AX,BX ;compara AX con BX JL AXMENOR ;bifurca a AXMENOR si AX es menor a BX tipos de operandos destino reg reg mem reg mem fuente reg mem reg val val ejemplos CMP BL,CL CMP BX,CX CMP BL,MIBYTE CMP BX,UNAPALABRA CMP MIBYTE,BL CMP UNAPALABRA,BX CMP BL,30H CMP CX,20H CMP MIBYTE,01H CMP UNAPALABRA,0201H

Referencia: reg = registro de 8 16 bits

29

30 mem = variable de memoria de 8 16 bits val = valor inmediato de 8 16 bits Instrucciones de control No tienen operandos. Instruccin CLC CLD CLI CMC STC STD STI NOP Propsito limpia bandera de acarreo limpia bandera de direccin limpia bandera de interrupcin complementa bandera de acarreo activa bandera de acarreo activa bandera de direccin activa bandera de interrupcin no operacin Comentarios CF = 0 DF = 0 IF = 0. Deshabilita las interrupciones enmascarables si CF=0 entonces hace CF=1 y si CF=1 entonces CF=0 CF = 1 DF = 1 IF = 1. Habilita las interrupciones enmascarables El procesador no hace nada. Pasa a ejecutar la sig. instruccin

Instrucciones de transferencias de datos Mueven informacin entre registros y posiciones de memoria Grupo de instrucciones del STACK (PILA) Instruccin Propsito Comentarios POP destino saca una palabra del STACK transfiere la palabra direccionada por SS:SP (en el STACK, el elemento y la coloca en destino activo), al operando destino. Una vez hecho esto, incrementa en dos (long. de una palabra), al registro SP POPF saca las banderas del transfiere desde SS:SP los bits correspondientes al registro de banderas (flags). STACK luego incrementa en 2 a SP. PUSH fuente coloca una palabra en el primero decrementa en 2 -dos- SP y despus transfiere la palabra del operando STACK fuente a SS:SP PUSHF coloca banderas en el decrementa en 2 SP y despus transfiere el registro de banderas a SS:SP STACK Notas: CS no puede ser fuente ni destino Ejemplos: PUSH AX ; transfiere el contenido de AX a la PILA PUSH MIVARIABLE ; transfiere contenido de MIVARIABLE a la PILA POP AX ; carga AX con el elemento activo de la PILA POP MIVARIABLE ; coloca en MIVARIABLE el elemento activo de la PILA De propsito general Instruccin Propsito LAHF cargar reg. AH con las banderas SAHF almacenar AH en banderas LEA destino,fuente cargar direccin efectiva MOV destino,fuente mover Comentarios copia SF,ZF,AF,PF y CF en el reg. AH. El resto de los bits no toca copia SF,ZF,AF,PF y CF de AH al reg de banderas. El resto no toca carga el desplazam. del oper. fuente (operando de mem.) en un reg. (16 bits) de destino. El destino no puede ser un reg. de segm. En el oper. fuente puede especif. un ndice. Ej. SI hace destino = fuente. Transfiere 1 byte o 1 palabra desde el oper. fuente al de destino. El destino puede ser reg. o mem. y fuente puede ser reg., mem. o val. Ambos operandos deben ser del mismo tipo. CS no puede ser destino. intercambia el contenido entre los dos operandos (byte o palabra). No puede utilizarce reg. de segmentos.

XCHG destino,fuente

intercambiar dos operandos

Ejemplos: AX = 1234h y BX = 5678h UnByte y MiByte son dos variables definidas de un byte de longitud. UnaPalabra y MiPalabra son dos variables definidas de una palabra de longitud. XCHG AX,BX ; AX=5678h y BX=1234h XCHG BL,CH reg,reg XCHG BL,UnByte reg,mem XCHG UnaPalabra,CX mem,reg MOV AX,BX MOV MiByte,01h MOV UnaPalabra,3420h ; AX = BX = 5678h ;

30

31 Para mover entre dos elementos de memoria, ejemplo UnByte a MiByte se debe hacer lo sig.: MOV AL,UnByte MOV MiByte,AL Para mover un valor inmediato a un registro de segmento debemos: MOV AX,112h MOV ES,AX Instrucciones aritmticas Realizan operaciones aritmticas sobre nmeros binarios o BCD (decimal codificado en binario) Instruccin Propsito Comentarios DEC destino decrementar destino en uno resta 1 al contenido de destino y deja el resultado en destino INC destino incrementar destino en uno suma 1 al contenido de destino y deja el resultado en destino Ejemplo: si AX = 1234h INC AX ; produce AX = AX + 1 = 1235h El destino puede ser registro de 8 o 16 bits una variable de un byte o palabra. Instruccin AAA AAS ADD destino,fuente ADC destino,fuente SUB destino,fuente SBB destino,fuente CBW Propsito ajuste ASCII en suma ajuste ASCII en resta sumar sin acarreo sumar con acarreo restar sin acarreo restar con acarreo convertir byte en palabra. Sin operandos porque trabaja sobre AX (AH y AL) Comentarios en suma decimal desempaquetado.

CWD DIV fuente IDIV fuente MUL fuente IMUL fuente

destino=destino+fuente.byte o palabra. ambos del mismo tipo. destino=destino+fuente. byte o palabra destino=destino-fuente. byte o palabra destino=destino-fuente. byte o palabra Copia el bit 7 de AL en AH (expande el signo) Si AL es menor que 80h entonces AH = 00h, caso cont. AH=FFh Ej.: ;si AL=C2h, luego de CBW ; AX = FFC2h. Si AL=51h, luego de CBW ; AX=0051h convertir palabra a doble palabra Copia el bit 15 de AX sobre DX (expande el signo). sin operand. trabaja con DX,AX Si AX < 8000h DX = 0000h, caso contrario DX = FFFFh dividir sin considerar el signo fuente es el divisor. Puede ser byte o palabra dividir considerando el signo fuente es el divisor. Puede ser byte o palabra multiplicar sin considerar signo Multiplica, sin considerar el signo, AL AX por el operando fuente. multiplicar considerando el signo Multiplica, considerando el signo, AL AX por el operando fuente.

MUL fuente Multiplica fuente por AL AX sin considerar el signo. Si fuente es byte multiplica fuente por AL y el resultado queda en AX. Si fuente es palabra multiplica fuente por AX y el resultado queda en DX,AX en ese orden En ambos casos si la mitad superior del resultado (AH o DX respectivamente) no es cero, se activan CF = OF = 1 (uno) para indicar que hay dgitos significativos, caso contrario CF=OF=0 (cero). Ejemplo 1: AL=64h ; = 100d BL=02h ; = 2d MUL BL ; AX=00C8h ; = 200d y CF = OF = 0 Ejemplo 2: AX=1234h MiPalabra DW 00f1h ; variable de memoria MUL MiPalabra ; DX,AX = 0011h,22f4h y CF = OF = 1 IMUL fuente Multiplica fuente por AL AX considerando el signo. Si fuente es byte, lo multiplica por AL y el resultado queda en AX Si fuente es palabra, lo multiplica por AX y el resultado queda en DX,AX Si la mitad superior del resultado (AH o DX respectivamente) no es la expansin del signo, y tiene digitos significativos, CF = OF = 1 (uno) Ejemplo 1: AL=FEh = -2 (menos dos) BL=12h = 18 IMUL BL ; AX = FFDCh = -36 (menos 36) y CF = OF = 0 Ejemplo 2: AX=FFFEh = -2 (menos dos) MiPalabra DW 0012h ; variable de memoria = 18 IMUL MiPalabra ; DX,AX = FFFFh,FFDCh y CF = OF = 0 ADD destino,fuente

31

32 Suma los contenidos de fuente y destino, dejando el resultado en destino. destino = destino + fuente. Pueden ser byte o palabra, pero ambos del mismo tipo. Ejemplo: AL = FEh BL = 12h ADD AL,BL ; AL = 10h (se modifica) y BL=12h (no modif.) Tipos de operandos: ADD BL,CL ; reg,reg ADD BX,MEM_PAL ; reg,variable-de-memoria ADD MEM_BYTE,AL ; variable,reg ADD AX,10h ; reg,valor ADD MEM_PAL,20h ; mem,valor AAA Ajuste ASCII en suma. Sin operandos. Corrige el resultado en AL de una suma de dos nros. decimales desempaquetados, convirtiendolos en un valor decimal desempaquetado. Lgica: Si bit 3 a 0 de AL > 9 AF = 1, entonces: AL = AL + 6 AH = AH + 1 AF = CF = 1 y bit 7 a 4 de AL = 0000b Ejemplo 1: ;AL=08h; AH=00h; BL=06h ADD AL,BL ; AL = 0Eh; BL=06; AF=0 AAA ; AX = 0104h; BL=06; AF=CF=1 Ejemplo 2: ;AL=08h AH=00h BL=09h ADD AL,BL ; AL=11h BL=09h AF=1 AAA ; AX=0107h BL=09h AF=CF=1 AAS Ajuste ASCII en resta. Sin operandos. Corrige el resultado en AL de una resta de dos nros. decimales desempaquetados, convirtiendolos en un valor decimal desempaquetado. Lgica: Si bit 3 a 0 de AL > 9 AF = 1, entonces: AL = AL - 6 AH = AH - 1 AF = CF = 1 y bit 7 a 4 de AL = 0000b Ejemplo 1: ;AL=08h; AH=00h; BL=06h SUB AL,BL ; AL = 02h; BL=06; AF=0 AAS ; AX = 0002h; BL=06; AF=CF=0 Ejemplo 2: ;AL=08h AH=01h BL=09h SUB AL,BL ; AL=FFh BL=09h AF=1 AAS ; AX=0009h BL=09h AF=CF=1 ADC destino,fuente Suma los contenidos de fuente y destino, dejando el resultado en destino y luego suma 1 (uno) a destino si est activada la bandera de acarreo destino = destino + fuente; y si CF = 1 destino = destino + 1 Los operandos pueden ser byte o palabra, pero ambos del mismo tipo. Ejemplo: AL = FEh; BL = 12h y CF = 1 ADC AL,BL ; AL = 11h (se modifica) y BL=12h (no modif.) Ejemplo 2: ; sumamos numeros de 32 bits ; fuente en DX,CX y destino en BX,AX ADD AX,CX ; suma las palabras inferiores ADC BX,DX ; sumar la palabras superiores con acarreo Tipos de operandos: idem ADD DAA Ajuste decimal para la suma. Sin operandos. Corrige el resultado en AL de una suma de dos nros. decimales empaquetados, convirtiendolos en un valor decimal empaquetado. Lgica: Si bit 3 a 0 de AL > 9 AF = 1, entonces: AL = AL + 6 AF = 1 si AL > 9Fh CF = 1

32

33 AL = AL + 60h CF = 1 Ejemplo 1: Ejemplo 2: ;AL=68h; AH=00h; BL=17h ADD AL,BL ; AL = 7Fh; BL=17h; AF=0 DAA ; AL = 85h; BL=17h; AF=1 ;AL=61h AH=00h BL=57h ADD AL,BL ; AL=B8h BL=57h AF=0 DAA ; AL=18h BL=57h CF=1

DAS Ajuste decimal para la resta. Sin operandos. Corrige el resultado en AL de una resta de dos nros. decimales empaquetados, convirtiendolos en un valor decimal empaquetado. Lgica: Si bit 3 a 0 de AL > 9 AF = 1, entonces: AL = AL - 6 AF = 1 si AL > 9Fh CF = 1 AL = AL - 60h CF = 1 Ejemplo 1: Ejemplo 2: ;AL=68h; AH=00h; BL=19h SUB AL,BL ; AL = 4Fh; BL=19h; AF=0 DAS ; AL = 49h; BL=19h; AF=1 ;AL=57h AH=00h BL=68h SUB AL,BL ; AL=EFh BL=68h AF=0 DAS ; AL=89h BL=68h CF=1

SUB destino,fuente Resta los contenidos de fuente y destino, dejando el resultado en destino. destino = destino - fuente. Pueden ser byte o palabra, pero ambos del mismo tipo. Ejemplo: AL = FEh BL = 12h SUB AL,BL ; AL = ECh (se modifica) y BL=12h (no modif.) Tipos de operandos: idem ADD SBB destino,fuente Resta los contenidos de fuente y destino, con acarreo, dejando el resultado en destino. Pueden ser byte o palabra, pero ambos del mismo tipo. Tipos de operandos: idem SUB lgica: destino = destino - fuente. y si CF = 1 destino = destino - 1 Ejemplo: AL = FEh; BL = 12h; CF=1 SBB AL,BL ; AL = EBh (se modifica) y BL=12h (no modif.) Ejemplo 2: restar dos nros. de 32 bits fuente DX,CX (palabra sup. e inf.) destino BX,AX ( palabra sup. e inf.) SUB AX,CX ; resta palabras inferiores SBB BX,DX ; resta palabras superiores con acarreo DIV fuente Divide, sin considerar el signo. El operando fuente puede ser una variable de mem o un reg, de un byte o una palabra. Si el operando fuente es del tipo byte: Divide el nro. contenido en AX por el nro. contenido en fuente. El cociente se almacena en AL y el resto en AH. Si el operando fuente es del tipo palabra: Divide el nro. contenido en DX,AX por el nro. contenido en fuente. El cociente se almacena en AX y el resto en DX. Si el cociente es mayor al valor mximo que puede almacenar (FFh FFFFh segn el fuente), el resultado queda indefinido y se produce una interrupcin tipo cero. Si el resto no es cero, se activan CF y OF indicando esta situacin. Ejemplo 1: ; AX = 0013h = 19 (dividendo);

33

34 ; BL = 02h DIV BL Ejemplo 2: = 2 (divisor) ;AX = 0109h (resultado) y BL=02h (sin modif.) ;AH = 01h (resto) y AL = 09h (cociente) ; DX,AX = 0000 0013h = 19d (dividendo) ; BX = 0002h (divisor); DX = 0000h ; AX = 0013h ; DIV BX ; DX,AX = 0001 0009h (resultado); BX=0002h (sin modif.) ; DX = 0001h (resto) ; AX = 0009h (cociente)

IDIV fuente Divide, considerando el signo. El oper fuente puede ser una variable de mem o un registro, de un byte o una palabra. Si el operando fuente es del tipo byte: Divide el nro. contenido en AX por el nro. contenido en fuente. El cociente se almacena en AL y el resto en AH. Si el operando fuente es del tipo palabra: Divide el nro. contenido en DX,AX por el nro. contenido en fuente. El cociente se almacena en AX y el resto en DX. Si el cociente es positivo y mayor al valor mximo que puede almacenar (7Fh = 127 7FFFh = 32767 segn el fuente), o si el cociente es negativo e inferior al valor mnimo que puede almacenarse (81h = 127 u 8001h = 32767 segn el fuente) el resultado queda indefinido y se produce una interrupcin tipo cero. Ejemplo 1: ; AX = FFEDh = -19 (dividendo negativo); ; BL = 02h = 2 (divisor) IDIV BL ;AX = 01F7h (resultado) y BL=02h (sin modif.) ;AH = 01h (resto) y AL = F7h (cociente negativo) Ejemplo 2: ; DX,AX = FFFF FFEDh = -19d (dividendo negativo) ; BX = 0002h (divisor); DX = FFFFh ; AX = FFEDh ; IDIV BX ; DX,AX = 0001 FFF7h (resultado); BX=0002h (sin modif.) ; DX = 0001h (resto) ; AX = FFF7h (cociente negativo) NEG destino Calcula el valor negativo del operando, es decir, resta el operando de cero y devuelve el resultado en el mismo operando (byte o palabra). Es decir que se calcula el complemento a 2 del destino. Hacer NEG destino ; equivale a hacer NOT destino ; y luego INC destino Lgica si destino es tipo byte: destino = FFh - destino destino = destino + 1 si destino es tipo palabra: destino = FFFFh - destino destino = destino + 1 Ejemplo: ; FFh = 1111 1111b ;AL = F2h = 1111 0010b ; ___________ ; 0Dh = 0000 1101b ; + 1b ; ___________ NEG AL ; ;AL= 0Eh = 0000 1110b Instrucciones de manejo de bits Instruccin AND destino,fuente Propsito Y lgico Combinaciones posibles 0-0=0 0-1=0 1-0=0 1-1=1 0-0=0 0-1=1 1-0=1 1-1=1 0-0=0 0-1=1 1-0=1 1-1=0

NOT destino OR destino,fuente

No lgico O lgico inclusivo

XOR destino,fuente

O lgico exclusivo

34

35

AND destino,fuente Operacin "y lgica" a nivel de bit entre los dos operandos. El resultado se almacena en destino. Tipos de operandos: ver instruccin OR Ejemplo: ; AX = FEDCh = 1111 1110 1101 1100b ;BX = 1234h = 0001 0010 0011 0100b AND AX,BX ; AX = 1214h ; BX = 1234h NOT destino Cambia los bits unos por cero y los bits ceros por unos. Devuelve el resultado en el mismo operando (byte o palabra). El destino puede ser variable de memoria o un registro. Si destino es byte hace: destino = FFh - destino Si destino es palabra hace: destino = FFFFh - destino Ejemplo: ; AL = F2h = 11110010b NOT AL ; AL = 0Dh = 00001101b OR destino,fuente Operacin "o lgico inclusivo" a nivel de bit entre los dos operandos. El resultado se almacena en destino. Ejemplo: ; AX = FEDCh = 1111 1110 1101 1100b ;BX = 1234h = 0001 0010 0011 0100b OR AX,BX ; AX = FEFCh ; BX = 1234h tipos de operandos destino fuente ejemplos reg reg OR BL,CL reg mem OR BX,UNAPALABRA mem reg OR MIBYTE,BL reg val OR BL,30H mem val OR UNAPALABRA,0201H XOR destino,fuente Operacin "o lgico exclusivo" a nivel de bit entre los dos operandos. El resultado se almacena en destino. Ejemplo: ; AX = FEDCh = 1111 1110 1101 1100b ; BX = 1234h = 0001 0010 0011 0100b XOR AX,BX ; AX = ECD8h ; BX = 1234h Tipos de operandos: ver instruccin OR Instrucciones de interrupcin INT nmero_int Activa el procedimiento de interrupcin especificado por el operando. La direccin del vector de interrupcin se calcula multiplicando por 4 el operando, que es un valor entre 0 (cero) y 255. El vector de interrupin se compone de dos palabras: - Primera palabra: desplazamiento - Segunda palabra: segmento Se bifurca a la direccin especificada por el vector de interrupcin, salvando previamente las banderas (como en la inst. PUSHF) y la direccin de retorno (CS e IP). Se regresar de la interrupcin al encontrarse la instruccin IRET. Lgica: SP = SP - 2 almacena las banderas en la pila IF = 0 TF = 0 SP = SP - 2 PUSH CS CS = nmero_int * 4 + 2 SP = SP - 2 PUSH IP IP = nmero_int * 4 ; y aqui al cambiar el puntero de instruccin, se produce la bifurcacin Opciones de la INT 21h (llamadas a funciones de DOS) Propsito AH 1 entrada desde teclado Tipo teclado Descripcin espera entrada proveniente del teclado, la exhibe y la coloca en el reg AL

35

36 2 9 10 exhibe salida impresin de cadena entrada desde el teclado a travs de buffer display display teclado exhibe el carcter que est en DL presenta una cadena de caracteres en la pantalla. La cadena empieza en direccin cargada en DX y finaliza en $ lee los caracteres que provienen del teclado en un buffer. DS:DX apunta al buffer. El 1er byte es el nro.mx. de caract., el 2do. indica la cant. de caract. ledos

- Imprimir un carcter en la pantalla con funcin 2 (dos). Se imprime el carcter que contiene DL. MOV AH,2 ; carga nmero de funcin = Imprimir DL MOV DL,0Ah ; carcter de avance de lnea = LF INT 21h ;interrupcin 21h. funciones del DOS ... ; el cursor avanz una lnea MOV DL,31h ; caracter ASCII = 1 (uno) INT 21h ;interrupcin 21h. funciones del DOS ... ; se ha impreso un nro. uno en la pantalla - Imprimir una cadena de caracteres en pantalla. Imprime desde la direccin DS:DX hasta encontrar un signo "$" ... Mensaje DB "Texto que deseo imprimir","$" ... MOV AH,9 ; funcin = imprimir cadena de caracteres LEA DX,Mensaje ; carga en DX direccion de "Mensaje" INT 21h ;interrupcin 21h ... ; se ha impreso la cadena definida desde "Mensaje" hasta el signo "$" - Leer un carcter desde teclado. Espera para leer, luego imprime y carga el carcter en AL. MOV AH,1 ; funcin = leer el AL un caracter INT 21h ;interrupcin 21h. funciones del DOS ... ; en AL est el caracter ledo - Imprimir una cadena de caracteres en pantalla y luego lee una cadena de 5 (cinco) caracteres desde teclado ... Msg DB "Ingrese los datos","$" Buf DB 6 ; se desea leer 5 (cinco) bytes, por lo tanto informo 5 + 1 = 6 LongLei DB ? ; lugar donde informar cuantos caracteres se leyeron Leidos DB 6 DUP (" ") ;se reservan seis lugares en blanco para los caracteres a leer ... MOV AH,9 ; funcin = imprimir cadena de caracteres LEA DX,Msg ; carga en DX direccion de "Msg" INT 21h ;interrupcin 21h para imprimir "Msg" MOV AH,10 ;funcion de leer una cadena en un buffer LEA DX,Buf ; direccin inicial del buffer armado INT 21h ;interrupcin para leer un buffer ... ; en "LongLei" me informa la cantidad real de bytes leidos ; en "Leidos" tengo los caracteres que me ingresaron desde el teclado

36

37

CAPTULO 12:

DIRECTIVAS

nombre_seg SEGMENT [tipo-alineamiento] [tipo-combinacin] ['clase'] Indica el inicio del segmento denominado nombre_seg y que finalizar con la directiva ENDS. Un segmento puede contener definicin de variables, instrucciones cdigos ejecutables, una combinacin de ambos. Parmetro nombre_seg tipo-alineamiento Descripcin Nombre del SEGMENTo Existen 4 tipos: 1. PARA Valor predeterminado. El segmento debe comenzar en los lmites de un prrafo. 2. BYTE Puede comenzar en cualquier direccin. 3. WORD El segmento debe comenzar en el lmite de una palabra (una direccin que sea par). 4. PAGE El segmento debe iniciar en una pgina. Indica cmo sern convinados los segmentos cuando se ejecute el LINK: 1. PUBLIC Todos los segmentos con el mismo nombre y atributo PUBLIC sern encadenados juntos. 2. COMMON Los segm del mismo nombre empezarn en la misma direcc de mem y se superpondrn 3. AT(exp) Se utiliza para definir variable en una localidad fija en memoria. 4. STACK Este segmento es de STACK 5. MEMORY Todos los segm de este tipo se colocarn en direcc mayores que cualquier otro segmo. Se utiliza para hacer ref. a una coleccin de segmentos. Los segm. con el mismo nombre de clase se colocarn en memoria secuencialmente, siguiendo el orden en que los encontr el LINK.

tipo-combinacin

'clase'

nombre EQU expresin EQU EQUivalence : equivalencia. La expresin puede ser: -constante numrica -referencia de direccin -combinacin de simbolos y operaciones que puedan evaluarse como un valor numrico -otro nombre simblico Ejemplos: COLUMNAS EQU 80 FILAS EQU 25 PANTALLA EQU COLUMNAS*FILAS K EQU 1024 CR EQU 13 ; retorno de carro LF EQU 10 ; alimentacin de linea [nombre_de_variable ] DB expresin [, ...] ;Define Byte El nombre_de_variable es opcional y da nombre a la direccin del primer byte inicializado del rengln. La expresin es el valor de inicializacin de los bytes reservados, la cantidad de expresiones est limitado a la long. del rengln y pueden ser: Nros. con signo: (-128 a +127) Nros. sin signo: 0 a 255 ? : signo de pregunta significa sin inicializar "cadena o string" 'cualquier caracter ASCII' delimitado por comillas dobles o simples n1 DUP (n2) repite n1 veces la expresin n2. n2 puede ser otro n1 Ejemplos: Valores DB 30,-15,20 ; tres bytes inicializados en las direcciones Valores+0 Valores+1 y Valores+2 ; 30 = 1Eh -15=8Fh 20=14h MaxMinSS DB 255,0 ; convierte el decimal a hexa e inicializa, equivale a FFh,00h MaxMinCS DB 127,-128 CR DB 0Dh ;carcter de retorno de carro en hexadecimal = 12d DB 11110000b ;equivale a DB 0F0h Treintay6 DB 12*3 ;equivale a DB 36 DB 4 DUP (0) ; equivale a DB 0,0,0,0 DB 3 DUP (2 DUP (3), 7) ; equivale a 3,3,7,3,3,7,3,3,7 TABLA DB 4,?,65 ; sin definir el 2do. valor Mensaje DB "Error 12D" ;cadena de caracteres Mens01 DB 'Error 15h',13,"$" ;cadena de caracteres MSG02 DB "Peter's house" ; delimita la comilla doble

37

38 [nombre_de_variable ] DW expresin [, ...] ; Define Word El nombre_de_variable es opcional y da nombre a la direccin de la 1er palabra (dos bytes) inicializada del rengln. Expresin es el valor de inicializacin de las palabras, la cant de expresiones est limitada a la long. del rengln y pueden ser: Nros. con signo: de -32768 a +32767 (8000h a 7FFFh) Nros. sin signo: 0 a 65535 (0000h a FFFFh) ? : signo de pregunta significa sin inicializar el desplazamiento (offset) de una variable rtulo n1 DUP (n2) repite n1 veces la expresin n2. n2 puede ser otro n1 Tener presente que los bytes se almacenan en orden inverso, es decir que ... DW 1234h ; se almacenar 34h 12h. Ejemplos: Val DW 300,-15,2000 ; tres palabras inicializadas en las direcciones Val+0 Val+2 y Val+4 MaxMinSS DW 65535,0 ; convierte el decimal a hexa e inicializa, equivale a FFFFh,0000h MaxMinCS DW 32767,-32768 Tres60 DW 120*3 ;equivale a DW 360 Uno234 DW 1234h ; se almacena 3412h DW 1111000011110000b ; equivale a DW 0F0F0h DW 4 DUP (0) ; equivale a DW 0,0,0,0 DW 3 DUP (2 DUP (3), ?) ; equivale a 3,3,?,3,3,?,3,3,? TABLA DW 4,?,65 ; sin definir el 2do. valor Dir1 DW Val ; desplazamiento de la variable "Val" Dir2 DW Val+4 ; desplazamiento del tercer valor definido luego de Val Dir3 DW TABLA,Tres60 Dir4 DW Uno234-Tres60 ; diferencia de direcciones = longitud en byte de Tres60 [nombre_de_variable ] DD expresin [, ...] ; Define Double word El nombre_de_variable es opcional y da nombre a la direccin de la primer doble palabra (dos palabras = cuatro bytes) definida en el rengln. La expresin es el valor de inicializacin de la doble palabra, la cantidad de expresiones est limitada a la long. del rengln y pueden ser: Nros. con signo: de -2147483648 a +2147483647 Nros. sin signo: 0 a 4294967295 ? : signo de pregunta significa sin inicializar una direccin completa (segmento y desplazamiento) de una variable rtulo n1 DUP (n2) repite n1 veces la expresin n2. n2 puede ser otro n1 Ejemplos: Val DD 300,-15,2000 ; tres dobles palabras inicializadas en las direcciones Val+0 Val+4 y Val+8 MinSS DD 0 Tres60 DD 120*3 ;equivale a DD 360 Uno234etc DD 12345678h ; se almacena 78563412h TABLA DD 4,?,65 ; sin definir el 2do. valor Dir1 DD Val ; desplazam. y segm. de la variable "Val", en ese orden Dir2 DD Val+4 ; desplaz. y segm del 2do valor definido luego de Val Si el valor del segmento de la direccin completa de TABLA es 1234h y el desplazamiento es 5678h DIR DD TABLA ; equivale a: DD 12345678h ; que a su vez equivale a: DD 5678h,1234h ; desplazam,segmento que a su vez equivale a: DD 78h,56h,34h,12h [nombre_de_variable ] DQ expresin [, ...] ; Define Quad. word El nombre_de_variable es opcional y da nombre a la direccin de la primer cuadruple palabra (cuatro palabras = ocho bytes) definida en el rengln. La expresin es el valor de inicializacin de la cuadruple palabra, la cantidad de expresiones est limitada a la long. del rengln y pueden ser: Nros. con signo: de -9223372036854775808 a +9223372036854775807 Nros. sin signo: 0 a 18446774073709551615 ? : signo de pregunta significa sin inicializar n1 DUP (n2) repite n1 veces la expresin n2. n2 puede ser otro n1 Ejemplos: Val DQ 300,-15,2000 ; tres cuadruples palabras inicializadas en las direcciones Val+0 Val+8 y Val+16

38

39 MinSS DQ 0

[nombre_de_variable ] DT expresin [, ...] ; Define ten bytes El nombre_de_variable es opcional. Reserva 10 (diez) bytes para almacenar digitos decimales empaquetados. El 1er. byte contiene el signo (ooh positivo y 80h negativo) y los otros nueve para 18 dgitos decimales. La expresin es el valor de inicializacin y la cantidad de expresiones est limitada a la long. del rengln y pueden ser: Nros. con signo ? : signo de pregunta significa sin inicializar n1 DUP (n2) repite n1 veces la expresin n2. n2 puede ser otro n1 Ejemplos: Uno23 DT 123 ;almacena 23010000000000000000 Menos123DT -123 ;almacena 23010000000000000080 Nro DT 0123456789 ;equivale a DB 89h,67h,45h,23h,01h,5 dup(0) ASSUME registro:nombre_seg [, ...] Indica al LINK como debe relacionar los nombres de registros (ES,DS,CS,SS) con los de segmentos definidos (con SEGMENT ... ENDS). El LINK no los inicializa: los registros CS y SS los inicializa el cargador de programas del DOS, mientras que DS y ES debemos codificar las instrucciones necesarias dentro del programa. El ASSUME mnimo requerido es ASSUME CS:nombre_segm_de_cdigo Es recomendable definir los segmentos de datos delante de los segmentos de cdigos, puesto que el compilador puede dar errores. Ejemplo: DATOS SEGMENT ; comienzo del segmento denominado "DATOS" ... ... DATOS ENDS ; final del segmento denominado "DATOS" ... CODIGO SEGMENT ; inicio de "CODIGO" ASSUME CS:CODIGO,DS:DATOS ... CODIGO ENDS ;fin de "CODIGO" nombre_procedimiento PROC [atributo] indica el inicio del procedimiento nombre_procedimiento, el cual finalizar con la directiva ENDP. Un procedimiento es un bloque de instrucciones que sirve para realizar una tarea determinada y que puede invocarse desde varios puntos del programa. En algunos lenguajes, es lo que se considera "rutinas" "subrutinas". Un procedimiento se ejecuta normalmente llamandolo con una sentencia CALL. El "atributo" puede ser NEAR o FAR (se asume NEAR). Un procedimiento NEAR puede llamarse slo desde el mismo segmento en el que est definido. Al llamar a un procedimiento NEAR se guarda en la PILA solo el desplazamiento (valor de IP) de la instruccin siguiente al CALL. Esta direccin es la que se recupera al encontrarse una instruccin RET dentro del procedimiento. Un procedimiento FAR puede llamarse desde cualquier segmento. Al llamar a un procedimiento FAR, se guarda en la PILA el segmento (CS) y desplazamiento (IP) de la instruccin siguiente al CALL, los cuales sern recuperados al encontrarse la instruccin de retorno del procedimiento RET. El procedimiento principal ( nico) de un programa debe tener el atributo FAR. Ejemplo: ... CALL SUMAR ;llamado al procedimiento SUMAR ... ; instruccin siguiente al CALL, a la cual regresar luego de ejecutar el proc. SUMAR ... ; resto del programa SUMAR PROC NEAR ;inicio del procedimiento SUMAR ... ; bloque de sentencias pertenecientes al procedim. SUMAR RET ; instruccin para salir del procedimiento y regresar a la instr. sig. al CALL de donde se lo llam SUMAR ENDP ; finalizacin del procedimiento SUMAR END [expresin] Indica el final del programa fuente. El operando expresin indica la direccin de comienzo del programa fuente. Normalmente es el nombre de un procedimiento que deber ser FAR.

39