You are on page 1of 69

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN UNIDAD 2. Lenguaje Ensamblador.

2.1 Importancia del Lenguaje Ensamblador. 2.2 Manejo de memoria. 2.3 Direccionamiento. 2.4 Formato de un programa. 2.5 Proceso de ensamble y ligado. 2.6 Instrucciones del Lenguaje Ensamblador. 2.7 Macros. 2.8 Interrupciones. Importancia del Lenguaje Ensamblador. La importancia estriba en que se pueden utilizar directamente los recursos del equipo de cmputo, es decir, podemos utilizar los registros del procesador, los puertos de E/S, la memoria principal, esto trae como ventaja que se desarrollen programas que sean rpidos en su ejecucin. Los registros de la familia 80x86. El 8086 fue diseado para ejecutar instrucciones y realizar operacin aritmtica y lgica, al mismo tiempo que reciben instrucciones y pasa datos a y desde memoria. Para hacer esto utiliza registros de 16 bits. Existen 14 registros en el 80x86, cada uno con un uso especial. Cuatro registros de propsito general son usados por los programas para almacenar temporalmente los resultados intermedios y los operandos de las operaciones aritmticas y lgicas. Cuatro registros de segmento guardan la direccin inicial de ciertos segmentos de memoria. Cinco registros apuntadores e ndices mantienen las direcciones de desplazamiento que son utilizadas con los prrafos de segmento para localizar datos en memoria. Finalmente, existe un registro de banderas (flags) que contiene nueve banderas de 1 bit utilizadas para registrar la informacin de estado y controlar las operaciones del 8086. La siguiente figura muestra estos registros. Los registros de propsito general. Los registros de propsito general, de tamao de 16 bits, son conocidos como AX, BX, CX y DX. Cada uno de ellos puede ser opcionalmente referenciado como un par de registros de 8 bits (1 byte). El byte de la parte izquierda (el ms significativo) es referido como el byte alto (high), y el byte de la parte derecha (el menos significativo) es referido como el byte bajo (low). As el registro AX puede ser dividido en los registros AH y AL, el registro
MC Genaro Alberto Gmez Chi. Pgina 1

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


BX puede dividirse en los registros BH y BL, etc. El uso de estos registros como de 16 bits o de 8 bits puede ser entremezclado libremente, conforme sea necesario. Los registros de propsito general son usados mayormente como reas de trabajo temporal, particularmente en las operaciones aritmticas. La adicin y la substraccin puede realizarse en memoria sin usar los registros, pero estos son mas rpidos de acceder. Aunque estos registros estn disponibles para cualquier tipo de trabajo, cada uno tiene un uso especial. El registro AX tambin conocido como el acumulador, es el registro principal usado para efectuar operaciones aritmticas. Es tambin el registro ms eficiente a usar en algunas operaciones aritmticas, lgicas y de transferencia de datos. El registro BX (Base) es usado a menudo para apuntar a localizaciones de memoria. Un valor de 16 bits almacenada en BX puede ser usado como parte de una direccin de memoria a ser accedida. El registro CX (Contador) es usado como un contador de repeticin para control de iteracin y movimientos repetidos de datos. Por ejemplo la instruccin LOOP en lenguaje ensamblador utiliza a CX para almacenar la cuenta del nmero de iteraciones. Ninguno de los otros registros puede realizar esta funcin. El registro DX es usado para almacenar datos de 16 bits para propsitos generales. Es el nico registro que puede ser usado como apuntador de direcciones de E/S en las instrucciones de acceso a puertos. En operaciones aritmticas de 32 bits, el registro DX complementa al registro AX. Los registros de segmento. La arquitectura segmentada del 8086 nicamente permite direccionar 1 Mb de memoria. Se requieren direcciones de memoria de 20 bits para direccionar todas las localizaciones en un espacio de 1 Mb, sin embargo, el 8086 usa apuntadores a memoria de bits -recurdese que el registro BX de 16 bits puede ser utilizado para apuntar a memoria-, por lo tanto, es necesario utilizar un esquema de direccionamiento de memoria de 2 partes: cada apuntador de memoria de 16 bits, conocido tambin como parte de desplazamiento, se combina con el contenido de un registro de segmento de 16 bits para formar una direccin de memoria de 20 bits, denominada parte de segmento. Cuatro registros llamados CS, DS, SS y ES, son usados para identificar cuatro segmentos especficos de memoria de 64K. De los 4 registros, los siguientes tres estn dedicados a propsitos especiales: El registro CS apunta al inicio de un bloque de 64 Kb de memoria, o Segmento de Cdigo, en el que reside la siguiente instruccin a ser ejecutada. En otras palabras, apunta al bloque de direcciones que contiene al programa que se esta ejecutando. El
MC Genaro Alberto Gmez Chi. Pgina 2

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


8086 nunca buscara la siguiente instruccin a ejecutar en un segmento que no sea el definido por registro CS. El registro DS apunta al inicio del segmento de datos, el rea de memoria de 64 Kb donde normalmente se almacenan los datos. El registro SS apunta al inicio del Segmento de Pila (o Stack), un lugar de trabajo temporal de 64 Kb donde los valores pueden ser almacenados y del cual pueden ser recuperados utilizando el esquema el Ultimo en Entrar es el Primero en Salir (LIFO). El cuarto registro de segmento, el registro ES, apunta al inicio de un bloque de memoria conocido como Segmento Extra, que normalmente es usado para suplementar el segmento de datos y tener acceso a mas de 64K de memoria para almacenar datos. Tambin se usa para transferencia de datos entre segmentos. Es importante apuntar que es ms eficiente acceder memoria en el segmento de datos que en el segmento extra. Los registros de desplazamiento. Cinco registros de desplazamiento son usados para localizar un byte o palabra dentro de un segmento especifico de 64K. Un registro, llamado el apuntador de instruccin (IP), localiza la siguiente instruccin a ejecutar en el segmento de cdigo; dos registros mas, conocidos como los registros de pila, estn ntimamente relacionados con la pila, un lugar en memoria donde el 8086 mantiene un seguimiento de direcciones y datos que necesita recordar para uso posterior; y los dos registros restantes, llamados registros de ndices, se utilizan para apuntar a los operandos actuales en el segmento de datos. El apuntador de instruccin IP, tambin llamado el contador del programa (PC), proporciona la direccin de desplazamiento dentro del segmento de cdigo donde se almacena la siguiente instruccin a ser ejecutada. Conforme una instruccin se ejecuta, el apuntador de instrucciones es avanzado para que apunte a la instruccin en la siguiente direccin de memoria. Normalmente, la instruccin en la siguiente direccin de memoria es la siguiente instruccin a ejecutar, pero algunas instrucciones, como las llamadas a procedimientos y saltos, pueden causar que el apuntador de instrucciones sea actualizado con un nuevo valor, que no sea la siguiente direccin. Los programas no tienen acceso directo al registro IP, pero existen ciertas instrucciones, tales como CALL y JMP, que cambian indirectamente el contenido de este registro o lo salvan y restauran en o de la pila. Los registros apuntadores de la pila, llamados el apuntador de la pila (SP) y el apuntador de la base (BP), proporcionan desplazamientos en el segmento de pila. SP da la localizacin del tope actual de la pila y es anlogo al IP. BP es usado para tomar una instantnea de la localizacin del tope actual de la pila, para as posteriormente saber donde exactamente se localiza en la pila cierta informacin. BP es
MC Genaro Alberto Gmez Chi. Pgina 3

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


particularmente importante para rutinas de interface entre lenguajes de alto nivel y lenguaje ensamblador. Los registros ndices, llamados el ndice fuente (SI) y el ndice destino (DI), son registros de desplazamiento especializados. Tpicamente, SI y DI son usados en conjuncin con los registros de segmento DS y ES. En operaciones de cadena, por ejemplo, deber usarse DS:SI para apuntar a la direccin de la cadena fuente y ES:DI para apuntar a la cadena destino. Tambin, puede usarse con otros registros (AX, BX, CX y DX) o un desplazamiento de instruccin, para proporcionar el desplazamiento relativo del inicio de un campo de datos, dentro del segmento de datos. Los registros SI y DI, entonces, proporcionan desplazamientos relativos dentro del campo de datos. El registro de banderas. El registro de banderas, es realmente una coleccin de bits de control individual conocidos como banderas o flags. Las banderas estn disponibles en la forma de un registro para que puedan ser salvados y restaurados como un conjunto coordinados o inspeccionados como datos ordinarios. Sin embargo, normalmente las banderas son puestas y probadas como elementos independientes (no como un conjunto), utilizando instrucciones especificas a cada bandera. Existen 9 banderas de 1 bit en el registro de banderas de 16 bits, lo que deja 7 bits sin uso. Las banderas pueden dividirse lgicamente en 2 grupos: 6 banderas de estado, que son puestas para registrar la informacin de estado del procesador (usualmente indicando que sucedi con una comparacin u operacin aritmtica, y 3 banderas de control, que dirigen algunas de las instrucciones del 8086. 15 14 13 11 OF Nombre 12 10 9 DF IF 8 7 6 5 TF SF ZF Uso 4 3 AF 2 1 PF 0 CF

Cdigo
CF OF ZF SF PF AF

Bandera de acarreo Bandera de desborde Bandera de cero Bandera de signo Bandera de paridad Bandera de acarreo auxiliar

Es puesta a uno cuando una operacin genera un acarreo a o un prstamo de un operando destino. Es puesta a uno si el resultado de una operacin es demasiado grande o pequeo para ajustarse en el operando destino. Es puesta a uno si el resultado de una operacin es cero o el de una comparacin es igual. Igual al bit de mayor orden del resultado de una operacin (0 es positivo, 1 es negativo) Es puesta a uno si los de orden bajo del resultado de una operacin contiene un numero par de bits 1. Es puesta a uno si la operacin genera un acarreo a o un prstamo de los 4 bits de orden bajo de un operando. Indica un ajuste Pgina 4

MC Genaro Alberto Gmez Chi.

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


necesitado en las operaciones aritmticas en decimal codificado en binario (BCD). Puede ser puesta a uno para hacer que las operaciones de cadena se procesen de direcciones altas de memoria a direcciones bajas. O pueden ser aclaradas a cero para hacer que las operaciones de cadena se procesen de direcciones bajas de memoria a direcciones altas. Si esta puesta a uno las interrupciones sern reconocidas y atendidas conforme son recibidas. El bit puede ser aclarado a cero temporalmente para apagar el procesamiento de interrupciones. Si esta puesta a uno, el procesador genera una interrupcin de paso simple despus de ejecutar cada instruccin de un programa. Un programa depurador puede utilizar esta caracterstica para ejecutar un programa instruccin por instruccin.

DF

Bandera de direccin Bandera de interrupcin Bandera de trampa

IF

TF

El concepto de bus. Las computadoras basadas en procesadores de la familia 80x86 enlazan toda su circuitera de control interna en un diseo de circuito conocido como bus. Un bus es simplemente un camino compartido en la tarjeta principal en el que todas las partes controladoras de la computadora estn conectadas. Cuando los datos son pasados de un componente a otro viajan a lo largo de este camino comn para alcanzar su destino. Cada chip de control y cada byte de memoria en el PC estn conectados directa o indirectamente al bus. Cuando un nuevo componente es conectado a una de las ranuras de expansin, se esta conectando directamente al bus, y convirtindolo en un socio en la operacin de la unidad entera. Siempre que una celda de memoria de memoria o puerto es usado como un sitio de almacenamiento, su localizacin es marcada por una direccin que es nica que lo identifica. Cuando un dato esta listo para ser transferido, su direccin destino se transmite primero a lo largo del bus de direcciones, los datos le siguen entonces a lo largo del bus de datos. De esta manera, el bus transporta ms que datos. Acarrea informacin de potencia y control, tal como seales de temporizacin (del reloj del sistema) y seales de interrupcin, como tambin las direcciones de miles de celdas de memoria y los diferentes dispositivos adheridos al bus. Para acomodar estas cuatro diferentes funciones, el bus se divide en cuatro partes: las lneas de potencia, el bus de control, el bus de direcciones y el bus de datos. El Bus de Direcciones El Bus de direcciones en la familia estndar de PC usa 20 lneas de seal para transmitir las direcciones de las celdas de memoria y los dispositivos adheridos al bus. Puesto que hay otros dos valores posibles (0 y 1) que pueden viajar a lo largo de cada una
MC Genaro Alberto Gmez Chi. Pgina 5

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


de las 20 lneas de direccin, las computadoras PC estndar son capaces de especificar 220 direcciones. Esta cantidad es mayor a un milln de posibles direcciones (espacios de direcciones de 1 Megabytes). La AT utiliza 24 lneas de direccin, permitiendo especificar 224 o ms de l6 millones de direcciones (espacio de direcciones de 16 Megabytes). El Bus de Datos. El Bus de datos trabaja en conjuncin con el bus de direcciones para acarrear datos a lo largo de la computadora. Los sistemas de PC basados en el 8088 usan un bus de datos que tiene 8 lneas de seal, cada una de ellas transporta un bit simple. Esto significa que los datos son transmitidos a travs del bus de 8 lneas en unidades de 8 bits (1 byte). Los microprocesadores 8086 y 80286 de la AT usan un bus de datos de 16 bits, y por lo tanto transportan datos en unidades de l6 bits (1 palabra). El 8088, siendo un microprocesador de 16 bits, puede trabajar con 16 bits de datos a la vez, tal como lo hacen los homlogos, el 8086 y el 80286. Aunque el 8088 puede trabajar internamente con nmeros de 16 bits, solo puede pasar 8 bits de datos a la vez cuando esta trabajando con la circuitera a su alrededor, debido al tamao de su bus de datos. El bus de datos de 16 bits del 80286 le ayuda a mover los datos en su alrededor ms eficientemente que el 8088. El Bus de Control. Consiste de varias seales discretas que incluyen lectura a memoria, escritura a memoria, lectura de entrada/salida, escritura e entrada/salida, peticin de interrupcin (8 niveles). Memoria Principal. El nmero de chips de memoria que fsicamente existen dentro de la computadora determina la cantidad de memoria que podemos usar para programas y datos. Aunque esto puede variar de una computadora a otra, La PC estndar usualmente viene con alrededor de 40 Kb. De memoria de solo lectura (ROM) -con espacio para ms- y 640 1024Kb. De memoria de acceso aleatorio (RAM). Sin embargo, es posible agregar tarjetas de memoria de diferentes capacidades mediante las ranuras de expansin de la PC. Para la computadora los chips de memoria no son ms que unos cuantos miles de celdas de almacenamiento de 8 bits (1 byte), cada una de ellas con una direccin nica. Los programadores deben pensar en la memoria de la misma manera - no en trminos de cuanta memoria fsica existe, sino en trminos de cuanta memoria direccionable se tiene. El 8086 puede direccionar hasta 1024Kb, o exactamente 1048576
MC Genaro Alberto Gmez Chi. Pgina 6

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


bytes de memoria. En otras palabras, este es el mximo nmero de direcciones, y por lo tanto el mximo numero de bytes individuales de informacin a que se puede hacer referencia. Cada byte es referenciado por una direccin numrica de 20 bits. En el esquema de memoria de 8086, las direcciones son de 20 bits de ancho debido a que deben viajar a travs de un bus de direcciones de 20 bits. A partir de este momento se usara la notacin hexadecimal en vez de la notacin binaria para la determinacin de las direcciones de memoria, lo que ocasionara la traduccin de direcciones de 20 bits a sus equivalentes de 5 dgitos hexadecimales. Esto permitir manejar valores de direcciones del rango de 00000h a FFFFFh (0 a 1048576 en notacin decimal). El 8086 es un microprocesador de 16 bits que no puede trabajar directamente con nmeros mayores de 16 bits, siendo el mayor valor decimal manejable 65,535 o 64Kb. Tericamente, esto significa que el 8086 nicamente s capaz de acceder 64Kb direcciones de memoria, siendo que verdaderamente, puede acceder mucho ms que esa cantidad 1024Kb para ser exactos. Esto gracias al esquema de direccionamiento de 20 bits usado con el 8086, que expande el rango completo de localizaciones de memoria que el microprocesador puede trabajar de 216 (65,535) a 220 (1048576). Sin embargo, El 8086 esta todava limitado por su capacidad de procesamiento de 16 bits Para acceder las direcciones de 20 bits, debe hacerse uso de un mtodo de direccionamiento que se ajuste al formato interno de 16 bits. Como se almacenan los datos en memoria. Mientras la memoria de la PC es direccionada en unidades individuales de 8 bytes, muchas operaciones involucran palabras de 16 bits. En memoria, una palabra de 16 bits se almacena en dos bytes adyacentes de 8 bits. El byte menos significativo de la palabra es almacenado en la localizacin de memoria inferior y el byte ms significativo se almacena en la localizacin de memoria superior. Desde algunos puntos de vista, almacenar una palabra de esta forma es opuesto a lo que se espera. Debido a la apariencia hacia atrs (backward) de este esquema de almacenamiento, es extravagantemente llamado almacenamiento back-words (almacenamiento de palabras al revs, traduccin literal). Si se trabaja con bytes de memoria, deber tenerse cuidado para no confundirse con el almacenamiento de back-words. La fuente de confusin tiene que ver generalmente con la manera de escribir los datos. Por ejemplo, Si se escribe un valor de la palabra en hexadecimal, se acostumbra a escribir algo como esto: ABCDh. El orden de significancia es el mismo que se utiliza cuando se escribe un nmero decimal: El dgito ms significativo se escribe primero. Pero cuando se escribe una palabra tal y como se almacena en la memoria,
MC Genaro Alberto Gmez Chi. Pgina 7

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


debe escribirse primero la localizacin de la direccin inferior as, en memoria, se escribe el nmero hexadecimal ABCDh como CDABh, con los bytes cambiados. Segmentacin de direcciones de memoria. El 8086 divide el espacio direccionable de memoria con un numero arbitrario de segmentos, cada uno conteniendo no ms de 64Kbytes. Cada segmento inicia en una localizacin que es divisible por 16 bytes, conocida como su direccin de segmento o prrafo de segmento. Para acceder bytes individuales o palabras, se utiliza una direccin adicional llamada una direccin de desplazamiento que apunta a una localizacin exacta de byte dentro del segmento de 64K designado por el prrafo de segmento. Debido que las direcciones de desplazamiento son medidas siempre en relacin al inicio del prrafo de segmento, tambin son conocidas como direcciones relativas o desplazamientos relativos. Las direcciones son creadas o manipuladas creando un prrafo de segmento de 16 bits y un desplazamiento relativo de 16 bits. El prrafo del segmento es desplazado hacia a la izquierda 4 bits y sumado al desplazamiento relativo, para producir una direccin completa de 20 bits. Juntas, las dos palabras de 16 bits son usualmente denominadas direccin segmentada; tambin conocida como vector particularmente cuando se hace referencias a interrupciones. Cuando se escribe una direccin de 20 bits divida en sus partes de segmento y desplazamiento relativo, se utiliza la notacin 0000:0000, con el segmento en el lado izquierdo de los signos de dos puntos ( : ) y el desplazamiento relativo en el lado derecho. Por ejemplo, una direccin de 20 bits escrita como FFE6E podra escribirse como FFE4:002E en notacin segmentada. La figura muestra que es posible expresar una direccin simple de 20 bits en una amplia variedad de formas usando notacin segmentada, dependiendo de que segmento de prrafos se elija.
Direccin de prrafo de segmento

(Desplazado 4 bits a la izquierda) + Direccin de desplazamiento relativo Direccin fsica de 20 bits

12340h
MC Genaro Alberto Gmez Chi.

1234:5678

+ 5678h 179B8h

Pgina 8

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


La Pila. Los procesadores de la familia 80x86 utilizan una escritura llamada pila para seguir la pista de la informacin durante las llamadas a funciones y otras operaciones. El procesador pone los registros de la pila siempre que una subrutina es llamada (una operacin PUSH) y los toma de ella (una operacin POP) al retornar de la subrutina. La pila obtiene su nombre de una analoga con una pila de platos en una cafetera: los nuevos datos son agregados (con una operacin PUSH) a la pila, hacindola crecer. Cuando algo es removido (con una operacin POP) el primer elemento en salir es el ltimo elemento agregado en la pila. Este tipo de mecanismos es conocido como El Primero en Entrar es el Ultimo en Salir (LIFO, por su siglas en ingles). As, es el momento Sacar (POP) un dato de la pila, se esta tomando el dato que esta en el tope actual de la misma. Los programadores usan la pila para almacenar datos intermedios en clculos o para pasar valores (parmetros) a las subrutinas. Los lenguajes de programacin de alto nivel hacen un uso extensivo de la pila para este ltimo propsito. La pila siempre reside en el segmento de la pila, por lo que el registro SS siempre es usado durante las referencias a la pila. El registro apuntador de la pila SP, es usado implcitamente en todas las operaciones de la pila como una direccin de memoria. La operacin PUSH decrementa el contenido de SP por dos y almacena su operando, en la direccin de memoria por SP. La operacin POP toma los datos dela direccin de memoria especificada por SP para ponerlos en su operando, y despus incrementa el contenido de SP por dos. Estos efectos sobre el registro SP estn interconstituidos por los microprocesadores y no pueden ser cambiados el efecto prctico es que SP inicialmente debe apuntar a la parte superior del espacio de la pila, en lugar de apuntar a la parte inferior como es de esperarse. Es importante notar que las operaciones PUSH y POP siempre transfieren los datos una palabra a la vez, en contraste con la instruccin, MOV, que puede mover un byte o palabra. Cualquier parte de un programa pude crear un nuevo espacio para la pila en un momento dado, pero esto no es muy usualmente hecho. Normalmente cuando un programa se ejecuta una pila simple es creada para l y esa pila es usada a lo largo de la operacin del programa- por l programa mismo por sus subrutinas o por cualquiera de los servicios del DOS y el BIOS que son invocados durante la ejecucin del programa. Cuando no se ejecuta programa alguno, el DOS utiliza su propia pila privada. No existe una manera simple de estimar el tamao de la pila que necesita un programa y el diseo del 8088 no proporciona forma automtica alguna de detectar cuando se ha agotado el espacio de la pila si esta es muy pequea. Es comn para los lenguajes de
MC Genaro Alberto Gmez Chi. Pgina 9

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


programacin usar automticamente un tamao de pila de 512 a 2K bytes, a menos que otra cantidad sea especificada. Puede asumirse con seguridad que este tamao de pila es suficiente, siempre y cuando no se tenga razones especiales para requerir mas espacio. Como se comunica la familia 8086. Puertos. El 8086 se comunica con y controla muchas partes de la computadora mediante el uso de los puertos de entrada y salida (E/S). Los puertos de E/S son puertas a travs de las cuales pasa la informacin cuando viaja hacia o desde los dispositivos de E/S, tal como el teclado o la impresora. Cada puerto esta identificado por un nmero de puerto de 16 bits, dentro del rango de 0 a 65,535. La UCP enva los datos o la informacin de control a un puerto en particular especificando el nmero del puerto, y este responde pasando los datos o la informacin de estado de regreso a la UCP. Como en el acceso de memoria, la UCP usa los buses de direcciones y datos como canales de comunicacin con los puertos. Para acceder un puerto, primero la UCP enva una seal en el bus de control que notifica a todos los dispositivos de E/S que la direccin en el bus es la de un puerto y despus enva la direccin de un puerto. Entonces el dispositivo con la direccin del puerto equivalente responde. El nmero de puerto direcciona una localizacin de memoria que es parte del dispositivo de E/S pero no es parte de la memoria principal. Se utilizan instrucciones de E/S especiales (OUT e IN) para sealar un acceso a puerto y enviar informacin de regreso, etc. hacia los dispositivos de E/S. Algunos dispositivos de E/S, tale como los controladores de video, hacen que la UCP piense que son parte de la memoria RAM. Esto es conocido como E/S con mapeo de memoria. Generalmente, los dispositivos con mapeo de memoria son ms fciles de programar debido a que permiten usar las instrucciones de memoria ms flexibles, en lugar de las instrucciones de E/S limitadas e inflexibles del conjunto de instrucciones del 8088. El uso de puertos especficos esta determinado por los diseadores de hardware. Interrupciones. Siempre que un dispositivo de hardware o un programa necesita la asistencia de la UCP enva una seal o instruccin llamada, una interrupcin al microprocesador, identificando la tarea particular que desea se realice. Cuando el microprocesador recibe la
MC Genaro Alberto Gmez Chi. Pgina 10

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


seal de interrupcin, generalmente detiene todas las dems actividades y activa una subrutina almacenada en memoria, llamada un manejador de interrupciones o rutina de servicio de interrupcin, que corresponde a ese numero de interrupcin en particular. Despus de que el manejador de interrupciones ha finalizado su trabajo, las actividades de la computadora se reanudan en el lugar donde estaban cuando ocurri la interrupcin. Hay tres categoras principales de interrupciones. Primero, estn las interrupciones generadas por la circuitera de la computadora en respuesta a algn evento, tal como presionar una tecla del teclado. Estas interrupciones son manejadas por el chip controlador de interrupciones (8259), que les asigna una prioridad en el orden de importancia antes de enviarlas a la UCP y son conocidas como interrupciones de hardware (o mascarables). Segundo, estn las interrupciones que son generadas por la UCP como producto de algn resultado inusual de programas como la divisin por cero. Estas interrupciones son denominadas interrupciones internas. Y tercero, existen las interrupciones generadas deliberadamente por los programas como una manera de invocar a subrutinas distantes almacenadas en RAM o ROM. Estas interrupciones, tambin llamadas interrupciones de software, son usualmente generadas para lograr un servicio del BIOS o del sistema operativo. En adicin a estas interrupciones, existe tambin un tipo especial de interrupcin, llamada interrupcin no mascarable (NMI, por sus iniciales en ingls), que es usada para demandar atencin inmediata de la UCP. A menudo sealan una emergencia, como un desplome en el voltaje o la memoria, un error de paridad en memoria, etc. Cuando una NMI es enviada, se le da alta prioridad y la UCP la atiende antes que todas las otras interrupciones. Cuando una interrupcin se genera, el emisor de la interrupcin no necesita conocer la direccin de memoria del manejador de interrupcin requerido, nicamente necesita conocer el numero de la interrupcin. El nmero apunta a tabla almacenada en las localizaciones mas bajas de memoria que contienen las direcciones segmentadas de la subrutina de servicio de la interrupcin. La direccin del manejador de interrupcin es conocida como vector de interrupcin y la tabla es llamada tabla de vectores de interrupcin. La tabla de vectores normalmente es supervisada por el BIOS y el DOS. Las interrupciones salvan automticamente los valores actuales del cdigo de segmento (CS) y el apuntador de instruccin (IP) en la pila, para que la computadora pueda retornar al lugar donde estaba trabajando cuando la interrupcin ocurri. Adems, el proceso de interrupcin salva el registro de banderas en la pila y aclara la bandera de interrupciones (IF), previendo temporalmente la existencia de interrupciones adicionales.

MC Genaro Alberto Gmez Chi.

Pgina 11

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


El Software Encima de la mquina fsica, el software proporcionado por la PC construye otra capa de la mquina virtual. Este software inicia con el BIOS, que forma una vista estndar de la mquina que intenta ocultar los aspectos especficos del hardware instalado. Arriba del BIOS, el DOS construye la mquina con la que estamos familiarizados (en trminos de archivos y directorios). Los manejadores de dispositivos permiten que el DOS se comunique con nuevos dispositivos no estndares en el diseo original de la PC. El Sistema Bsico de Entrada/Salida (BIOS). El primer nivel de software en la mquina virtual es el BIOS (Basic Input/Output System), Sistema Bsico de entrada/salida. El BIOS consiste de un conjunto de programas del 8088 contenido en la memoria de solo lectura (ROM) que implementa las funciones bsicas de la mquina. Muchas descripciones tambin incluyen al software del sistema de E/S como parte del BIOS. Este software, cargado de disco, extiende las funciones del BIOS para que sea posible manejar todos los requerimientos de entrada/salida. El propsito del BIOS es aislar a los niveles superiores del software de los posibles cambios del hardware en la computadora; el del sistema de E/S es resguardar la interface entre el BIOS y el DOS mismo. Juntos, el BIOS y el sistema de E/S proporcionan un conjunto definido de servicios que son la base de los niveles superiores del software. Cada fabricante de computadora proporciona al BIOS, y adeca el sistema de E/S para sus mquinas. Microsoft proporciona un mdulo llamado SYSINIT que administra la inicializacin del sistema y la carga del DOS. La combinacin del BIOS y el Sistema de E/S debe ajustarse a ciertas especificaciones para permitir al software de niveles superiores funcionar apropiadamente. Por ejemplo, el Kernel (ncleo) del DOS de Microsoft utiliza a los servicios del BIOS para implementar muchas de sus propias funciones. Un secreto de la programacin exitosa para la familia de computadoras PC compatibles yace en el uso adecuado del software que est interconstruido en la mquina: los servicios del ROM-BIOS (sistema bsico de Entrada Salida en ROM). Conceptualmente, los servicios del ROM-BIOS se encuentran entre el hardware y los lenguajes de alto nivel (incluyendo el sistema operativo). Trabajan directamente con el hardware de la computadora y los dispositivos perifricos, realizando algunas de las tareas ms importantes, como leer y escribir bytes de datos individuales a la pantalla de video o al disco. Los servicios de los lenguajes de programacin y del sistema operativo por lo general
MC Genaro Alberto Gmez Chi. Pgina 12

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


se construyen a partir de estas funciones bsicas. De la misma manera un programador puede mejorar sus programas haciendo uso directo del ROM-BIOS y, por lo tanto, ganando acceso a un conjunto de herramientas extremadamente poderoso. Los servicios del ROM-BIOS se agrupan de acuerdo a los dispositivos de hardware que soportan, as los servicios de video, los servicios de disco y los servicios del teclado pueden revisarse separadamente. La Filosofa del BIOS. Todos los servicios del ROM-BIOS son invocados a travs de interrupciones. Las instrucciones de interrupcin hacen referencia a una localizacin particular en la tabla de vectores de interrupcin, en memoria baja, que contiene un vector de interrupcin: la direccin de la rutina de servicio almacenada en ROM. Este diseo hace posible, para cualquier programa, requerir un servicio sin conocer la direccin de memoria especfica de la rutina de servicios del ROM-BIOS. Esto, tambin permite que los servicios del BIOS sean cambiados, expandidos o adaptados sin afectar los programas que usan los servicios. Los servicios del ROM-BIOS podran ser supervisados por una interrupcin maestra, sin embargo estn divididos en categoras subjetivas, y cada categora tiene su propio controlador de interrupciones. El beneficio primario de este diseo es que permite a cada manejador de interrupciones ser reemplazado con una cantidad mnima de perturbaciones. Por ejemplo, si un fabricante de hardware crea un dispositivo de video, una impresora o cualquier otro dispositivo que sea radicalmente diferente y que requiera una rutina del BIOS completamente diferente para operarlo, el fabricante deber proporcionar este nuevo BIOS junto con el hardware. El nuevo programa del BIOS deber ser almacenado en RAM en vez de ROM y deber reemplazar slo aquella parte del ROM-BIOS que fue usada con el anterior hardware. Los servicios del ROM-BIOS. El ROM-BIOS cuenta con doce servicios de interrupcin (tabla xxx) que se dividen en cinco grupos: seis de las doce interrupciones sirven a dispositivos perifricos especficos: dos reportan el equipo de la computadora; un servicio trabaja la hora y la fecha: otro realiza la operacin de imprimir la pantalla (la accin de oprimir la tecla PrtScr); y finalmente, dos interrupciones cambian la computadora a otra estado, activando el ROM-BASIC y la rutina de inicializacin del sistema. La mayora de las interrupciones ofrecen subservicios que realizan tareas especficas del dispositivo. As, la interrupcin 16 (hex 10) de servicios de video tienen 17 subservicios que realizan desde la inicializacin del modo de video hasta la modificacin del tamao del cursor. Un subservicio de una interrupcin es invocado
MC Genaro Alberto Gmez Chi. Pgina 13

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


llamando a la interrupcin gobernante y especificando el nmero del subservicio en el registro AH. Caractersticas de operacin de los servicios del BIOS. Los servicios del ROM-BIOS usan convenciones de llamadas comunes que proporcionan consistencia en el uso de registro, banderas, la pila y memoria. El registro de segmento de cdigo (CS) automticamente es salvado, cargado y restaurado como parte del proceso de interrupcin. Consecuentemente, el programador no debe preocuparse por el registro CS de su programa. Los registros DS y ES son preservados por las rutinas de servicio del ROM-BIOS, excepto en los pocos casos donde son utilizadas explcitamente. El registro de segmento de pila (SS) permanece sin cambios y los servicios del ROM-BIOS se basan en la misma pila utilizada por los programas. Relacionado con el registro del segmento de cdigo, el apuntador de instrucciones (IP) es preservado por el mismo mecanismo que preserva el segmento de cdigo. Adems, el apuntador de la pila (PS) se preserva debido a que todos los servicios del ROM-BIOS dejan limpia la pila, sacando (POPing) todo lo que haya metido (PUSHed) durante la ejecucin de la rutina de servicio. Como es usual, los registros de propsito general, de AX a DX, y los registros ndice, SI y DI, son considerados de libre uso. La regla estndar de no esperar que el contenido de estos registros sea mantenidos cuando se pasa el control a otra rutina, se aplica tambin a los servicios del ROM-BIOS. Por lo general, cuando un resultado simple es retornado de una subrutina, se deja en el registro AX; esto se aplica al ROM-BIOS tambin. Interrupcin Decimal hexadecimal Servicios de dispositivos perifricos 16 10 19 13 20 14 21 15 22 16 23 17 Servicios de componentes de equipo 17 11 18 12
MC Genaro Alberto Gmez Chi.

Uso Servicios de despliegue de video Servicios de disco flexible Servicios de comunicaciones Servicios de cinta de cassette Servicios de teclado estndar Servicios de impresora Servicio de lista de equipo Servicio de tamao de memoria
Pgina 14

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Servicio Hora/Fecha 26 1A Servicio de Print Screen 5 5 Servicios especiales 24 18 25 19 Servicio de Hora y Fecha Servicio de imprimir pantalla Activa lenguaje ROM-BASIC Activa rutina de inicializacin del sistema

Las diferentes banderas del registro de banderas (FLAGS) son modificadas por las rutinas del ROM-BIOS. Por lo tanto, no deber esperarse que sean preservadas. En algunos servicios las banderas de acarreo (CF) y de cero (ZF) son usadas para sealar el xito o fracaso general de una operacin requerida. El sistema operativo de disco (DOS). El DOS es un programa de control que administra los recursos del sistema (UCP, memoria, almacenamiento secundario, etc.). Tambin proporciona el lenguaje de comandos con el que puede controlar fcilmente el accionar de la computadora. Microsoft proporciona el ncleo del DOS como un programa propietario basado en los servicios estndares del BIOS. El ncleo del DOS suministra servicios independientes del hardware que pueden ser utilizados por los programas de aplicacin en una gran variedad de sistemas. Los servicios del DOS pueden ser divididos arbitrariamente en las siguientes categoras: E/S de caracteres. Operaciones de directorio. Control de disco. Localizacin dinmica de memoria. Manejo de errores. Operaciones con archivos. Miscelnea de funciones del sistema. Funciones de red. Iniciacin y terminacin de programas. Pueden accederse los servicios del DOS de 2 maneras. Algunos servicios, los ms importantes desde el punto de vista del programador, son accedidos directamente utilizando interrupciones de software; otros, los usados por usuarios finales, son accedidos mediante el procesador de comandos (generalmente caracterizado por el programa COMMAND.COM).
MC Genaro Alberto Gmez Chi. Pgina 15

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


El trmino servicios del DOS define un conjunto de operaciones que el sistema operativo proporciona para usar en nuestros programas. En la propia terminologa del DOS, estos servicios se dividen en dos categoras: interrupciones del DOS y llamadas a funciones del DOS. Las interrupciones del DOS son invocadas por cdigos de interrupcin individuales mediante la instruccin INT. Las llamadas a funciones del DOS, por otra parte, son invocadas de la misma manera que los servicios del ROM-BIOS: a travs de una interrupcin coordinadora, la interrupcin 33 (hex 21). Como con los servicios del ROM-BIOS, las funciones individuales son seleccionadas mediante el registro AH. Existen nueve servicios de interrupcin listados en la tabla xxx. Cinco de ellos, las interrupciones 32, 37 a 39 y 47 (hex 20, 25 a 27 y 2F) son verdaderos servicios de interrupcin del DOS, cada una teniendo una tarea asociada especficamente definida. Las otras interrupciones tienen usos ms generales. Quiz la ms importante es la interrupcin 33 (hex 21), que es usada para invocar las llamadas a funciones del DOS. Las tres interrupciones restantes 34 a 36 (hex 22 a 24), son usadas para guardar direcciones segmentadas. Nuestros programas pueden establecer estas direcciones (preferentemente usando la llamada a la funcin 37 del DOS) para apuntar a rutinas especiales. Despus, cuando surjan las circunstancias apropiadas, el DOS invocar las rutinas localizadas en estas direcciones mediante estas tres interrupciones de direccin. Las cinco interrupciones principales del DOS. De las nueve interrupciones del DOS, cinco son verdaderas interrupciones, significando que tienen programas de manejo de interrupcin interconstruidas asociadas con ellas, cada una realizando una tarea particular. La interrupcin 32 (hex 20): terminacin del programa. La interrupcin 32 es usada para salir de un programa y pasar el control de regreso al DOS. Es importante aclarar que esta interrupcin no cierra ningn archivo cuando termina el programa. Interrupciones 37 y 38 (hex 25 y 26): Lectura y escritura absoluta a disco. Las interrupciones 37 y 38 son usadas para leer y escribir sectores especficos del disco, respectivamente. Son los nicos servicios del DOS que ignoran la escritura lgica de un disco y trabajan exclusivamente con sectores individuales, no prestando atencin a la existencia de archivos, directorios de archivo o FAT (tabla de localizacin de archivos).
MC Genaro Alberto Gmez Chi. Pgina 16

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Todos los otros servicios del DOS trabajan dentro del contexto de una estructura lgica de disco. La interrupcin 39 (hex 27): Termina y permanece residente. Como la interrupcin 32, la interrupcin 39 termina un programa, pero no lo elimina de la memoria. En su lugar, deja una porcin especfica del programa en memoria (el programa permanece residente), y el registro del DOS de la primera porcin usable de la memoria es cambiado a la direccin del prrafo que sigue inmediatamente despus del programa residente. La informacin de que se hace residente usando la interrupcin 39, convierte al programa en una extensin del DOS, no permitiendo que sea sobrescrito por otros programas. Los programas tpicamente usan este servicio para establecer una nueva rutina de manejo de interrupcin con la intencin de permanecer en efecto inmediatamente. Estas rutinas de manejo de interrupcin generalmente reemplazan a los manejadores de interrupciones originales para extender su operacin. La interrupcin 47 (hex 2F): Interrupcin de multiplexin. A partir de la versin 3.0 del DOS se agreg una nueva interrupcin numerada como 47 (hex 2F). Esta interrupcin establece una interface comn entre dos procesos. A pesar de que Microsoft e IBM documentan esta interrupcin para uso exclusivo de SPOOLer del DOS, puede ser utilizado por otros programas. Las interrupciones del DOS de manejo de circunstancias excepcionales. El DOS usa tres interrupciones, 34 a 36 (hex 22 a 24), para manejar tres circunstancias excepcionales: la finalizacin de un programa; la accin de interrumpir (break) la ejecucin de un programa con el teclado estndar (usando las teclas Ctrl-Break o Ctrl-C), y cualquier error crtico (usualmente un error de disco o de otro tipo). Los programadores pueden afectar la accin efectuada en una capa de estas tres circunstancias cambiando el correspondiente vector de interrupcin para que apunten a la operacin que elijan. El DOS guarda una direccin segmentada por omisin para cada uno de estos vectores de interrupcin, que es preservado en el inicio de la operacin de un programa y restaurado despus de que el programa termina. Esto permite que los programadores puedan cambiar libremente estos vectores acorde a sus necesidades sin perturbar la operacin de subsecuentes programas o la operacin del mismo sistema operativo.
MC Genaro Alberto Gmez Chi. Pgina 17

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


La interrupcin 34 (hex 22): Direccin de Terminacin. La direccin asociada con la interrupcin 34 especifica dnde se pasar el control de la computadora cuando el programa termine su ejecucin. Esta direccin tambin esta almacenada en el PSP del programa. Normalmente, este servicio es usado para retornar el control al intrprete de comandos del DOS, el COMMAND.COM, cuando un programa termina. La interrupcin 35 (hex 23): Direccin de interrupcin de programas. La direccin asociada con la interrupcin 35 apunta a la rutina de manejo de interrupcin que ser invocada siempre que el DOS responda a una accin de interrupcin emitida por el teclado estndar (haciendo uso de las teclas Ctrl-Break o Ctrl-C). La respuesta habitual del DOS a esta circunstancia es terminar la ejecucin del programa. Al cambiar esta rutina de manejo de interrupcin, el programador puede hacer que el DOS efecte cualquier accin deseada, cada vez que opriman las teclas Ctrl-Break o Ctrl-C, no importando lo compleja o extensa que sea. La interrupcin 36 (hex 24): Direccin del manejador de errores crticos. La direccin asociada con la interrupcin 36 apunta a la rutina de manejo de interrupcin que es invocada siempre que el DOS detecta un error crtico o una situacin de emergencia que previene la continuacin del programa. La interrupcin coordinadora de llamadas a funciones del DOS. La interrupcin 33 (21 hex) coordina las llamadas a las funciones del DOS. Estas funciones se clasifican en funciones tradicionales, las funciones que son universales a todas las versiones del DOS, y funciones extendidas, los nuevos servicios introducidos a partir de la versin 2.0 del DOS. Es importante aclarar que, con cada versin del sistema operativo, el conjunto de servicios extendidos se incrementa con nuevas funciones. Tanto las funciones tradicionales como las extendidas son invocadas emitiendo la interrupcin 33 con el nmero de funcin requerida especificndolo en el registro AH.

MC Genaro Alberto Gmez Chi.

Pgina 18

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Los servicios tradicionales del DOS se muestran en la tabla xxx Decimal 0 1-12 13-36 37-38 39-41 42-46 38 47-56 57-59 60-70 71 72-75 76-79 84-87 88-89 Interrupcin Hexadecimal 00 01-0C 0D-24 25-26 27-29,2E 2A-2D 26 2F-38 39-38 3C-46 47 48-4B 4C-4F 54-57 58-62 Grupo Funcin que no maneja dispositivos. Dispositivos de E/S de caracteres. Funciones de administracin de archivos. Funciones que no manejan dispositivos Funciones de administracin de archivos. Funciones que no manejan dispositivos. Escritura absoluta a disco. Grupos de funciones extendidas Funciones de directorio. Funciones de administracin de archivos. Funciones de directorio. Funciones de administracin de memoria. Grupos de funciones extendidas. Grupos de funciones extendidas Adiciones versin 3.0

MC Genaro Alberto Gmez Chi.

Pgina 19

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


El ciclo de desarrollo de programas Para crear un programa ejecutable utilizando lenguaje ensamblador es necesario realizar la serie de pasos, conocida como ciclo de desarrollo de programas, que se muestra en la figura 2.1.

Edicin
Archivo de programa fuente

Ensamble
Modificacin, en caso de error Archivo de programa Objeto

Enlace
Archivo de programa ejecutable

Depuracin
Archivo de programa ejectuable

Figura.1 Ciclo de desarrollo de un programa

Para cada programa que se realice, habr eventualmente tres archivos en el disco. El paso inicial es crear un archivo de programa fuente. Para crear este programa es necesario usar un editor ASCII, como el programa EDIT de la versin 5.0 o posterior de MS-DOS. Este archivo contendr todas las instrucciones de lenguaje ensamblador que conforman nuestro programa. Por convencin, los archivos escritos en lenguaje ensamblador tienen asignados la extensin .ASM. Los mdulos de programa fuente que constituyen un programa ejecutable pueden estar organizados en una gran variedad de formas. Por ejemplo, pueden escribirse todos los procedimientos de un programa en un solo mdulo o pueden dividirse estos procedimientos en diferentes mdulos, de acuerdo a la especifidad de la tarea que realizan.

MC Genaro Alberto Gmez Chi.

Pgina 20

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


El programa en ensamblador, con extensin .ASM, es despus usado para convertir el archivo de programa fuente en un archivo objeto, utilizando un traductor de lenguaje ensamblador, tal como el Macro Assembler, o MASM, de Microsoft o el Turbo Assembler, o TASM, de Borland. Si durante el proceso de ensamblado del programa se encuentran errores en algn mdulo de programa fuente, deber regresarse al paso anterior para corregirlos antes de continuar. Para cada archivo fuente (con extensin .ASM) que se traduzca sin encontrar errores, el ensamblador crear un archivo objeto cuya extensin por omisin ser .OBJ. Tambin, durante el ensamblado de programas opcionalmente pueden generarse archivos de listado (con extensin .LST) y de referencias cruzadas (con extensin .CRF). Para combinar todos los archivos objeto que integran un programa y formar un archivo de programa ejecutable (cuya extensin por omisin es .EXE), deber utilizarse un programa enlazador o ligador. Durante este curso se har uso del enlazador Turbo Link, o TLINK, de Borland, aunque tambin puede utilizarse el programa LINK de Microsoft. En este paso opcionalmente pueden crearse archivos con mapas del ejecutable producido, con extensin .MAP. El archivo ejecutable debe ser depurado para descubrir errores lgicos. La depuracin puede involucrar las siguientes tcnicas: Ejecutar el programa para estudiar su entrada y su salida. Estudiar archivos fuente (.ASM) y de listado (.LST). Utilizar el programa CREF para crear un archivo de listado de referencias cruzadas (.REF) Utilizar un depurador, como Turbo Debugger de Borland Int'l, para seguir la ejecucin del programa. Si algn error lgico es encontrado durante la depuracin, deber retornarse al primer paso (edicin) para corregir el cdigo fuente. Todo o parte de este ciclo de desarrollo de programas puede ser automatizado utilizando el programa MAKE para realizar archivos de descripcin. MAKE generalmente es til para desarrollar programas complejos que involucran numerosos mdulos fuente. En caso de desarrollar programas de un solo archivo fuente, es ms eficiente utilizar archivos de procesamiento de lotes del DOS.

MC Genaro Alberto Gmez Chi.

Pgina 21

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Ensamblando y ejecutando un programa Para facilitar el manejo del ciclo de desarrollo de programas, en esta seccin se desarrolla un archivo de procesamiento por lotes que realiza las etapas de ensamblado del programa fuente, ligado de los mdulos objetos y ejecucin o depuracin opcional del programa. El programa batch del DOS ALE.BAT, mostrado en la figura 2.2, permite que el programador realice automticamente las tareas del ciclo de desarrollo de programas, detenindose en cualquier etapa, en caso de que algn error ocurra.
@ECHO OFF REM ALE.BAT REM Ensambla, enlaza y ejecuta o depura el programa REM pasado como argumento. REM Sintaxis: REM ALE filename [x] REM Donde: REM filename es el nombre del archivo fuente REM y x es cualquier carcter opcional, que evita REM la depuracin del programa, para simplemente REM ejecutarlo REM Autor: Ing. Jorge Luis Chuc Lpez IF NOT EXIST %1.ASM GOTO FIN DEL %1.OBJ TASM %1,%1; IF NOT EXIST %1.OBJ GOTO FIN TLINK %1,%1,NUL; IF NOT EXIST %1.EXE GOTO FIN IF NOT "A%2" == "A" GOTO EJECUTAR TD %1 GOTO FIN: :EJECUTAR %1 :FIN Figura 2.2. ALE.BAT, un archivo batch para ensamblar, ligar y ejecutar o depurar un archivo .ASM

Para la operacin del programa se asume que se est utilizando el ensamblador y el ligador, TASM y TLINK respectivamente, de Borland. Adems, no hace uso de las caractersticas avanzadas de estos productos y opera utilizando nicamente las opciones establecidas por omisin. Tambin, en el PATH del DOS debern agregarse los directorios donde se encuentran instalados ambos productos de Borland.
La sintaxis del programa es: ALE filename [x]

MC Genaro Alberto Gmez Chi.

Pgina 22

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Donde filename es el nombre del archivo a ensamblar, sin proporcionar su extensin, x es un parmetro opcional que permite que despus de ensamblar y ligar el programa, el ejecutable resultante se ejecute. Por omisin el ejecutable es sometido a depuracin utilizando el Turbo Debugger de Borland Intl, La figura 2.3 muestra el programa HOLA.ASM que despliega el mensaje "Hola a todos." en la pantalla. Este programa ser utilizado para mostrar el funcionamiento del archivo batch ALE.BAT.
;********************************************** ; Archivo: HOLA.ASM ; Autor: Ing. Jorge Luis Chuc Lpez ; Fecha de creacin: 25/08/93 ; ltima revisin: 30/08/93 ; Propsito: Despliega un mensaje en la pantalla. ;********************************************** .MODEL small .STACK 200h ; 512 Kb para la pila ; ; --- Definicin del segmento de datos --.DATA Msg DB 'Hola a todos',0Ah, 0Dh, '$' ; ; --- Definicin del segmento de cdigo --.CODE Inicio: mov ax,@data ;Asigna a DS el registro de datos mov ds,ax mov dx,OFFSET Msg ;Carga en DX el desplazamiento ; Mensaje nmero uno mov ah,9 ;# Fn DOS. Despliega una cadena int 21h ;Solicita servicio al DOS mov ah,4Ch ;# Fn DOS. Termina el programa int 21h ;Solicita servicio al DOS END Inicio ; El programa inicia en la etiqueta ; Inicio Figura 2.3. Programa HOLA.ASM

Cuando se proporciona el comando


ALE HOLA

El archivo de procesamiento por lotes realiza el siguiente trabajo: Verifica que el archivo que se desea ensamblar exista. De otra forma salta al final del archivo, sin hacer nada.

MC Genaro Alberto Gmez Chi.

Pgina 23

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Si el archivo fuente existe, la tercera lnea borra el archivo .OBJ del proceso de ensamblado que se haya realizado previamente. Si anteriormente no se hubiese realizado el ensamblado del programa fuente, esta lnea desplegar un mensaje de error que no afectar el proceso en lote del archivo ALE.BAT. La lnea TASM %1,%1 Ejecuta al programa TASM para realizar la traduccin del programa fuente y producir el programa objeto. La lnea siguiente verifica que el archivo .OBJ est presente. Su ausencia indica un error durante el proceso de ensamblado, lo que ocasionar que se d por terminado el procesamiento del ciclo de desarrollo de programas. La lnea
TLINK %1,%1,NUL

Ejecuta el programa Turbo Link que enlazar los mdulos para producir el programa ejecutable. Si hubiese algn error durante el ligado de los mdulos existentes, la siguiente lnea se encargar de verificarlo al probar la existencia del archivo con extensin .EXE. La lnea
IF NOT "A%1" == "A" GOTO EJECUTAR

Verificar si el programador ha proporcionado un segundo parmetro en la lnea de comando que ejecuta el archivo batch. Si lo anterior es cierto, se ejecutar el programa ejecutable producido por TLINK; si no se proporciona segundo parmetro, se estar indicando que se desea depurar el archivo ejecutable y se invocar al programa Turbo Debugger para seguir la ejecucin lgica del programa ejecutable. El formato de una lnea en lenguaje ensamblador 8086 Las lneas de cdigo fuente de lenguaje ensamblador tienen el siguiente formato:
<etiqueta> <instruccin/directiva> <operandos> <;comentario>

Donde <etiqueta> es un nombre simblico opcional; <instruccin/directiva> es un nemnico para una instruccin o una directiva; <operandos> contiene una combinacin de cero, uno o dos (y algunas pocas veces ms) constantes, referencias de memoria, referencias de registro y cadenas de texto, segn lo requiera la instruccin particular o la directiva; <;comentarios> es un comentario opcional.

MC Genaro Alberto Gmez Chi.

Pgina 24

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


El campo de etiquetas Las etiquetas son nombres usados para referenciar a nmeros y cadenas de caracteres o localizaciones de memoria dentro de un programa. Las etiquetas permiten al programador asignarle un nombre a una variable de memoria, a valores y a las localizaciones de bloques de instrucciones particulares. Las etiquetas pueden consistir de los siguientes caracteres:
Letras del alfabeto (A - Z, a - z) Dgitos (0 - 9) Carcter de subrayado (_) Signo de pesos ($) Signo de interrogacin (?)

Los dgitos (0 - 9) no pueden ser utilizados como el primer carcter de una etiqueta. El signo de pesos ($) y el signo de interrogacin (?) solos no pueden ser utilizados como un smbolo, puesto que as tienen un significado especial. Cada etiqueta debe ser definida slo una vez1; esto es, deben ser nicas. Las etiquetas pueden ser usadas como operandos cualquier nmero de veces. Una etiqueta puede aparecer sola en una lnea; es decir, sobre una lnea sin una instruccin o directiva. En este caso, el valor de la etiqueta es la direccin de la instruccin o directiva en la siguiente lnea del programa. Las etiquetas que aparecen solas en una lnea o acompaadas de instrucciones o directivas deben finalizar con un smbolo de dos puntos (:). Otras etiquetas generalmente no finalizan con este smbolo. En el programa ejemplo HOLA.ASM se utilizan dos etiquetas: Msg, que es el nombre asignado a la cadena de caracteres Hola a todos,0Ah,0Dh,$, almacenada en el segmento de datos del programa, e Inicio que, aunque aparezca sola en una lnea del programa, representa la direccin donde se almacena en memoria la instruccin
mov ax,@data

En la lnea

mov

dx,OFFSET Msg

1Esta

regla tiene su excepcin en el procesamiento de macros del ensamblador, donde es posible definir ms de una vez un identificador o etiqueta.

MC Genaro Alberto Gmez Chi.

Pgina 25

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Se est instruyendo al microprocesador para que almacene en el registro DX el desplazamiento que hay que recorrer, a partir del inicio del segmento de datos, para alcanzar la direccin donde inicia la cadena de caracteres representada por la etiqueta Msg.

El campo de instrucciones y directivas


El campo clave en una lnea de cdigo ensamblador es el campo <instruccin/directiva>. Este campo puede contener un nemnico de instruccin o una directiva. Los nemnicos de instrucciones son los nombres legibles para las instrucciones de lenguaje mquina que el 8086 ejecuta directamente. ADD, MOV y JMP son nemnicos de instrucciones, correspondientes directamente a las instrucciones de adicin, movimiento y salto incondicional del 8086. El ensamblador se encargar de traducir estos nemnicos de instruccin a sus correspondientes instrucciones de cdigo mquina. En el programa HOLA.ASM, el bloque
mov mov mov mov int mov int ax,@data ds,ax dx,OFFSET Msg ah,9 21h ah,4Ch 21h

Representa el conjunto de instrucciones que despliega el mensaje en la pantalla. Las directivas, por su parte, generalmente no producen cdigo ejecutable, sino que controlan varios aspectos de como opera el ensamblador, del tipo de cdigo ensamblado, de los segmentos usados, etc. En otras palabras, las directivas instruyen al ensamblador de ciertos aspectos relativos a la traduccin de lenguaje ensamblador a lenguaje de mquina. Las directivas utilizadas en el programa HOLA.ASM estn escritas en maysculas, para distinguirlas de los mnemnicos de instruccin. Sin embargo, las directivas pueden ser escritas en minsculas o en maysculas y minsculas.

El campo de operandos
Los nemnicos de instrucciones y las directivas le dicen al ensamblador qu hacer. Los operandos, por otra parte, le dicen al ensamblador qu registros, parmetros, localizaciones de memoria, etctera, estn asociados a cada instancia de una instruccin o

MC Genaro Alberto Gmez Chi.

Pgina 26

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


directiva. Una instruccin MOV no significa nada por s misma; son necesarios los operandos para decirle al ensamblador de dnde tomar el valor a mover y dnde lo almacenar. Se requieren uno, dos o ms operandos para diferentes instrucciones, y virtualmente cualquier nmero de operandos que se ajusten en una lnea pueden ser aceptados por varias directivas; el nmero correcto de operandos depende de la instruccin o directiva especficas. Los operandos pueden ser registros, valores constantes, etiquetas, variables de memoria y cadenas de texto. Operandos registros Los registros son quiz los operandos ms frecuentemente usados por las instrucciones. Hay poco que pueda ser hecho con las constantes etiquetas o variables de memoria que no pueda ser realizado con los registros; por otra parte, algunas instrucciones nicamente pueden usar a los registros como operandos. Para usar un registro como un operando, se especifica el nombre del registro como el operando de la instruccin. Operandos constantes A menudo es necesario utilizar un valor constante como un operando. Los caracteres pueden ser usados como operandos constantes puesto que un carcter tiene un valor bien definido. Los valores constantes pueden ser especificados en notacin binaria, octal, hexadecimal o decimal. Algunas instrucciones no permiten utilizar a las constantes como sus operandos. Expresiones Pueden utilizarse expresiones constantes en cualquier lugar donde se acepte un operador constante. Muchos ensambladores soportan la evaluacin de expresiones completas, incluyendo parntesis anidados, operadores aritmticos, relacionales y lgicos y una extensa variedad de operadores para propsitos tales como extraer los componentes de segmento y desplazamiento de etiquetas y la determinacin del tamao de las variables de memoria. Es importante resaltar que las expresiones debern evaluar a un valor constante. Operandos de etiqueta Las etiquetas pueden servir como operandos de muchas instrucciones. Dados los operadores apropiados, las etiquetas pueden usarse para generar valores constantes. Las
MC Genaro Alberto Gmez Chi. Pgina 27

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


etiquetas tambin pueden ser usadas como destino de las instrucciones procedimientos) y JMP (bifurcaciones incondicionales). El campo de comentarios Por ltimo, pero no soslayable, tenemos al campo de <;comentarios>. Los comentarios no hacen nada, en el sentido de que no afectan el cdigo del archivo ejecutable generado por el ensamblador, pero eso no significa que no sean importantes. El lenguaje ensamblador, a diferencia de los lenguajes de alto nivel estructurados, no cuenta con estructuras de control interconstruidas que hagan los programas virtualmente autodocumentables. Al contrario de esto, el cdigo del lenguaje ensamblador est lejos de ser estructurado y fcil de mantener. Para facilitar esta caracterstica, es necesario agregar comentarios a las lneas de cdigo del lenguaje ensamblador. Un enfoque til de comentar un programa de lenguaje ensamblador es poner un comentario en el margen derecho de cada instruccin que agregue un poco de explicacin a la accin que realiza. Este tipo de comentarios debe estar precedido de un smbolo de punto y coma (;). Directivas de definicin de segmento Los segmentos son una parte fundamental de la programacin en lenguaje ensamblador para la familia de procesadores 80x86. Estn estrechamente relacionados con la arquitectura segmentada usada por los microprocesadores de 16 y 32 bits de Intel. Un segmento es una coleccin de instrucciones o datos cuyas direcciones son relativas al mismo registro de segmento. El control de segmentos es uno de los aspectos ms complejos del lenguaje ensamblador del 8086. Los segmentos pueden ser definidos usando uno de los dos conjuntos de directivas de control de segmentos proporcionados por Turbo Assembler. El primer conjunto, consistente de las directivas de segmento simplificadas, hace relativamente fcil el control de los segmentos y es ideal para enlazar mdulos de ensamblador a lenguajes de alto nivel, pero soporta slo algunas de las caractersticas relacionadas con los segmentos de que es capaz Turbo Assembler. El segundo conjunto, consistente de las directivas de segmento estndar, son ms complicadas en su uso, pero proporciona el control de segmento completo requerido por las aplicaciones implementadas completamente en lenguaje ensamblador.
CALL

(llamadas a

MC Genaro Alberto Gmez Chi.

Pgina 28

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Directivas de segmento simplificadas Las principales directivas de segmento simplificadas son .STACK, .CODE, .DATA, .MODEL y DOSSEG. Las directivas .STACK, .CODE y .DATA .STACK, .CODE y .DATA definen los segmentos de pila, cdigo y datos, respectivamente. La directiva .STACK define el tamao de la pila. Por ejemplo .STACK 200h Define una pila de 200h (512) bytes de longitud. Eso es todo lo que tiene que hacerse en lo que se refiere a la pila; simplemente el programador debe asegurarse de que tiene una directiva .STACK en su programa y Turbo Assembler administrar la pila por l. Para los programas normales, que no hacen un uso intensivo de la pila, 200h bytes es un buen tamao de pila. La directiva .CODE marca el inicio del segmento de cdigo del programa. Esta directiva le dice a Turbo Assembler exactamente en qu segmento de cdigo debe ejecutar las instrucciones. La definicin del segmento de cdigo es aun ms simple de definir que el segmento de pila, utilizando las directivas de segmento simplificadas, puesto que no requiere de operandos. Por ejemplo,
... .CODE sub ax,ax ; Inicializa el acumulador a cero mov cx,100 ; # de ciclos a ejecutar

.DATA, por su parte, marca el inicio del segmento de datos. En este segmento debern colocarse las variables de memoria. Por ejemplo:
ErrorMessage Counter ... .DATA DB 0Dh,0Ah,'*** Error ***',0Dh,0Ah,'$' DW ? ...

A diferencia de las directivas de segmento anteriores, .DATA presenta cierta complejidad: en el cdigo del programa, debe cargarse explcitamente el registro DS con el smbolo @data, antes de que se realicen accesos a localizaciones de memoria existentes en el segmento definido por .DATA. Puesto que un registro de segmento puede ser cargado con el contenido de un registro de propsito general o una localizacin de memoria, pero no con una constante, el registro de segmento es generalmente cargado con una secuencia de dos instrucciones:
... mov ax,@data

MC Genaro Alberto Gmez Chi.

Pgina 29

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


mov ... ds,ax

Esta secuencia de instrucciones inicializa DS para que apunte al segmento de datos que inicia con la directiva .DATA. Sin las dos instrucciones que inicializan el registro DS con el segmento definido por .DATA, las variables de memoria que residen en el segmento .DATA no podrn ser accedidas a menos que DS apunte a este segmento. Los registros de segmento CS y SS son inicializados por el DOS cuando un programa inicia, por lo tanto no debern ser cargados explcitamente como se hace con el registro DS. Mientras que CS apunta a las instrucciones y SS apunta a la pila, DS apunta a los datos. Los programas no pueden manipular directamente el cdigo y la pila; pero trabajan constantemente con los datos de manera directa. Adems, los programas pueden tener datos en diferentes segmentos a la vez; recurdese que el 8086 permite acceder cualquier localidad de memoria en un rango de 1 Mb, pero nicamente en bloques de 64 Kb (relativo a un registro de segmento) a la vez. Por lo tanto, al principio el programador querr inicializar el registro DS con un segmento, acceder datos en ese segmento y despus cargar DS con otro segmento para acceder un bloque diferente de datos. Este esquema es utilizado generalmente en los programas ms grandes de lenguaje ensamblador. El registro ES, por su parte, es cargado tal y como se hace con el registro DS. A menudo, puede necesitarse trabajar con los dos segmentos de datos: el segmento de datos normal, apuntado por DS, y el segmento de datos extra, apuntado por ES. La directiva DOSSEG La directiva DOSSEG causa que los segmentos en un programa de ensamblador sean agrupados acorde a las convenciones de ordenamiento de segmentos de Microsoft. Para la mayora de las programas escritos completamente en lenguaje ensamblador el uso de esta directiva asegura que se desempeen correctamente. No es necesario especificar DOSSEG cuando se enlazan mdulos de lenguaje ensamblador con lenguajes de alto nivel, debido a que los lenguajes de alto nivel automticamente seleccionan el ordenamiento de segmentos de Microsoft; sin embargo, es til su utilizacin para recordar que clase de ordenamiento de segmentos est en efecto. Por lo tanto, el enfoque ms simple es usar DOSSEG como la primera lnea en todos los programas (a menos que se tengan razones para no hacerlo).

MC Genaro Alberto Gmez Chi.

Pgina 30

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


La directiva .MODEL .MODEL especifica el modelo de memoria para un mdulo de lenguaje ensamblador que usa las directivas de segmento simplificadas. Los modelos de memoria2 disponibles se especifican en la tabla 2.1. Se conoce como cdigo NEAR a aquel cdigo en el que las bifurcaciones (o saltos) se realizan cargando nicamente el registro IP, mientras se denomina cdigo FAR a aquel cdigo que es bifurcado cargando los registros CS e IP. Similarmente, los datos NEAR son accedidos con slo un desplazamiento, mientras que los datos FAR deben ser accedidos con una direccin completa de segmento: desplazamiento. Brevemente, far significa que se utilizan direcciones completas de 32 bits, segmento: desplazamiento, mientras que near significa que se hace uso de desplazamientos de 16 bits. Pocos programas de ensamblador requieren ms de 64 Kb de cdigo o datos, as que el modelo SMALL es til en casi todas las aplicaciones. Modelo de Memoria
tiny small medium

Descripcin
El cdigo y los datos del programa deben ajustarse dentro del mismo segmento de 64 Kb. Cdigo y datos son near. El cdigo del programa debe ajustarse dentro de un segmento simple de 64 Kb, y los datos del programa deben estar en otro segmento separado de 64 Kb. Cdigo y datos son near. El cdigo del programa puede ser mayor que 64 Kb, pero los datos del programa deben ajustarse en un slo segmento de 64 Kb. El cdigo es far, mientras que los datos son near. El cdigo del programa debe estar dentro de un segmento de 64 Kb, pero los datos del programa pueden ocupar ms de 64 Kb. El cdigo es near, mientras que los datos son far. Ningn arreglo de datos puede ser mayor de 64 Kb. El cdigo y los datos del programa pueden ocupar ms de 64 Kb, pero ningn arreglo de datos puede ser mayor de 64 Kb. El cdigo y los datos son far. El cdigo y los datos del programa pueden ocupar ms de 64 Kb y los arreglos de datos puede exceder los 64 Kb. El cdigo y los datos son far. Los apuntadores a elementos dentro de un arreglo son far. Tabla 2.1. Modelos de memoria

compact

large huge

2Los

modelos de memoria descritos corresponden a los modelos de memoria utilizados por Turbo C y muchos otros compiladores para la PC y sistema operativo MS-DOS.

MC Genaro Alberto Gmez Chi.

Pgina 31

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


La directiva .MODEL es requerida si se utilizan las directivas de segmento simplificadas, puesto que de otra manera TASM no podra saber cmo inicializar los segmentos definidos con .CODE y .DATA. La directiva .MODEL debe preceder a .CODE, .DATA y .STACK. La directiva END Todos y cada uno de los programas, independientemente que utilicen directivas de segmento simplificadas o estndar, deben contener una directiva END para marcar el final del cdigo fuente del programa. Las lneas de cdigo que sigan a la directiva END son ignoradas por Turbo Assembler. Si se omite la directiva END el ensamblador generar un error. Adems de terminar el programa fuente, END opcionalmente realiza una doble funcin al indicar dnde deber iniciar la ejecucin del programa. Muchas veces, por alguna razn, puede no desearse iniciar la ejecucin del programa en la primera instruccin del archivo, por lo que deber hacer uso de la directiva END y proporcionar la etiqueta donde se desee que empiece a ejecutarse el programa. En un programa consistente de nicamente un mdulo (esto es, un archivo de cdigo fuente), la directiva END deber siempre especificar la direccin de inicio de ejecucin del programa. En un programa consistente de ms de un mdulo, nicamente la directiva END en el mdulo conteniendo la instruccin en la que el programa empezar a ejecutarse deber especificar la direccin de inicio; las directivas END en todos los otros mdulos debern aparecer como END, sin especificar direccin de inicio.

MC Genaro Alberto Gmez Chi.

Pgina 32

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Modelo de programa utilizando las directivas de segmento simplificadas La figura 2.4 muestra el modelo de programa en lenguaje ensamblador, que hace uso de directivas de segmento simplificadas. Este modelo puede grabarse y ser utilizado cada vez que se inicie un nuevo programa
.MODEL small ; ; --- Definicin del segmento de pila --.STACK 200h ; ; --- Definicin del segmento de datos --.DATA ; ; --- Declaracin de variables del programa --; ... ; ; --- Definicin del segmento de cdigo --.CODE Inicio: mov ax,@data mov ds,ax ... ; Cdigo del programa haciendo uso de las variables ; declaradas en el segmento de datos. ... mov ah,4Ch int 21h END Inicio Figura 2.4. Modelo de programa utilizando directivas de segmento simplificadas.

Directivas de segmento estndar El modelo de programa que se lista en la figura 2.5 presenta un marco de trabajo que sustituye las directivas de segmento simplificadas por las directivas de segmento estndar. Las directivas de segmento simplificadas hacen ms fcil el trabajo de ligar mdulos de lenguaje ensamblador con programas escritos en lenguajes de alto nivel. Las directivas de segmento estndar, por su parte, proporcionan un control de segmento ms completo y son utilizadas para programas escritos totalmente en lenguaje ensamblador.

MC Genaro Alberto Gmez Chi.

Pgina 33

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


; --- Definicin del segmento de pila --Pila SEGMENT PARA STACK 'STACK' DB 200h DUP(?) Pila ENDS ; ; --- Definicin del segmento de datos --Datos SEGMENT WORD PUBLIC 'DATA' ; ; --- Declaracin de variables del programa --Datos ENDS ; ; --- Definicin del segmento de cdigo --Codigo SEGMENT WORD PUBLIC 'CODE' ASSUME cs:_TEXT, ds:_DATA, ss:STACk Inicio: mov ax,Datos mov ds,ax ... ; Cdigo del programa haciendo uso de las variables ; declaradas en el segmento de datos. ... mov ah,4Ch int 21h Codigo ENDS END Inicio Figura 2.5. Modelo de programa utilizando directivas de segmento estndar.

La directiva SEGMENT SEGMENT define el inicio de un segmento. La etiqueta precediendo a la directiva SEGMENT es el nombre del segmento; Por ejemplo, en el programa modelo anterior, la lnea
Datos SEGMENT WORD PUBLIC 'DATA'

Define el inicio de un segmento llamado DATOS. La directiva SEGMENT puede especificar opcionalmente a un conjunto de atributos de segmento que le dan instrucciones al ligador y al ensamblador de cmo establecer y combinar los segmentos. Los atributos pueden ser especificados en cualquier orden y no es necesario proporcionarlos todos para un segmento. El atributo de alineacin El atributo opcional align define el rango de direcciones de memoria de la que puede seleccionarse una direccin de inicio para el segmento. Los valores que puede tomar un atributo se muestra en la tabla 2.2.
MC Genaro Alberto Gmez Chi. Pgina 34

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Tipo de alineacin BYTE WORD Significado Usa la direccin del siguiente byte disponible Usa la direccin de la siguiente palabra disponible (2 bytes por palabra) Usa la direccin de la siguiente doble palabra disponible (4 bytes por doble palabra); el tipo de alineacin DWORD normalmente es utilizado en segmentos de 32 bites con procesadores 80386 o superiores Usa la siguiente direccin de prrafo disponible (16 bytes por prrafo) Usa la siguiente direccin de pgina disponible (256 bytes por pgina) Tabla 2.2. Atributos de alineacin

DWORD

PARA PAGE

Si no se proporciona el atributo de alineacin, por omisin se utiliza el tipo PARA. El ligador utiliza la informacin de alineacin para determinar la direccin de inicio relativa para cada segmento. El DOS utiliza esta informacin para calcular la direccin de inicio actual cuando el programa es cargado en memoria. El atributo de combinacin El atributo opcional combine define cmo combinar segmentos que tienen el mismo nombre. El atributo de combinacin puede tener cualquiera de los siguientes valores mostrados en la tabla 2.3.
Tipo de combinacin PUBLIC Significado Concatena todos los segmentos que tienen el mismo nombre para formar un segmento simple contiguo. Todas las direcciones de instrucciones y datos en el nuevo segmento son relativos a un registro de segmento simple y todos los desplazamientos son ajustados para que representen la distancia desde el inicio del segmento.

MC Genaro Alberto Gmez Chi.

Pgina 35

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Tipo de combinacin STACK Significado Concatena todos los segmentos que tienen el mismo nombre para formar un segmento simple contiguo. Este tipo de combinacin es similar al tipo de combinacin PUBLIC, con la excepcin de que todas las direcciones en el nuevo segmento son relativas al registro de segmento SS. El registro apuntador de la pila (SP) es inicializado con la longitud del segmento. El segmento de pila de tu programa deber usar normalmente el tipo STACK, puesto que automticamente inicializa el registro SS. Si se crea un segmento de pila y no se le aplica el atributo STACK, deber proporcionarse las instrucciones para inicializar los registros SS y SP. Crea segmentos sobrepuestos colocando el inicio de todos los segmentos que tienen el mismo nombre en la misma direccin. La longitud del rea resultante es la longitud del segmento ms largo. Todas las direcciones en los segmentos son relativas a la misma direccin base. Si las variables son inicializadas en ms de un segmento que tiene el mismo nombre y el atributo COMMON, los datos ms recientemente inicializado reemplaza cualquier dato previamente inicializado. Concatena todos los segmentos que tienen el mismo nombre a una forma de segmento contiguo simple. Algunos ligadores tratan a los segmentos MEMORY exactamente igual que los segmentos PUBLIC. Causa que todas las direcciones de etiquetas y variables definidas en el segmento sean relativas a la direccin address Tabla 2.3. Atributos de combinacin de segmentos

COMMON

MEMORY

AT address

Si ningn atributo de combinacin es proporcionado, el segmento tendr un atributo PRIVATE (Privado). Los segmentos que tienen el mismo nombre no son combinados. Cada segmento recibe su propio segmento fsico cuando es cargado en memoria. Aunque un nombre de segmento puede ser usado ms de una vez en un archivo fuente, cada definicin de segmento que usa el mismo nombre debe tener exactamente los mismos atributos o atributos que no caen en conflictos. Si los atributos son dados para una definicin de segmento inicial, las definiciones subsecuentes para ese segmento no necesitan especificar los atributos. Normalmente en un programa deber proporcionarse al menos un segmento de pila (teniendo un atributo de combinacin STACK). Si no se declara segmento de pila, el ligador generalmente desplegar un mensaje de precaucin. Deber ignorarse este mensaje si se
MC Genaro Alberto Gmez Chi. Pgina 36

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


desea una razn especfica para no declarar un segmento de pila, como por ejemplo, cuando se est creando un programa con formato .COM. El atributo de clase El atributo de clase es un medio de asociar segmentos que tienen diferentes nombres, pero propsitos similares. Puede ser usado para controlar el orden de los segmentos e identificar al segmento de cdigo. El nombre de la clase debe estar encerrado en comillas simples (). Todos los segmentos pertenecen a una clase. Los segmentos a los que no se les especifica una clase explcitamente tienen el nombre de clase nulo. Los nombres asignados a los atributos de clase de los segmentos no debern ser utilizados en otras definiciones de smbolos en el archivo fuente. El ligador espera que los segmentos que tienen el nombre de clase CODE o un nombre de clase con el sufijo CODE contengan el cdigo del programa. Deber siempre asignarse este nombre de clase a los segmentos que contienen instrucciones del programa. Los segmentos de datos por lo general tienen el nombre de clase DATA, mientras que el segmento de pila de un programa tendr un atributo de clase STACK. La directiva ENDS La directiva ENDS define el final de un segmento. Por ejemplo,
Datos ENDS

Finaliza el segmento cuyo nombre es DATOS, y que anteriormente debi ser iniciado con una directiva SEGMENT. Cuando se utilizan directivas de segmento estndar, debe finalizarse explcitamente todos los segmentos que se definan. La directiva ASSUME ASSUME le dice a Turbo Assembler qu segmento inicializa un registro de segmento dado. Una directiva ASSUME CS: se requiere en todos los programas que usan las directivas de segmento estndar, debido a que TASM necesita conocer el segmento de cdigo para inicializar un programa ejecutable. Adems, usualmente tambin se necesitan directivas ASSUME DS: y ASSUME ES: para que Turbo Assembler sepa qu localizaciones de memoria pueden direccionarse en un momento dado.

MC Genaro Alberto Gmez Chi.

Pgina 37

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


ASSUME le dice a TASM que verifique que cada acceso a una variable de memoria con nombre sea vlido, de acuerdo a los valores actuales de los registros de segmento. Por ejemplo, considere la siguiente seccin de cdigo:
Data1 Var1 Data1 SEGMENT WORD 'DATA' DW 0 ENDS ... SEGMENT WORD 'DATA' DW 0 ENDS

Data2 Var2 Data2 Code

SEGMENT WORD 'CODE' ASSUME cs:Code ProgramStart: mov ax,Data1 mov ds,ax ;Inicializa DS con Data1 ASSUME ds:Data1 mov ax,[Var2] ;Trata de cargar Var2 en AX --Esto ;causar un error, puesto que Var2 ;no puede ser encontrado en el ;segmento Data1 ... mov ah,4Ch int 21h Code ENDS END ProgramStart

Durante el ensamblado de este programa, ocurrir un error debido a que el cdigo trata de acceder la variable de memoria VAR2 cuando el registro DS est puesto al segmento DATA1, y VAR2 no puede ser direccionado a menos que DS sea puesto al segmento DATA2. Es importante entender que TASM no sabe en ese momento que DS ha sido puesto al segmento DATA1; en cambio, usando el enunciado ASSUME, se le dice a Turbo Assembler que haga esa suposicin. ASSUME es la manera en que se le dice al ensamblador qu registros de segmento estn inicializados en un momento dado, de tal forma que TASM puede hacerte saber cundo se ha intentado algo imposible. Sin embargo, todos los errores de este tipo no pueden ser atrapados por Turbo Assembler. Siempre que una referencia a memoria involucra una variable de memoria con nombre, tal como las variables VAR1 y VAR2 anteriores, TASM puede checar la validez de la referencia, puesto que cada variable de memoria con nombre est explcitamente asociada con un segmento. No hay forma de que el ensamblador pueda saber qu segmento pretende acceder una instruccin como esta:
mov al,[bx]

MC Genaro Alberto Gmez Chi.

Pgina 38

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


En tal caso, TASM debe suponer que el segmento al que DS est inicializado es el que se pretende acceder. En algunos casos puede usarse un registro de segmento diferente que DS (ES, por lo general) para acceder memoria utilizando la directiva ASSUME. Por ejemplo, considrese esta versin corregida del programa anterior:
Data1 Var1 Data1 Data2 Var2 Data2 Code SEGMENT WORD 'DATA' DW 0 ENDS ... SEGMENT WORD 'DATA' DW 0 ENDS SEGMENT WORD 'CODE' ASSUME cs:Code

ProgramStart: mov ax,Data1 mov ds,ax; Inicializa DS con Data1 ASSUME ds:Data1 mov ax,Data2 mov es,ax ASSUME es:Data2 mov ax,[Var2] ;Trata de cargar Var2 en AX --Esto ; causar un error, puesto que Var2 ;no puede ser encontrado en el ;segmento Data1 ... mov ah,4Ch int 21h Code ENDS END ProgramStart

Al ensamblar este programa TASM no reporta ningn error, pero no significa que est permitiendo al programador hacer un error. Lo que hace el ensamblador es modificar la lnea
mov ax,[Var2]

Para acceder VAR2 relativo al registro de segmento ES en vez del registro de segmento DS. Las dos directivas ASSUME han informado a TASM que DS est puesto al segmento DATA1 y que ES est usando el segmento DATA2. Entonces, cuando la instruccin MOV intenta acceder a VAR2, que est en el segmento DATA2, Turbo Assembler concluye correctamente que no hay manera de que VAR2 pueda ser accesada relativa a DS; sin embargo, VAR2 puede
MC Genaro Alberto Gmez Chi. Pgina 39

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


ser accesada relativa a ES. Consecuentemente, Turbo Assembler inserta un cdigo especial conocido como Prefijo de Anulacin de Segmento (Segment Override Prefix) en la instruccin MOV para decirle al 8086 que use el registro ES en lugar del registro DS. El programa en la figura 2.6 despliega el mensaje Hola a todos, utilizando directivas de segmento estndar:
;************************************************** ; Archivo: HOLA.ASM ; Autor: Ing. Jorge Luis Chuc Lpez ; Fecha de creacin: 25/08/93 ; Ultima revisin: 30/08/93 ; Propsito: Despliega el mensaje "Hola a Todos" en pantalla. ;************************************************** ; --- Definicin del segmento de pila --StckSeg SEGMENT PARA STACK 'STACK' DB 512 DUP(' ') StckSeg ENDS ; --- Definicin del segmento de datos --Data SEGMENT PARA PUBLIC 'DATA' Msg DB 'Hola a todos',0Ah, 0Dh, '$' Data ENDS ; ; --- Definicin del segmento de cdigo --Code SEGMENT PARA PUBLIC 'CODE' ASSUME CS:Code, DS:Data Inicio: mov ax,Data ;Asigna a DS el registro de datos mov ds,ax mov dx,OFFSET Msg ;Carga el mensaje en DX mov ah,9 ;# Fn DOS. Despliega una cadena int 21h ;Solicita servicio al DOS mov ah,4Ch ;# Fn DOS. Finaliza el programa int 21h ;Solicita servicio al DOS Code ENDS END Inicio Figura 2.6. Programa HOLA.ASM que utiliza directivas de segmento estndar.

Declarando variables de memoria


Datos inicializados
Las directivas de definicin de datos DB, DW, DD, DF, DP, DQ y DT permiten al programador definir variables de memoria de diferentes tamaos de datos.

MC Genaro Alberto Gmez Chi.

Pgina 40

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Por ejemplo, la siguiente seccin de cdigo define cinco variables de memoria inicializadas e ilustra cmo algunas de estas variables pueden ser usadas.
Directiva DB DW DD DF, DP DQ DT ... .DATA 'Z' DW DD DQ DT Define: 1 byte 2 bytes = una palabra 4 bytes = una doble palabra 6 bytes = un apuntador de palabra far 8 bytes = un quadpalabra 10 bytes Tabla 2.4. Directivas de definicin de datos

ByteVar DB WordVar DWordVar QWordVar TWordVar ... mov mov int ... add ... add adc

;1 byte 101b 2BFh 307o 100

;2 bytes (1 palabra) ;4 bytes (1 doble palabra) ;8 bytes (1 quadword) ;10 bytes ;# Fn DOS de salida en pantalla ; Carcter a desplegar ;Invoca al DOS para desplegar car.

ah,2 dl,[ByteVar] 21h ax,[WordVar]

WORD PTR [DWordVar],ax WORD PTR [DWordVar+2],dx

Inicializacin de arreglos Pueden aparecer mltiples valores en una sola directiva de definicin de datos. Por ejemplo:
Arreglo DW 0, 1, 2, 3, 4

Crea un arreglo de cinco elementos (de una palabra de tamao) cuyo nombre es ARREGLO. Cualquier nmero de valores que se ajusten en una lnea puede ser usado con las directivas de definicin de datos. En caso de que un arreglo sea demasiado grande como para ajustarse en una sola lnea, puede declararse en varias lneas, sin requerir definir etiquetas para cada una de las lneas de definicin de datos; solamente se define la etiqueta en la primera lnea del arreglo. Por ejemplo, el siguiente cdigo crea un arreglo de elementos de doble palabra llamado ARRCUADRADOS, consistente de los cuadrados de los primeros 15 nmeros enteros:
MC Genaro Alberto Gmez Chi. Pgina 41

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


ArrCuadrados ... DD ... 0, 1, 4, 9, 16 DD 25, 36, 49, 64, 81, 100 DD 121, 144, 169, 196

Turbo Assembler permite definir bloques de memoria inicializados a un valor dado con el operador DUP. Por ejemplo,
BlankArray DW 100h DUP(0)

Crea un arreglo denominado BLANKARRAY, consistiendo de 256 palabras (decimales) inicializados a cero. De la misma manera, la siguiente lnea crea un arreglo de 92 bytes, cada uno inicializado con el carcter A:
ArrayOfA DB 92 DUP('A')

Inicializando cadenas de caracteres Los caracteres son operandos vlidos para las directivas de definicin de datos, as que puede definirse una cadena de caracteres utilizando los criterios establecidos anteriormente. Ejemplo
Cadena DB 'A', 'B', 'C', 'D'

Las cadenas de caracteres se definen como arreglos con elementos del tamao de un byte, puesto que cada carcter debe almacenarse en este tipo de datos. Turbo Assembler permite definir una cadena de caracteres de una manera similar a como se realiza en los lenguajes de alto nivel, agrupando los caracteres dentro de comillas simples:
Cadena DB 'ABCD'

Si se desea utilizar los caracteres de Retorno de Carro/Alimentacin de Lnea, deben listarse separadamente sus correspondientes valores. La siguiente lnea define una cadena de texto seguida de un carcter de Retorno de Carro, un carcter de Alimentacin de Lnea y un byte cero, de terminacin de cadena, tal y como se hace en el Lenguaje C.
HelloMsg DB 'Hola, mundo', 0Dh, 0Ah, 0

MC Genaro Alberto Gmez Chi.

Pgina 42

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Inicializando con expresiones y etiquetas El valor inicial de una variable inicializada debe ser una constante, pero no necesariamente tiene que ser un nmero. Expresiones como:
Var1 Var2 DB DW 65 ((924/2)+1)

... .DATA Buffer DW 16 DUP(0) BufferPtr DW Buffer ...

Son correctas. Tambin lo son las etiquetas:

Siempre que una etiqueta es usada como un operando en una directiva de definicin de datos, es el valor de la etiqueta el que se usa, no el valor almacenado en esa etiqueta. En el ejemplo anterior, el valor inicial de BUFFERPTR es el desplazamiento de BUFFER en el segmento .DATA, no el valor cero que est almacenado en BUFFER. Datos no inicializados Algunas veces no tiene sentido asignar un valor inicial a una variable de memoria. Por ejemplo, supngase que un programa lee los siguientes diez caracteres escritos en el teclado en un arreglo llamado KEYBUFFER:
... mov mov cx,10 bx,OFFSET KeyBuffer ;# de cars. a leer ;Los cars. a ser ;ledos ; almacenados en KeyBuffer

GetKeyLoop: mov int mov inc loop ...

ah,1 ;# Fn DOS para entrada del teclado 21h ;Obtiene el siguiente carcter [bx],al ;Guarda el carcter bx ;Apunta a la sig. Localidad de ; Almacenamiento para sig. car. GetKeyLoop

Podra definirse KEYBUFFER para ser inicializado con:


KeyBuffer DB 10 DUP(0)

Pero realmente no tiene sentido, puesto que los valores iniciales en KEYBUFFER son inmediatamente sobrescritos en el ciclo GETKEYLOOP. Lo que realmente se necesita es una manera de definir variables de memoria sin inicializar. Turbo Assembler proporciona esta capacidad con el signo de interrogacin (?).
MC Genaro Alberto Gmez Chi. Pgina 43

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


El signo de interrogacin le dice al ensamblador que se est reservando una localidad de almacenamiento (memoria), pero no se est inicializando. Por ejemplo, la forma apropiada de definir KEYBUFFER sera:
KeyBuffer DB 10 DUP(?)

Esta lnea reserva 10 bytes iniciando en la etiqueta KEYBUFFER, pero no inicializa estos bytes con valor alguno. Obviamente, el programador debe asegurarse de inicializar una variable de memoria no inicializada en la definicin, antes de usarla en el programa. Localizaciones de memoria con nombre Como vimos anteriormente, con la directiva de definicin de datos DB se asigna nombre a una variable de memoria. La directiva LABEL es otra manera de asignar un nombre de una localidad de memoria, pero sin localizar almacenamiento alguno. LABEL permite especificar el nombre de una etiqueta y su tipo sin tener que definir dato alguno. Por ejemplo, el arreglo KEYBUFFER puede definirse tambin de la siguiente forma:
KeyBuffer ... LABEL BYTE DB 10 DUP(?) ...

Una etiqueta definida con LABEL puede ser de los siguientes tipos:
BYTE WORD DWORD FWORD PWORD QWORD TBYTE NEAR FAR PROC UNKNOWN

LOS TIPOS DE DATOS BYTE, WORD, DWORD, FWORD, PWORD, QWORD Y TBYTE son autoexplcitos, etiquetando elementos de 1, 2, 4, 6, 8 y 10 bytes, respectivamente. A continuacin se presenta un ejemplo, donde una variable de memoria es inicializada como un par de bytes, pero es accedida como una palabra:
... .DATA LABEL WORD DB 1,2 ... .CODE ...

WordPtr

MC Genaro Alberto Gmez Chi.

Pgina 44

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


mov ... ax,[WordPtr]

2.

En este caso, AL es cargado con 1 (el primer byte de WORDPTR) y AH es cargado con

Las etiquetas definidas mediante la directiva LABEL pueden utilizarse en expresiones de directivas de definicin de datos. Por ejemplo, las siguientes lneas inicializan la variable WORDARRAYLENGTH con la longitud en bytes de WORDARRAY:
... WordArray DW 50 DUP(0) WordArrayEnd LABEL WORD WordArrayLength DW (WordArrayEnd - WordArray) ... Si se desea calcular la longitud de WORDARRAY

en palabras de lugar de calcularlo en bytes, nicamente hay que dividir la longitud en bytes por dos;
WordArrayLengthInWords DW (WordArrayEnd - WordArray)/2

NEAR y FAR son usados en el cdigo para seleccionar el tipo de llamada a procedimiento o bifurcacin (salto) necesitado para alcanzar determinada etiqueta. Por ejemplo, en el siguiente ejemplo el primer JMP es un salto far (cargando CS e IP) debido a que es una etiqueta FAR, mientras que el segundo salto es un salto near (cargando nicamente IP) debido a que es una etiqueta NEAR:
... .CODE ... LABEL FAR LABEL NEAR mov ax,1 ... jmp FarLabel ... jmp NearLabel ...

FarLabel NearLAbel

Cuando se usan las directivas de segmento simplificadas, PROC es una manera conveniente de definir una etiqueta en el tamao apropiado, NEAR o FAR, para el modelo de cdigo actual. Cuando el modelo de memoria es TINY, SMALL o COMPACT, LABEL PROC es similar a LABEL NEAR; cuando el modelo de memoria es MEDIUM, LARGE o HUGE, LABEL PROC es similar a LABEL FAR. Esto significa que si se cambia el modelo de memoria, se pueden cambiar ciertas etiquetas automticamente tambin. Por ejemplo, en
.MODEL small

MC Genaro Alberto Gmez Chi.

Pgina 45

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


... .CODE ... LABEL PROC ...

EntryPoint

ENTRYPOINT es NEAR, pero si se cambia el modelo de memoria a LARGE, ENTRYPOINT se convertir a FAR. Normalmente el programador usa la directiva PROC en lugar de LABEL, para definir la clase de puntos de entrada que se desee cambiar conforme cambie el modelo de memoria; sin embargo, algunas veces se necesitar ms de un punto de entrada a una subrutina y entonces puede hacerse uso de LABEL, adems de PROC. Finalmente, LABEL UNKNOWN es simplemente una forma de decir que no se sabe qu tipo de datos tendr la etiqueta que se define. Modos de direccionamiento Los operandos de las instrucciones pueden especificarse en diferentes formas conocidas como modos de direccionamiento. Los modos de direccionamiento le dicen al microprocesador cmo calcular el valor actual del operando de una instruccin en tiempo de ejecucin. Existen 3 modos de direccionamiento: inmediato, de registro y de memoria. Los operandos de memoria pueden ser divididos en dos grupos, operandos de memoria directos y operandos de memoria indirectos. El microprocesador decodificar el modo de direccionamiento que est siendo referenciado por la sintaxis de la operacin. Aunque dos enunciados pueden ser similares y sus mnemnicos de instruccin sean los mismos, el ensamblador producir cdigo mquina diferente para una instruccin cuando es usada con diferentes modos de direccionamiento. Los mnemnicos de instruccin en lenguaje ensamblador pueden tener dos o ms operandos que siempre son trabajados de derecha a izquierda. El operando de la derecha es el operando fuente. Especifica el dato que ser utilizado, pero no cambiado, en la ejecucin de la instruccin. El operando de la izquierda es el operando destino. Especifica el dato que ser utilizado y posiblemente cambiado por la instruccin. Direccionamiento inmediato Consisten de datos numricos constantes que son conocidos o calculados en tiempo de ensamble del programa. El dato a ser utilizado se especifica como un valor constante
MC Genaro Alberto Gmez Chi. Pgina 46

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


dentro de la instruccin misma y es procesado de la misma manera cada vez que el programa se ejecuta. Algunas instrucciones tienen lmites para el tamao de valores inmediatos (usualmente 8, 16 y 32 bits). Las constantes de cadena de longitud mayor o igual a dos caracteres no pueden ser datos inmediatos. Deben ser almacenadas en memoria antes de que puedan ser procesadas por las instrucciones. Muchas instrucciones permiten datos inmediatos en el operando fuente y datos en memoria o registros en el operando destino. La instruccin combina o reemplaza el dato en la direccin de memoria o el registro con el dato inmediato en la forma que define la instruccin. Ejemplos de este tipo de instruccin son MOV, ADD, CMP y XOR. Unas pocas instrucciones, tal como RET e INT utilizan slo un operando inmediato. No est permitido utilizar el modo de direccionamiento inmediato en el operando destino. Direccionamiento de registros El valor del operando est almacenado en uno de los registros internos del 8086. Este puede ser un valor de 8 o 16 bits. El microprocesador interpretar la longitud del operando por el nombre del registro. La mayora de las instrucciones permiten el modo de direccionamiento de registro en uno o ms operandos. Algunas instrucciones nicamente pueden usar ciertos registros como sus operandos. Generalmente, las instrucciones producen cdigo de menor tamao y de operacin ms rpida si especifican como su operando al registro acumulador. Los registros de segmentos slo pueden ser utilizados en algunas pocas instrucciones y en circunstancias especiales. Muchas instrucciones pueden utilizar como sus operandos a datos almacenados en la memoria principal de la computadora. Cuando se proporciona un operando de memoria, el microprocesador debe calcular la direccin del dato a ser procesado. Esta direccin es conocida como la direccin efectiva. El clculo de la direccin efectiva depende del modo de direccionamiento de memoria que se especifique en el operando. Direccionamiento directo de memoria Un operando directo de memoria es un smbolo que representa la direccin (segmento y desplazamiento) de una instruccin o un dato. La direccin de desplazamiento
MC Genaro Alberto Gmez Chi. Pgina 47

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


representada por un operando directo es calculada en tiempo de ensamble. La direccin de cada operando relativo al inicio del programa es calculado en tiempo de enlace. La direccin efectiva se calcula en tiempo de carga del programa. Los operandos directos de memoria pueden ser cualquier constante o smbolo que represente una direccin de memoria. Esto incluye a etiquetas, nombres de procedimientos, variables, o el valor del contador de localizaciones de memoria durante el ensamblado del programa. La direccin efectiva es siempre relativa al registro de segmento. El registro de segmento por omisin es DS para los operandos directos de memoria, pero puede ser anulado proporcionando otro registro de segmento. El desplazamiento dentro del segmento de datos del operando est contenido en la instruccin como una cantidad de 16 bits. Este desplazamiento se suma al contenido desplazado del registro del segmento de datos (DS) para convertirlo a la direccin segmentada (o efectiva) de 20 bits. Habitualmente, el operando de direccionamiento directo es un rtulo. Direccionamiento indirecto de registros El valor del operando es sealado por una direccin de desplazamiento almacenada en uno de los siguientes registros: SI, DI, BX o, bajo algunas circunstancias, BP. El microprocesador reconoce el direccionamiento indirecto de registros por la sintaxis de la instruccin: el registro es encerrado dentro de corchetes (por ejemplo, [BX]). Este modo de direccionamiento puede ser utilizado para referenciar datos almacenados en forma de tabla. As, es posible acceder a valores individuales con una iteracin de incrementar el registro base (o cualquiera de los otros registros permitidos) y acceder a la posicin de memoria. Direccionamiento relativo de base La direccin efectiva de un operando se obtiene de la suma del contenido de un registro base (BX o BP) y un desplazamiento, relativo al segmento seleccionado. Es usado frecuentemente para acceder a estructuras de datos complejas, como registros tipo Pascal: el registro base apunta a la base de la estructura, y se selecciona un campo particular con el desplazamiento. Al cambiar el desplazamiento se accede a campos diferentes en el registro. Acceder al mismo campo en registros diferentes es tan simple como cambiar el contenido del registro base.

MC Genaro Alberto Gmez Chi.

Pgina 48

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Direccionamiento indizado directo La direccin del desplazamiento del operando se calcula sumando el desplazamiento a un registro ndice (SI o DI) en el segmento seleccionado. Frecuentemente, el direccionamiento indizado directo se utiliza para acceder a los elementos de un array (arreglo) esttico. El valor del desplazamiento localiza el inicio del array y el valor almacenado en el registro ndice selecciona un elemento simple en la estructura. De manera distinta a los registros, cuyas longitudes de campo individual pueden variar en tamao y tipo de datos, los elementos del array son homogneos. Como los elementos del array son del mismo tipo de datos y tamao, para moverse a travs del arreglo basta con incrementar o decrementar sistemticamente el desplazamiento. Direccionamiento base indizado El operando se localiza en el segmento seleccionado en un desplazamiento determinado por la suma de los contenidos del registro base, registro ndice y, opcionalmente, un desplazamiento. Si no se incluye desplazamiento, entonces el direccionamiento base indizado se utiliza con ms frecuencia para acceder a los elementos de un array dinmico (esto es, un arreglo cuya direccin base puede cambiar durante la ejecucin del programa). El incluir desplazamiento permite acceder a un elemento individual de un array, siendo el array un campo en una estructura, como por ejemplo un registro. El conjunto de instrucciones del 8086 El conjunto de instrucciones primitivas que puede realizar un microprocesador es conocido como su conjunto de instrucciones. El conjunto de instrucciones del 8086 consiste de seis tipos de instrucciones, que estn resumidas en la tabla 2.5. Programar satisfactoriamente en lenguaje ensamblador del 8086 requiere un entendimiento de todos estos tipos de instrucciones.
1. Instrucciones de transferencia de datos MOV Mover PUSH, POP Operaciones de la pila (stack) XCHG Intercambio IN, OUT Puertos de E/S 2. Instrucciones aritmticas ADD Adicin INC Incremento SUB Substraccin DEC Decremento NEG Negatividad CMP Comparar MUL Multiplicar

MC Genaro Alberto Gmez Chi.

Pgina 49

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


DIV Dividir 3. Instrucciones lgicas NOT Complemento AND AND OR OR inclusivo XOR OR exclusivo TEST Prueba de bits SHL, SHR Desplazamiento izquierda/derecha ROL, ROR Rotacin izquierda/derecha 4. Instrucciones de manipulacin de cadenas MOVS Mover cadena CMPS Comparar cadenas SCAS Inspeccionar cadena LODS Cargar de cadena STOS Almacenar en cadena 5. Instrucciones de transferencia de control CALL Llamada a una subrutina RET Retorno de una subrutina JMP Salto JN, JNZ, Etc. Saltos condicionales LOOP Iteracin LOOPNE.. Iteracin condicional INT Interrupcin IRET Retorno de interrupcin 6. Instrucciones de control del procesador CLC,STC, Etc. Aclarar/establecer banderas Tabla 2.5. El conjunto de instrucciones del microprocesador 8086

Instrucciones de transferencia de datos Las instrucciones de transferencia de datos nos permiten mover datos de un punto a otro. En general, los datos pueden ser movidos en tamaos de un byte o una palabra a la vez. Mover los datos puede parecer un concepto demasiado simple, pero la situacin se complica debido a los diferentes modos disponibles para direccionar los datos a ser movidos. La instruccin MOV mueve un dato entre los registros internos del 8086 y la memoria. Verdaderamente, ms que mover la instruccin MOV almacena una copia del operando fuente en el operando destino, sin afectar al primero. La sintaxis de esta instruccin es la siguiente:
mov destino fuente

Puede interpretarse esta instruccin de la siguiente forma: mueve el contenido de fuente hacia destino. Es importante subrayar que, por lo general, las instrucciones de
MC Genaro Alberto Gmez Chi. Pgina 50

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


lenguaje ensamblador manejan los operandos fuente y destino de manera consistente: el operando de la izquierda es el operando destino y el de la derecha es el operando fuente. acepta casi cualquier par de operandos que tienen sentido excepto cuando un registro de segmento es un operando. Cualquiera de los siguientes elementos puede utilizarse como el operando fuente de la instruccin MOV.
MOV

Una constante Una expresin que evale a un valor constante Un registro de propsito general Una localidad de memoria accesada con cualquiera de los modos de direccionamiento de memoria discutidos anteriormente. Como operando destino puede usarse cualquier registro de propsito general o una localidad de memoria. Con la instruccin MOV es posible copiar valores de tamao BYTE o palabra (WORD). En muchos casos, los operandos de MOV le dicen a Turbo Assembler exactamente qu tamao de datos ser utilizado. Si un registro de segmento est involucrado en la operacin de copia, entonces el tamao de los datos debe ser del tamao del registro. Por ejemplo, los tamaos de los datos de las siguientes instrucciones son claros:
... mov mov ... al,1 dx,1 ;Operandos de tamao byte ;Operandos de tamao palabra

De manera similar, las localizaciones de memoria tienen un tamao inherente, de tal forma que los tamaos de los datos son conocidos por TASM:
... .DATA DB DW ... .CODE ... mov mov ...

TestChar TempPtr

? TestChar

[TestChar],'A' [TempPtr],0

Algunas veces, los operandos de la instruccin MOV no tendrn un tamao definido inherente. Por ejemplo, en la siguiente instruccin, el ensamblador no tiene forma de conocer el tamao de los operandos involucrados en MOV.
MC Genaro Alberto Gmez Chi. Pgina 51

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


mov [bx],1

Y, de hecho, TASM determinar que no tiene forma de ensamblar la instruccin. Esta situacin se repite cuando el programador considera conveniente acceder temporalmente una variable del tamao de una palabra como un byte o viceversa. TASM proporciona los medios para definir flexiblemente los tamaos de los datos en la forma de los operadores WORD PTR y BYTE PTR. WORD PTR le dice a Turbo Assembler que trate un operando de memoria determinado dimensionado como una palabra, y BYTE PTR le dice a TASM que accese un operando de memoria como un operando de tamao byte, sin considerar su tamao predefinido. Por ejemplo, la ltima lnea de cdigo puede reescribirse para almacenar un valor 1 de tamao palabra en la direccin de memoria apuntada por BX.
mov WORD PTR [BX],1

WORD PTR y BYTE PTR no tienen sentido cuando son aplicados a registros, puestos que los registros son de tamao fijo. Accediendo a registros de segmento Aunque la instruccin MOV puede utilizarse para mover valores a y desde registros de segmento, este es un caso especial, ms limitado que los otros usos de MOV. Si un registro de segmento es un operando de MOV, el otro operando debe ser un registro de propsito general o una localidad de memoria. No es posible cargar directamente una constante en un registro de segmento y un registro de segmento no puede ser copiado directamente a otro registro de segmento. Por ejemplo, a continuacin se muestran dos formas de inicializar el registro de segmento ES con el valor del segmento .DATA.
DataSeg DW ... .DATA @data ... .CODE ... mov ax,@data mov es,ax ... mov es,[DataSeg] ...

Es importante notar que la instruccin MOV no es la nica instruccin que limita el uso de los registros de segmento; la mayora de las instrucciones no pueden hacer uso de los registros de segmento como operandos.
MC Genaro Alberto Gmez Chi. Pgina 52

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Moviendo datos hacia y desde la pila Las instrucciones PUSH y POP son instrucciones especiales de transferencia de datos que implementan una estructura de memoria denominada pila. Esta estructura sigue la poltica "el ltimo en entrar es el primero en salir" (Last-In, First-Out, por sus siglas en ingls). La pila siempre reside en el Segmento de Pila, lo que ocasiona que el registro SS sea siempre utilizado, durante las referencias a la pila. El registro apuntador de la pila, SP, es implcitamente usado como una direccin de memoria en todas las operaciones de la pila. La instruccin PUSH decrementa el contenido de SP en dos y despus almacena su operando en la direccin de memoria especificada por SP. La instruccin POP trae los datos de la direccin de memoria especificada por SP y lo guarda en su operando, para despus incrementar el contenido de SP en dos. Es importante notar que las instrucciones PUSH y POP siempre transfieren una palabra de datos; en contraste con la instruccin MOV, que puede mover un byte o una palabra. La instruccin MOV puede ser usada para acceder datos de la pila utilizando los modos de direccionamiento de memoria que utilizan al registro BP como un apuntador base; por ejemplo,
mov ax,[bp+4]

Carga el registro AX con el contenido de la palabra en el desplazamiento BP+4 en el segmento de pila. Acceso a puertos de Entrada/Salida Las instrucciones IN y OUT son usados para acceder los puertos de entrada/salida del 8086. Los dispositivos externos como terminales, impresoras y manejadores de disco, se comunican con el microprocesador va los puertos de E/S. Un byte de 8 bits o una palabra de 16 bits puede ser transferido a travs de un puerto de E/S. Dentro del 8086, los datos deben ser enviados siempre (o recibidos) del registro acumulador, AX. En los casos en que se transfieren nicamente 8 bits, se usa la mitad baja del acumulador, AL. La direccin de E/S se especifica como el contenido del registro DX, o como un valor inmediato contenido en la instruccin. En el caso posterior, solamente los primeros 256 puertos de E/S (direcciones de E/S 00h a FFh) pueden ser accesadas. Se muestran a continuacin ejemplos de uso de las instrucciones IN y OUT.
in out mov al,2Fh ;Entrada de un byte del puerto 2Fh 5,al ;Salida de un byte hacia el ;puerto 5 dx,3FCh

MC Genaro Alberto Gmez Chi.

Pgina 53

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


in ax,dx ;Entrada de una palabra del ;puerto 3FCh

Intercambiando datos La instruccin XCHG intercambia el contenido de sus dos operandos. El segundo operando de la instruccin XCHG debe ser siempre un registro. El primer operando puede ser accesado usando cualquiera de los modos de direccionamiento descritos en la unidad anterior, excepto el modo inmediato. La operacin de XCHG se ilustra a continuacin:
mov mov xchg ax,5 bx,10 ax,bx ; AX = 5 ; BX = 10 ; AX = 10, BX = 5

La instruccin XLATB, o trasladar, realiza una operacin de bsqueda en tabla. El contenido del registro AL se agrega al contenido del registro BX, y el valor resultante es usado como una direccin de memoria. El byte en esta direccin de memoria se coloca en el registro AL. Normalmente, esta instruccin se utiliza inicializando el registro BX para que apunte al inicio de la tabla de traduccin. La instruccin XLATB despus convierte el valor del byte en AL a su correspondiente valor de la tabla. Instrucciones aritmticas Las instrucciones aritmticas son usadas para realizar clculos aritmticos. Las instrucciones ADD, SUB y CMP tienen dos operandos. Como siempre, el primer operando especificado servir como destino para el resultado. As, la instruccin
add ax,bx

Agregar el contenido del registro AX al contenido del registro BX y colocar el resultado en el registro AX. Similarmente, la instruccin
sub ax,bx

Substraer el contenido del registro BX del contenido del registro AX y colocar el resultado en el registro AX. La instruccin de comparacin, CMP, realiza la misma operacin que la instruccin SUB, pero sin afectar a ninguno de los operandos. Es usada principalmente para activar las banderas, tal como se explic anteriormente. Las instrucciones INC, DEC y NEG utilizan slo un operando. Puede ser direccionado usando cualquiera de los mtodos de direccionamiento de memoria, excepto el inmediato. La instruccin INC (incremento) incrementa en uno a su operando.

MC Genaro Alberto Gmez Chi.

Pgina 54

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


La instruccin DEC (decremento) disminuye en uno su operando. La instruccin (negar) obtiene el complemento a dos de su operando.
NEG

La flexibilidad de estas instrucciones se ve incrementada por nuestra habilidad para usarlas con operandos de byte o palabra. En adicin, todas las instrucciones aritmticas, afectan varios bits del registro bandera para indicar el estado de su resultado. Las instrucciones de transferencia condicional pueden utilizarse para probar estos bits y cambiar el flujo de un programa. La multiplicacin y la divisin son funciones avanzadas del microprocesador y son un poco menos flexibles de usar que las funciones aritmticas ms comunes discutidas anteriormente. El operando destino es siempre el registro acumulador (AX), por lo que slo un operando fuente se codifica con la instruccin. Es importante aclarar que cuando se multiplica un byte por un byte, el resultado puede ser tan grande como una palabra. Por lo tanto, en una operacin de multiplicacin de bytes, el operando fuente (un byte) se multiplica por el contenido del registro AL, y el resultado (una palabra) es colocado en el registro AX. En el caso de una operacin de multiplicacin entre palabras, el operando fuente (una palabra) se multiplica por el contenido del registro AX. El resultado puede ser tan grande como 32 bits: la palabra de orden bajo se coloca en el registro AX y la palabra de orden superior se coloca en el registro DX. Inversamente, en una operacin de divisin utilizando bytes, el numerador, tomado como el registro entero AX, se divide por el operando fuente de un byte. El cociente es colocado en AL, y el residuo se coloca en AH. Una operacin de divisin utilizando palabras, asume un numerador de 32 bits, con la palabra de alto orden tomado del registro DX y la palabra de bajo orden tomado del registro AX. Este numerador es dividido por el operando fuente de una palabra. El cociente se coloca en AX y el residuo en DX. Las instrucciones MUL y DIV anteriormente explicadas realizan multiplicacin y divisin sin signo, respectivamente. La multiplicacin y la divisin signada pueden realizarse con las versiones de operandos de tipo entero de estas instrucciones, llamadas IMUL e IDIV. Instrucciones lgicas Las instrucciones aritmticas siempre asumen que sus operandos representan informacin numrica. Por el contraste, las instrucciones lgicas tratan a sus operandos como simples cadenas de bits. La instruccin NOT simplemente invierte cada bit en su operando, cambiando todos los ceros a unos y todos los unos a ceros. Las instrucciones AND, OR y XOR usan dos operandos: las combinaciones de operandos disponibles son las mismas que las disponibles
MC Genaro Alberto Gmez Chi. Pgina 55

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


en las operaciones aritmticas. El resultado de una instruccin AND tiene puestos los bits en las posiciones donde ambos bits de sus operandos son uno. El resultado de una instruccin OR tiene los bits puestos en aquellas posiciones donde algunos de sus operandos tiene puesto un bit. Es muy til para forzar los bits seleccionados a uno dentro de su operando destino. El resultado de una instruccin XOR tiene los bits puestos nicamente en aquellas posiciones donde alguno pero no ambos de sus operandos tiene los bits puestos. Es muy til para invertir bits seleccionados dentro de su operando destino.
Bit fuente A Bit fuente B A and B A or B A xor B 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 Tabla 2.6 La operacin de las instrucciones lgicas AND, OR y XOR

La instruccin TEST realiza la misma funcin que la instruccin AND, con la diferencia que el operando destino no es alterado. Es usado principalmente para probar si uno o ms bits especficos en un byte o palabra estn puestos (son uno). Las instrucciones lgicas siempre aclaran (ponen en cero) las banderas de acarreo (CF) y desbordamiento (OF). Adems, ellas ponen (hacen uno) la bandera de cero (ZF) para indicar si el resultado fue cero o no. Las instrucciones de desplazamiento (shift) mueven los bits hacia un lado (esto es, de izquierda a derecha o de derecha a izquierda) dentro de sus operandos. SHL (desplazamiento a la izquierda) mueve cada bit del operando destino un lugar hacia la izquierda, o hacia el bit ms significativo. El bit ms significativo es desplazado fuera del operando hacia la bandera de acarreo; el bit menos significativo es llenado con el bit cero. La figura 2.7 muestra cmo el valor 10010110b (96h) almacenado en el registro AL es desplazado hacia la izquierda con la instruccin
shl al, 1

El resultado es el valor 00101100b (2Ch), que se deposita en el mismo registro AL. La bandera de acarreo almacenar el valor 1, inicialmente en el bit ms significativo de AL. El uso ms comn de la instruccin potencias de dos.
SHL

es realizar veloces multiplicaciones por

MC Genaro Alberto Gmez Chi.

Pgina 56

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


El operando fuente de las operaciones de desplazamiento y rotacin puede ser el valor inmediato 1, que indica que el desplazamiento se realizar slo un bit, o el registro cl, para indicar la cuenta de un desplazamiento mayor que uno. El siguiente ejemplo multiplica el registro dx por cuatro.
mov cl,2 shl dx,cl

AL Bandera de acarreo

Fig. 2.7 Ejemplo de un desplazamiento a la izquierda

La instruccin SHR (desplazamiento a la derecha) es similar a SHL, slo que realiza el desplazamiento de 1 o cl bits hacia la derecha. El bit menos significativo es colocado en la bandera de acarreo y el bit ms significativo se rellena con cero. La instruccin SHR es utilizada para realizar divisiones sin signo por potencias de dos.
AL Bandera de acarreo

Fig. 2.8 Ejemplo de un desplazamiento a la derecha

Instrucciones de transferencia de control Saltos incondicionales La instruccin fundamental de bifurcacin en los microprocesadores de la familia 80x86 es la instruccin JMP. La instruccin JMP instruye al 8086 para que ejecute la instruccin en la etiqueta destino como la instruccin que sigue a JMP. Por ejemplo, cuando finaliza la ejecucin del siguiente segmento de cdigo
... mov jmp AddOneToAX: inc ax,1 AddTwoToAX ax

MC Genaro Alberto Gmez Chi.

Pgina 57

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


jmp AXIsSet AddTwoToAX: add ax,2 AXIsSet: ...

AX contiene 3, y las instrucciones nunca son ejecutadas. Aqu la instruccin


jmp AddTwoToAX

ADD

JMP

que siguen a la etiqueta AddOneToAX

Instruye al 8086 para que se le asigne al apuntador de instrucciones, el registro IP, el desplazamiento de la etiqueta AddTwoToAX, para que la siguiente instruccin a ejecutar sea
add ax,2

Algunas veces junto con la instruccin JMP se utiliza el operador SHORT. JMP usualmente utiliza un desplazamiento de 16 bits para apuntar a la etiqueta destino; SHORT instruye a TASM para que utilize un desplazamiento de 8 bits, ahorrando un byte por instruccin JMP. Por ejemplo, el ltimo ejemplo es dos bytes ms pequeo con las siguientes modificaciones:
... mov jmp AddOneToAX: inc jmp AddTwoToAX: add AXIsSet: ... ax,1 SHORT AddTwoToAX ax SHORT AXIsSet ax,2

La desventaja en usar el operador SHORT es que algunos saltos cortos pueden alcanzar a las etiquetas que se encuentran nicamente dentro del alcance de 128 bytes de la instruccin JMP, de tal forma que TASM puede informar que no puede alcanzar una etiqueta determinada debido a que est fuera del alcance de la instruccin JMP que utiliza un operador SHORT. nicamente tiene sentido utilizar saltos SHORT cuando se hacen saltos hacia adelante en el cdigo, debido a que TASM inteligentemente hace cortos los saltos hacia atrs cuando estn dentro del alcance del destino; los saltos hacia atrs que estn ms all de los 128 bytes de la instruccin JMP automticamente son tomados como saltos con desplazamiento de 16 bits.
MC Genaro Alberto Gmez Chi. Pgina 58

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


puede ser utilizado para saltar a otro segmento de cdigo, cargando los registros CS e IP con una sola instruccin. Por ejemplo,
JMP

... CSeg1 SEGMENT ASSUME cs:CSeg1 ... FarTarget LABEL FAR ... Cseg1 ENDS ... CSeg2 SEGMENT ASSUME cs:CSeg2 ... jmp FarTarget ; este es un salto far ... Cseg2 ENDS ...

Realiza un salto a otro segmento de cdigo. Finalmente, puede saltarse a una direccin almacenada en un registro o en una variable de memoria. Por ejemplo,
... mov jmp ... TestLabel: ... ax, OFFSET TestLabel ax

salta a la etiqueta TestLabel, tal y como tambin lo hace


... .DATA JumpTarget DW TestLabel ... .CODE ... jmp [JumpTarget ... TestLabel: ...

Saltos condicionales Los saltos como los descritos en la seccin anterior son nicamente parte de lo necesario para escribir programas tiles. La mayor parte de los programas se benefician de los saltos basados en la toma de decisiones. Una instruccin de salto condicional puede
MC Genaro Alberto Gmez Chi. Pgina 59

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


saltar o no a una etiqueta destino, dependiendo del estado del registro de banderas. Por ejemplo, considere el siguiente segmento de cdigo:
... mov int cmp je mov ... AWasTyped: push ... ah,1 ; #Fn DOS para entrada desde teclado 21h ; Obtiene la siguiente tecla al,A ; Se presion la letra A? AWasTyped ; S, procesa la tecla presionada [TempByte ,al ; No, almacena el carcter ax ; Guarda el carcter en la pila

Primero, el cdigo obtiene una tecla del teclado a travs de la funcin 1 del DOS. Despus, utiliza la instruccin CMP para comparar el carcter ledo con la letra A. La instruccin CMP hace que la bandera de cero (ZF) sea 1, si el resultado de la comparacin es igual, o sea aclarada (0), si la comparacin evala a diferente. La instruccin JE es una instruccin de salto condicional que salta a la etiqueta destino slo si la bandera de cero es 1. De otra forma, se ejecutar la instruccin inmediata a la instruccin JE, en este caso una instruccin MOV. La bandera de cero ser 1 slo cuando se presione la tecla A, y nicamente entonces saltar el 8086 a la instruccin PUSH en la etiqueta AWasTyped. El 8086 proporciona una gran variedad de saltos condicionales, proporcionando la habilidad de saltar conforme el estado de cualquier bandera o combinacin de banderas. Puede saltarse condicionalmente respecto al estado de las banderas de cero, acarreo, signo, paridad y desbordamiento y de acuerdo a la combinacin de banderas que indique el resultado de operaciones con nmeros con signo.
Nemnico JA JAE JB JBE JE JNE JG JGE JL JLE Significado Sinnimo Significado Salta si es superior JNBE Salta si no es inferior o igual Salta si es superior o igual JNB Salta si no es inferior Salta si es inferior JNAE Salta si no es superior o igual Salta si es inferior o igual JNA Salta si no es superior Salta si es igual JZ Salta si el resultado es cero Salta si no es igual JNZ Salta si el resultado no es cero Salta si es mayor que JNLE Salta si no es menor o igual que Salta si es mayor o igual que JNL Salta si no es menor que Salta si es menor que JNGE Salta si no es mayor o igual que Salta si es menor o igual que JNG Salta si no es mayor que Tabla 2.7. Nemnicos de instruccin de saltos condicionales y sus sinnimos

MC Genaro Alberto Gmez Chi.

Pgina 60

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Condicin Igual Diferente Mayor que No menor o igual que Menor que No mayor o igual que Mayor o igual que No menor que Menor o igual que Operador de Pascal = <> > Valores Salta cuando sin signo JE JNE JA JNBE < JB JNAE >= <= JAE JNB JBE CF=0 CF=1 or ZF=1 CF=1 JL JNGE JGE JNL JLE SF=OF ZF=1 and SF<>OF ZF=1 ZF=0 CF=0 and ZF=0 Valores con signo JE JNE JG Salta cuando ZF=1 ZF=0 ZF=0 or SF=OF SF<>OF

No mayor que JNA Tabla 2.8 Pruebas aritmticas tiles despus de una instruccin CMP.

Instrucciones de iteracin Una iteracin es un bloque de cdigo que finaliza con un salto condicional, de tal forma que el cdigo puede ser ejecutado repetidamente hasta que la condicin de terminacin sea alcanzada. El microprocesador 8086 proporciona varias instrucciones especiales para realizar iteraciones. La instruccin loop Supngase que se desea imprimir una cadena de una longitud de 10 caracteres. Esto podra ser realizado con el siguiente cdigo: Sin embargo, existe una forma ms fcil de hacerlo mediante la instruccin LOOP. La instruccin LOOP decrementa el contenido del registro CX y finaliza la iteracin si CX ha alcanzado el valor de cero. Si CX es diferente de cero, entonces se ejecutar la instruccin indicada por la etiqueta destino, operando de la instruccin LOOP. La instruccin LOOPE hace lo mismo que LOOP, excepto que LOOPE finalizar el ciclo si CX llega a cero o si la bandera de cero es 1. Es importante recordar que la bandera de cero es 1, cuando el resultado de una operacin aritmtica es cero o si los dos operandos en la ltima comparacin son iguales. La instruccin LOOPNE, por su parte, finalizar el ciclo si CX es cero o la bandera de cero es 0.
MC Genaro Alberto Gmez Chi. Pgina 61

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Instrucciones de manipulacin de cadenas Las instrucciones de manejo de cadenas difieren de las dems instrucciones del 8086 en que pueden acceder memoria e incrementar y decrementar un registro apuntador en una sola instruccin. Como su nombre implica, las instrucciones de cadena son particularmente tiles en la manipulacin de cadenas de caracteres. Son tambin adecuadas para el manejo de arreglos, buffers de datos y todo tipo de cadenas de bytes y palabras. Adems, generan menos cdigos y son ms rpidas que las combinaciones equivalentes de instrucciones normales del 8086, tal como LOOP, INC y MOV. Las instrucciones de cadena pueden agruparse en los siguientes grupos funcionales: instrucciones usadas para el movimiento de datos (LODS, STOS y MOVS) e instrucciones de cadena para inspeccin y comparacin de datos (SCAS y CMPS). Instrucciones de cadena de movimiento de datos
MOV, pero hacen ms que MOV y operan con mayor velocidad. LODS

Las instrucciones de cadena de movimiento de datos son similares a la instruccin

La instruccin LODS, que carga un byte o palabra de memoria hacia el acumulador, puede usarse para trasladar bytes, con su variante LODSB, o palabras, utilizando LODSW. LODSB carga el byte direccionado por DS:SI hacia AL, e incrementa o decrementa SI dependiendo del estado de la bandera de direccin. Si la bandera de direccin es 0 (puesta con CLD), entonces SI es incrementado; si la bandera de direccin es 1 (puesta con STD), entonces SI es decrementado. Es importante notar que la bandera de direccin controla la direccin en que los registros apuntadores son modificados para todas las instrucciones de cadena. Por ejemplo, la instruccin LODSB en la siguiente porcin de cdigo
... cld mov lodsb ...

si,0

Carga AL con el contenido del byte en el desplazamiento 0 del segmento de datos e incrementa SI por 1. Es equivalente a
...

MC Genaro Alberto Gmez Chi.

Pgina 62

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


mov mov inc ... si,0 al,[si] si

Sin embargo,
lodsb

Es considerablemente ms rpido (y 2 bytes menor) que


mov inc al,[si] si

LODSW es similar a LODSB, salvo que la palabra direccionada por DS:SI es cargada en AX y SI es incrementado o decrementado por 2, en lugar de por 1. Por ejemplo,

carga la palabra en el desplazamiento 10 del segmento de datos hacia AX y despus decrementa SI por 2.
STOS

... mov si,10 lodsw ...

es el complemento de LODS. Escribe un valor de byte o palabra del acumulador hacia una localidad de memoria apuntada por ES:DI, e incrementa o decrementa DI. STOSB escribe el byte en AL hacia la localidad de memoria apuntada por ES:DI y despus incrementa o decrementa DI, dependiendo de la bandera de direccin. Por ejemplo,
STOS

... std mov mov stosb ...

di,0FFFFh al,55h

Escribe el valor 55h al byte en el desplazamiento 0FFFFh en el segmento apuntado por ES y despus decrementa DI a 0FFFEh. STOSW hace lo mismo, al escribir un valor 16 bits de AX hacia la direccin ES:DI y despus incrementa o decrementa DI por 2. Por ejemplo:
... cld mov mov stosw di,0FFEh ax,102h

MC Genaro Alberto Gmez Chi.

Pgina 63

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


...

Escribe el valor de palabra 102h de AX hacia el desplazamiento 0FFEh en el segmento apuntado por ES y despus incrementa DI a 1000h.
LODS y STOS trabajan juntos para el copiado de buffers. Por ejemplo, la siguiente subrutina copia una cadena terminada en cero, en DS:SI hacia la cadena ES:DI.

; Subrutina para copiar una cadena terminada con ASCII cero hacia otra cadena. ; Entrada: ; DS:SI - Cadena fuente ; ES:SI - Cadena destino ; Salida: ; Ninguna ; Registros destrudos: ; AL,SI,DI CopyString PROC cld ; Hace qu SI y DI se incremente con ; la inst. de cadena CopyStringLoop: lodsb ; Obtiene carcter de la cadena fuente stosb ; Almacena carcter en la cadena destino cmp al,0 ; Es el carcter 0 para terminar ; la cadena? jnz CopyStringLoop ; no, ve por el siguiente ; carcter ret CopyString ENDP
MOVS

es similar a LODS y STOS en una sola instruccin. MOVS lee el byte o palabra almacenados en DS:SI y despus escribe el valor en la direccin ES:DI. El byte o palabra no pasa por registro alguno y, de esta manera, AX no es modificado. La siguiente porcin de cdigo muestra como funciona MOVS para copiar bloques de bytes que no estn terminados con el ASCII cero.
MOVS

... mov mov mov mov mov mov mov cld CopyLoop:

cx,ARRAY_LENGTH_IN_WORDS si,OFFSET SourceArray ax,SEG SourceArray ds,ax di,OFFSET DestArray ax,SEG DestArray es,ax

MC Genaro Alberto Gmez Chi.

Pgina 64

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


movsw loop CopyLoop ...

Prefijos de repeticin de cadenas Mientras el cdigo en el ltimo ejemplo parece eficiente, existe una manera de realizar la misma tarea de mover bloques de byte en una sola instruccin. El 8086 cuenta con la opcin de prefijo de repeticin, REP, en las instrucciones de cadena.
REP no es una instruccin; es un prefijo de instruccin. Los prefijos de instruccin modifican la operacin de la siguiente instruccin en el cdigo. REP indica que la siguiente instruccin de cadena se ejecute repetidamente hasta que el registro CX sea cero. (Si CX es cero cuando la instruccin a repetir inicia, la instruccin se ejecuta cero veces - en otras palabras no hace nada).

Usando REP puede reemplazarse la porcin


CopyLoop: movsw loop CopyLoop

En el ltimo ejemplo, con


rep movsw

Esta instruccin simple mover un bloque de hasta 65,535 palabras (0FFFFh) de la direccin de memoria iniciando en DS:SI a la localidad en ES:DI.
REP puede ser usada con LODS y STOS, como con MOVS (y tambin con SCAS y CMPS). Es importante aclarar que REP nicamente funciona con las instrucciones

de

manipulacin de cadena. Instrucciones de cadena de inspeccin de datos Las instrucciones memoria.


SCAS SCAS

CMPS

son usadas para inspeccionar y comparar bloques de

es usada para inspeccionar la memoria buscando una equivalencia o no equivalencia de un valor particular de tamao byte o palabra. Como con todas las instrucciones de cadena SCAS viene en dos formas: SCASB y SCASW.
SCAS

MC Genaro Alberto Gmez Chi.

Pgina 65

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


SCASB compara AL con el valor de tamao byte almacenado en la direccin ES:DI, modificando las banderas para reflejar la comparacin, tal como si se hubiera ejecutado una instruccin CMP. Como con STOSB, DI es incrementado o decrementado por SCASB.

El siguiente ejemplo, encuentra la primera ocurrencia de la letra 't' minscula en la cadena de texto TEXTSTRING.
... .DATA TextString DB 'Este es un test',0 TEXT_STRING_LENGTH EQU ($-TextString) ... .CODE ... mov ax,@data mov es,ax mov di,OFFSET TextString ;ES:DI apunta al ; inicio de TextString mov al,'t' ; Carcter a buscar mov cx,TEXT_STRING-LENGTH ; Longitud de la cadena ; a inspeccionar cld ScanLoop: scasb ; El contenido de ES:DI es igual a 't' je Found_t ; S; se encontr 't' loop ScanLoop ; No se encontr 't' ... ; Se encontr una 't' Found_t: dec di

Ntese que DI es decrementado despus de encontrar 't', lo que refleja que, despus de ejecutar la instruccin de cadena, los registros apuntador (DI, SI, o ambos) no apuntan a la localidad de memoria recientemente accesada, sino que apuntan a la siguiente (o anterior) localidad de memoria de la que se acces. En el ejemplo anterior, DI apunta al byte que sigue a la localidad de memoria donde se encuentra 't' que fue encontrada y debe ser ajustada para compensar este desfasamiento. Una porcin de cdigo similar a la anterior, pero sin utilizar instrucciones de cadena, se muestra a continuacin:
... ScanLoop: cmp je

es:[di],al Found_t

; Compara es:[di] con al ; Se encontr 't'

MC Genaro Alberto Gmez Chi.

Pgina 66

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


inc loop ... di ScanLoop ; No se encontr; ve por el siguiente carcter
JE

En este ejemplo, el registro DI es incrementado despus de que la instruccin ejecuta para evitar alterar las banderas con la instruccin INC.

se

Es importante hacer la observacin que las instrucciones de cadena nunca modifican las banderas para reflejar los cambios que realizaron a SI, DI y/o CX. LODS, STOS y MOVS no modifican ninguna bandera, y SCAS y CMPS nicamente cambian las banderas de acuerdo a los resultados de las comparaciones realizadas. Otros prefijos de repeticin El prefijo REP pudo utilizarse en el ejemplo de encontrar la 't' en la cadena. Sin embargo, puede desearse agregar flexibilidad a la comparacin y desear detener la iteracin cuando se encuentre una equivalencia o desigualdad entre los valores a comparar. Dos variantes de REP pueden ser utilizadas con SCAS (y tambin con CMPS): REPE y REPNE.
REPE (tambin conocida como REPZ) le dice al 8086 que repita SCAS (o CMPS) hasta que CX sea cero u ocurra una desigualdad entre los valores a comparar. REPE puede ser traducido como el prefijo "repite mientras sean iguales". Por otra parte, REPNE (conocido tambin como REPNZ) le dice al 8086 que repita SCAS (o CMPS) hasta que CX sea cero u ocurra una equivalencia. Puede tomarse a REPNE como el prefijo "repite mientras no sean iguales".

La siguiente porcin de cdigo utiliza una instruccin TEXTSTRING en busca del carcter 't'.
... mov mov mov mov mov cld repne

SCASB

para inspeccionar

ax,@data es,ax di,OFFSET TextString ; ES:DI apunta al inicio de TextString al,'t' ; Carcter a buscar cx,TEXT_STRING_LENGTH ; Longitud de la cadena a inspeccionar ; Inspecciona incrementando DI scasb ; Inspecciona la cadena completa mientras ; ES:DI y AL no sean iguales je Found_t ; S, se encontr ; No se encontr 't' ... ; Se encontr 't' Found_t: dec di ; Hace que apunte exactamente a 't' ...

MC Genaro Alberto Gmez Chi.

Pgina 67

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


CMPS La instruccin de cadena CMPS est diseada para permitir comparar dos cadenas de bytes o palabras. Una repeticin simple de CMPS compara dos localidades de memoria, y despus incrementa SI y DI.
CMPSB compara el byte en DS:SI con el byte en ES:DI, modifica las banderas de acuerdo al resultado de la comparacin e incrementa SI y DI, dependiendo de la bandera de direccin. AX no es modificado durante la ejecucin de CMPS. CMPSW

tamao.

hace lo mismo que

CMPSB,

pero con valores de 16 bits (una palabra) de

La siguiente porcin de cdigo prueba si los primeros 50 elementos de dos arreglos con elementos de tamao palabra son idnticos, usando REP CMPSW:
... mov si,OFFSET Array1 mov ax,SEG Array1 mov ds,ax mov di,OFFSET Array2 mov ax,SEG Array2 mov es,ax mov cx,50 cld repe cmpsw jne ArraysAreDifferent ; Los primeros 50 elementos son idnticos ... ; Al menos un elemento difiere entre los dos arreglos ArraysAreDifferent: dec si dec si dec di dec di ...

Instrucciones de control del procesador La familia de procesadores 80x86 proporciona instrucciones para el control del procesador. La tabla x.xx muestra las instrucciones ms importantes de este grupo que permiten establecer o aclarar las banderas de acarreo, direccin e interrupcin de manera directa. Adems, existe una instruccin de complemento de la bandera de acarreo, CMC, que permite invertir el estado actual de la bandera de acarreo.
MC Genaro Alberto Gmez Chi. Pgina 68

INSTITUTO TECNOLGICO DE CAMPECHE SUBDIRECCIN ACADMICA DEPARTAMENTO DE SISTEMAS Y COMPUTACIN


Por ltimo, la instruccin HLT causa que el procesador detenga la ejecucin de instrucciones. Puede utilizarse si no hay nada que ejecutar mientras se espera la recepcin de una interrupcin.
Mnemnicos de Significado instruccin CLC Aclara la bandera de acarreo CLD Aclarar la bandera de direccin CLI Aclarar la bandera de interrupcin Complementa la bandera de CMC acarreo STC Establece la bandera de acarreo STD Establece la bandera de direccin Establece la bandera de STI interrupcin HLT Detener la ejecucin del programa Accin realizada CF = 0 DF = 0 IF = 0 CF = NOT(CF) CF = 1 DF = 1 IF = 1 El procesador detiene la ejecucin de instrucciones

MC Genaro Alberto Gmez Chi.

Pgina 69

You might also like