Sunteți pe pagina 1din 25

COMPUTADORA PERSONAL ( PC ). No se puede programar en lenguaje ensamblador sin tener un conocimiento, ms o menos profundo, acerca de las peculiaridades de la mquina.

Esto es obvio ya que en ensamblador tenemos un control total del sistema; por tanto, cuanto ms sepamos ms provecho podremos sacar del mismo y mejores resultados obtendremos. En primer lugar, debemos saber con qu estamos trabajando (no el lenguaje en s, sino el ordenador en cuestin). Tendremos que conocer de qu partes consta, cmo se comunican entre s, etc. (esta parte terica es casi imprescindible para poder entender ciertas tcnicas de programacin). Vamos a estudiar la PC en general, no distinguiendo entre distintas familias de procesadores ya que vamos a utilizar el ensamblador del 8086 cuyo cdigo ejecutable es para la familia 80x86 en general (cualquier exposicin que se haga ser vlida para toda la familia PC). Una PC es un ordenador o computadora compuesta principalmente por: procesador, memoria, varios chips inteligentes o programables y los buses de datos y direcciones. Junto con todo esto, nos encontramos los perifricos como son: monitor, disqueteras, teclado, etc., que se comunican con el procesador. El procesador: Es el chip que ejecuta los programas generando direcciones y seales de control. El procesador o CPU, lleva a cabo una gran variedad de clculos, comparaciones numricas y transferencias de datos como respuesta a las peticiones de los programas que estn siendo ejecutados. La CPU controla las operaciones bsicas del ordenador enviando o recibiendo seales de control y datos de un lugar a otro del ordenador a travs de un grupo de 'sendas electrnicas' llamadas BUS. Localizadas, a lo largo de este bus, estn las puertas de entrada y salida (E/S en castellano o I/O en ingls) las cuales conectan con los chips de apoyo. Los datos pasan a travs de estas puertas de E/S mientras viajan desde o hasta la CPU y otras partes del ordenador. El procesador 8086 es de 16 bits; esto quiere decir, entre otras cosas, que va a manipular (en una sola operacin) datos de hasta 16 bits. Es decir, cuando transfiera datos a memoria o los traiga desde ella, lo podr hacer de 16 bits en 16 bits. Aqu juega un papel decisivo, el BUS de datos, ya que es por donde estos circulan (en transferencias). El procesador cuenta con una serie de registros usados para realizar las operaciones de clculo y almacenamiento de datos (un registro del procesador es algo as como una zona de memoria, dentro del mismo, donde se puede almacenar informacin de forma que el acceso a esta sea instantneo, ya que no hay que utilizar el bus de datos, que conecta el procesador con la memoria, para obtener dichos datos). Estos registros se dividen en 5 grupos (segn sus funciones): 1.- Registros de datos: AX, BX, CX y DX. Se usan para clculo y almacenamiento de propsito general. Son utilizados por los programas para realizar clculos, as como para transferir datos de una posicin de memoria a otra, ya que no se puede hacer de forma directa. Es decir, que no podemos transferir un dato de la posicin de memoria X a la posicin Y sin antes depositar ese dato, temporalmente, en un registro del procesador. Estos registros tienen una longitud de 16 bits, pero podemos descomponerlos (cuando nos interese) en un par de registros de 8 bits, quedando de la forma siguiente: AX = AH + AL AX est compuesto por la conjuncin (no la suma) del registro AH de 8 bits (los 8 bits ms significativos o de ms a la izquierda) y el registro AL de 8 bits (los 8 bits menos significativos o de ms a la derecha). De igual forma: BX = BH + BL CX = CH + CL DX = DH + DL Cada uno de estos registros tiene funciones especiales que es interesante conocer. El registro AX es el llamado acumulador y hace que muchas operaciones tengan una forma ms corta, ya que lo especifican implcitamente (es decir, que hay operaciones que utilizan al AX como uno de los operandos). BX se suele utilizar (en muchas instrucciones) como registro base, sobre todo, en transferencias de datos entre memoria y procesador. CX es el registro contador; muchas instrucciones lo utilizan para: hacer incrementos o decrementos automticos, realizar bucles, etc.. DX es el registro de datos y se suele utilizar para operaciones de 32 bits (almacena los 16 bits, o palabra, ms significativos). 2.- Registros Indices: SI, DI, BP y SP. Se utilizan para acceder a memoria, cuando se establece el modo de direccionamiento, mediante indexacin o como punteros. SI y DI indican los ndices fuente y destino respectivamente. BP y SP indican los punteros de base y de la pila respectivamente. Estos 4 registros son de 16 bits y no pueden ser utilizados como registros dobles de 8 bits. 3.-- Registros de Segmentos: CS, DS, SS y ES. Estos registros apuntan al principio de un bloque de 64 KB (KiloByte) de memoria o segmento (de ah lo de la 'S' con la que finalizan): CS= registro segmento de cdigo: indica el inicio del rea donde se hallan los programas. DS= registro segmento de datos: especifica la zona donde el programa lee y escribe los datos, por defecto. SS= registro segmento de pila: especifica el rea donde se encuentra la pila del sistema. ES= registro segmento extra: se utiliza como una extensin del segmento de datos. Es decir, indica otra rea de datos aparte de la especificada por DS. 4.-- Puntero de instrucciones: IP. Su longitud es de 16 bits como el resto de los registros. Indica donde se encuentra la siguiente instruccin a ejecutar y su valor es ajustado durante la ejecucin de la instruccin en curso. Esta direccin es el desplazamiento en el rea de 64 KB especificada por CS. CS e IP, en conjuncin, conforman la direccin fsica real de la siguiente instruccin a ejecutar. 5.-- Registro FLAGS o banderas de estado. Su longitud es de 16 bits (hay 7 que no se utilizan); cada uno de estos contiene cierta informacin booleana (verdadero o falso). Segn el valor de cada uno de estos bits, sea 1 (verdadero) 0 (falso), informar del estado de alguna situacin en particular. Los nombres de los flags utilizados son: Of, Df, If, Tf, Sf, Zf, Af, Pf y Cf. Estos bits se clasifican en dos grupos: -- Flags de estado (Cf, Af, Of, Zf, Pf y Sf): muestran el estado del procesador. -- Flags de control (Df, If, Tf): determinan como el procesador responde a determinadas situaciones. El programador manipula estos bits para controlar el modo de ejecucin de algunas instrucciones. Estas banderas estn ntimamente ligadas a operaciones aritmticas (pueden afectar la mayora) y nos ofrecen informacin acerca de los resultados. Una operacin puede afectar a un solo flag, a ninguno o a varios (dependiendo de la instruccin). As, por ejemplo, las instrucciones de salto no actualizan ninguna bandera (tal como la MOV). A continuacin, se muestra el significado de cada uno de los flags: Cf= bit de Carry (acarreo): se activa (se pone en 1) si se produce acarreo del bit 7 (el ms significativo en operandos de 8 bits). Pf= bit de paridad: se activa si el resultado de una operacin tiene paridad par, es decir, si el resultado tiene cantidad par de unos. Af= bit de carry auxiliar: se activa si una operacin aritmtica produce acarreo del bit 3 (para operando de 8 bits). Zf= bit de cero (zero, en ingls): se activa si una operacin da 0, como resultado. Suele ser el ms utilizado (ms consultado) por los programadores. Se utiliza para comparaciones de datos y, entre otras cosas, con ciertos bucles. Sf= bit de signo: se activa si el resultado de una operacin es negativo (por convencin, cuando se opera con nmeros negativos, se utiliza el bit de mayor peso para indicar el signo; si el bit es cero se trata de un nmero positivo y si es 1 es negativo). Tf= bit trap o desvo: si Tf=1, el procesador ejecuta las instrucciones una a una (bajo control del usuario). Se pone a 1, este bit, para realizar depuraciones del cdigo que se est ejecutando (de esta forma se puede seguir el flujo del programa). If= bit de interrupcin: si vale 1 las interrupciones estn permitidas y si vale 0 no. Df= se usa en las instrucciones que manipulan cadenas de Bytes. Segn coloque el programador este bit, en 0 1, las cadenas de Bytes sern tratadas en sentido de direcciones crecientes o decrecientes. Of= bit de overflow: indica desbordamiento en una operacin aritmtica (acarreo del bit 6 si son operandos de 8 bits); es decir, que

el resultado es demasiado grande para que quepa en su destino. La Memoria: Los chips de memoria se dedican a almacenar la informacin hasta que se necesite. El nmero y la capacidad de almacenamiento de estos chips, que hay dentro del ordenador, determinan la cantidad de memoria que podremos utilizar para los programas y los datos. Normalmente, la memoria, se divide en dos tipos principales como son la RAM y la ROM. En principio, vamos a trabajar con el rango de memoria 0 a 1.048.576, es decir, vamos a trabajar con el primer MB (MegaByte). En ese MB inicial, tenemos tanto RAM como ROM. La memoria RAM, que es la que usamos para almacenar tanto programas como datos, empieza en las direcciones bajas y llega hasta el inicio de la ROM. La ROM, evidentemente, est situada en las posiciones altas de memoria y es ah donde se almacenan las rutinas bsicas del ordenador, como las rutinas de acceso a: discos, pantalla, etc. Un tema muy importante en el mundo de la PC es la denominada barrera de los 640 KB (esto quiere decir que aunque tengamos instalados 8 MB, en nuestro ordenador, slo podremos ejecutar nuestros programas en los primeros 640 KB para poder acceder a los 7 MB restantes debemos utilizar funciones especiales de manejo de memoria extendida, expandida, etc.). Chips de apoyo (inteligentes, programables, etc.): Se trata de chips, de que se sirve el procesador o el usuario, debido a que el procesador no puede controlar todo el ordenador sin ayuda. Al delegar ciertas funciones de control a otros chips, le queda ms tiempo libre para atender su propio trabajo. Estos chips de apoyo pueden ser responsables de procesos tales como el flujo de informacin a travs de la circuitera interna (como los controladores de interrupciones y DMA) y controlar el flujo de informacin de uno a otro dispositivo (como un monitor o una unidad de disco) conectado al ordenador. Los chips de apoyo, soporte, etc. son conocidos como controladores, ya que controlan una parte del hardware para ir aligerando el trabajo de la CPU. En muchos casos, estos chips, son programables (por el programador, en ensamblador) con lo cual no trabajan por su cuenta, sino que aceptan las instrucciones que los hacen funcionar (a travs de la CPU). A continuacin se da una relacin de los diferentes chips de apoyo o controladores de la PC: -- Controlador programable de interrupciones o PIC (chip 8259). En una PC, una de las tareas esenciales de la CPU consiste en responder a las interrupciones del hardware (seal generada por un componente del ordenador que indica que, ese componente, requiere la atencin del procesador). Por ejemplo: el reloj del sistema, el teclado y los controladores de disco, generan interrupciones de hardware, en un momento dado, para que se lleve a cabo su tarea. En ese momento, la CPU responde a cada interrupcin (llevando a cabo la actividad de hardware apropiada) ejecutando lo que se llama rutina de atencin a las interrupciones (que es una porcin de cdigo). Tomemos como ejemplo el teclado: el usuario pulsa una tecla. Inmediatamente, la circuitera digital del perifrico detecta la pulsacin de la misma y almacena su "cdigo de rastreo" (toda tecla tiene asociado un cdigo, de 8 bits, denominado Scan Code) en un registro reservado para tal fin llamado puerto de teclado. Entonces, el teclado activa una lnea de peticin de interrupcin, ms concretamente, la lnea IR1 del 8259 (IR son las siglas de Interrupt Request o peticin de interrupcin; tambin se puede decir IRQ, que es a lo que estamos ms acostumbrados, sobre todo cuando instalamos una tarjeta de sonido, p.ej.). A continuacin, el 8259 activa el pin INTR de la CPU (se activa cada vez que se produce una peticin de interrupcin; es una lnea externa que comunica al Procesador con el exterior). Por ltimo, y resumiendo mucho, la CPU termina la instruccin en curso y ejecuta la rutina de atencin a la interrupcin. Al terminar de ejecutar esta rutina, el control vuelve a la siguiente instruccin (donde se haba quedado el programa en curso) con los registros en el valor que tenan antes de ejecutar dicha rutina. -- Controlador de acceso directo a memoria o DMA (chip 8237). Algunas partes del ordenador son capaces de transferir datos hacia y desde la memoria, sin pasar a travs de los registros de la CPU. El propsito principal de este controlador es permitir, a las unidades de disco, leer y escribir datos (las transferencias de datos se hacen ms rpidas). -- Adaptador asincrnico de comunicaciones o ACE (chip 8250). Las PC tienen varios subsistemas de entrada/salida, con circuitera de control especializada, que proporciona un interfaz entre la CPU y el hardware de E/S. Los puertos serie disponen de estos controladores de entrada/salida. -- Interfaz programable para perifricos o PPI (chip 8255). Es tipo paralelo y crea una conexin entre la CPU y los dispositivos perifricos (como el teclado y el altavoz); acta como una especie de intermediario, utilizado por la CPU, para comunicar determinadas seales al dispositivo deseado. -- Generador de reloj (chip 8248). Este generador suministra las seales de reloj que coordinan el microprocesador y los perifricos. Produce una seal oscilante de alta frecuencia. En el IBM PC original, esta frecuencia, era de 14,31818 MegaHertz o millones de ciclos por segundo (no hay que confundir esta frecuencia con la del procesador). Otros chips, que necesitan una seal de tiempo regular, la obtienen del generador de reloj dividiendo, la frecuencia base, por una constante para tener la frecuencia que necesitan (para realizar sus tareas). El 8088 del IBM PC funcionaba a 4,77 MHz (una tercera parte de la frecuencia base). El bus interno del IBM PC y el temporizador utilizan una frecuencia de 1,193 MHz, es decir, un cuarto del ratio del 8088 y una doceava parte del ratio base. -- Temporizador y controlador de eventos o timer (chip 8253). Este chip genera seales de tiempo, a intervalos regulares, controlados por software. Esto es, que podemos cambiar la frecuencia de estos intervalos por medio de un programa. El timer dispone de varias lneas de salida, funcionando cada una, con una frecuencia independiente a las otras y conectadas, cada una, a distintos componentes del sistema. Una funcin esencial, del contador, es la de generar un tic-tac de reloj que mantenga actualizada la hora y el da. Otra de las seales, producidas por el contador, puede ser utilizada para controlar la frecuencia de los tonos producidos por el altavoz del ordenador. -- Controlador de video (chip 6845). El controlador de video, al contrario del resto de los chips de apoyo presentados hasta ahora, no se encuentra en la placa madre de la PC, sino que est depositado en una tarjeta de video colocada en una ranura de ampliacin. Es el corazn de las tarjetas de video: CGA, EGA, VGA, etc. -- Coprocesadores matemticos (8087/80287/80387). Son utilizados, en caso de estar disponibles (en el ordenador) para trabajar con nmeros en coma flotante y coma real (cosa que el 8086 no puede hacer). Todos estos chips se conectan, entre s, a travs del BUS. Bus de direcciones: El bus de direcciones de la PC utiliza 20 lneas de seal para transmitir las direcciones de memoria y de los dispositivos conectados. Como a travs de cada una de esas 20 lneas pueden viajar dos posibles valores (0 1, es decir tensin baja o tensin alta), el ordenador puede especificar 2^20 (2 elevado a 20) direcciones; es decir puede direccionar 1 MB (estamos hablando del 8086 con un bus de direcciones de 20 bits). Modelos superiores, como el 80386 o el Pentium, direccionan mucho ms tanto como les permite su bus (32 bits en el caso del 386 y 64 bits en el caso del Pentium; es decir, 2^32 y 2^64 direcciones respectivamente). Bus de datos: El bus de datos de la PC (trabaja con el de direcciones para transportar los datos a travs del ordenador) es de 16 bits (al igual que el tamao de los registros). El procesador 8088 tiene un tamao de registro de 16 bits y un bus de datos de 8 bits (esto es as por simple economa) que lo hace ms lento al realizar transferencias de datos.

-- DIRECCIONAMIENTO DE MEMORIA EN EL 8086. Segmentacin. La forma en que la CPU construye las direcciones de memoria es muy importante (para la programacin del sistema) debido a que constantemente utilizamos instrucciones de: transferencias de datos, de acceso a funciones de la BIOS (proviene de las siglas Basic Input Output System = Sistema Bsico de Entrada/Salida), del DOS (Sistema Operativo de Discos), etc. que son un conjunto de utilidades y procedimientos grabados en la ROM (memoria de solo lectura) los cuales se encargan de acceder al nivel ms bajo (en cuanto a programacin se refiere). Es decir, que estas rutinas se encargan de manipular el hardware por nosotros. A principios de los aos 80, Intel (fabricante de la familia de procesadores 80x86) se propuso dar un gran paso adelante con respecto a la competencia. En aquel tiempo los microprocesadores que imperaban, entre los ordenadores domsticos, eran de 8 bits; es decir, tenan un ancho del bus de datos de 8 bits (las transferencias de datos seran de Byte a Byte), al igual que el tamao de palabra de memoria y los registros del procesador. Un claro ejemplo de esto fue el microprocesador Z80 de la empresa Zilog (el cual estaba incorporado en mquinas tan famosas como: Spectrum, Amstrad, Msx, etc.) pero aunque era de 8 bits y la mayora de los registros tambin lo fueran, estaba el registro de direcciones que era de 16; de esta forma, se poda acceder a 64 KB de memoria (mximo que poda direccionar el Z80 original). En ese momento Intel plante superar esa barrera. En el Z80 haban conseguido registros de 16 bits, cuando el microprocesador era de 8, pero pasar de 16 bits, de capacidad en registros, en aquellos momentos no era posible (para los microprocesadores), es decir: no haba suficientes avances tecnolgicos como para conseguirlo. Entonces fue cuando a Intel se le ocurri la idea de construir una direccin de 20 bits de ancho y colocarla en el bus de direcciones para poder dirigirse a la memoria. Pero al ser los registros de 16 bits (c/u puede tener un valor de 1 0, independientemente del valor que tengan los bits contiguos, es decir 2^16 combinaciones diferentes, o lo que es lo mismo, puede representar 65.536) la solucin era crear este ancho de 20 bits usando 2 registros de 16 bits. El 8086 divide el espacio de direcciones (1 MB = 1024 KB = 1.048.576 Bytes) en segmentos, cada uno de los cuales contiene 64 KB de memoria (lo mximo direccionable por un solo registro). Entonces, para direccionar una posicin de memoria, nos valemos de dos registros de 16 bits: de segmento y de offset; el primero (de segmento) indica dnde comienza el trozo de 64 KB (donde se encuentra la direccin que nos interesa) y el segundo registro (el del offset) contiene el desplazamiento desde el inicio de ese trozo o segmento. Esto nos conduce a que el microprocesador debe realizar unas operaciones sobre estos dos registros para obtener la direccin fsica de 20 bits. Esto se logra moviendo el valor del segmento 4 bits a la izquierda (se multiplica por 16d 10h) y sumando el valor del desplazamiento. De esta forma se puede acceder a todo el MB, ya que: 65.536 x 16 = 1.048.576 (esto es algo que hace internamente el procesador). Grficamente: DS: XXXXXXXXXXXXXXXX SI: XXXXXXXXXXXXXXXX 15 87 0 15 87 0 Byte alto Byte bajo Byte alto Byte bajo (ms significativo) (menos significativo) Supongamos que el registro DS tiene el valor B800h (en hexadecimal) y el registro SI contiene el valor 0037h. Tenemos pues (en binario): DS: 1011 1000 0000 0000 SI: 0000 0000 0011 0111 Para obtener la direccin fsica de memoria (teniendo en cuenta todo lo dicho relativo a segmentos y desplazamientos) el microprocesador hara la suma de la siguiente forma: DS: 1011100000000000 SI: + 0000000000110111 -------------------------------10111000000000110111 = B8037h. De todo lo anterior se desprende que los segmentos empiezan siempre en direcciones divisibles por 16. Ms tcnicamente, cada segmento comienza en una direccin de prrafo (un prrafo son 16 Bytes) con lo que nunca habr un segmento que empiece en una direccin impar. El primer segmento posible empieza en la direccin fsica 0. Tambin, se puede descubrir que con distintas segmentaciones se podra llegar a una misma direccin fsica. Adems, se puede apreciar que, los segmentos se podran superponer unos a otros, pudiendo ser idnticos o encontrarse en partes totalmente lejanas (en la memoria). -- ENTRADA/SALIDA (COMUNICACION CON EL HARDWARE I). La comunicacin entre un programa y el hardware (es decir los chips de apoyo y las tarjetas de ampliacin) se efecta mediante los llamados Ports (puertos, en castellano). Estos puertos son zonas de memoria de 1 2 Bytes de tamao en las cuales se depositan los datos (que van a ser utilizados por los chips o tarjetas y los que devuelven, estos chips o tarjetas, al procesador). Estas zonas estn dentro de un rea de memoria de 64 KB, ajena a la memoria principal, dedicada a los puertos (no tienen nada que ver con la memoria disponible para los programas). Para realizar los movimientos de datos entre puertos y procesador existen instrucciones especiales (IN y OUT). Tanto IN como OUT tienen dos formas de uso las cuales utilizan el registro AL o AX para almacenar los datos a leer o escribir (la forma difiere en funcin de que se quiera acceder a un puerto menor de 256 mayor). Los mtodos pueden ser: -- Directo o esttico: corresponde cuando se quiere acceder a un puerto menor de 256. IN AL,10H ; lee un Byte del puerto 10h IN AX,10H ; lee una palabra del puerto 10h OUT 0FFH,AL ; escribe el valor de AL en el puerto 0FFH -- Indirecto o dinmico: corresponde al caso de querer acceder a un puerto mayor de 256, para lo cual se utiliza el registro DX indicando el nmero de puerto. IN AL,DX ; lee un Byte del puerto indicado por DX. (Antes hemos tenido que introducir, en DX, la direccin del puerto). OUT DX,AX ; escribe la palabra contenida en AX en el puerto DX. Algunos ejemplos de puerto son: 60h = acepta entradas de teclado. 61h = controla el altavoz. 3F0h - 3F7h = opera sobre la controladora de discos. -- INTERRUPCIONES (COMUNICACION CON EL HARDWARE II). Las interrupciones constituyen la forma en que la circuitera externa informa al microprocesador de que algo ha sucedido (como que se ha pulsado una tecla, por ejemplo) y solicita que se emprenda alguna accin. Pero no acaba ah su utilidad ya que las interrupciones, adems, son el medio principal de comunicacin entre las funciones de la BIOS y el DOS (mal llamadas interrupciones ya que nos sirven para hacer una llamada a una funcin, como por ejemplo, la accin de cambiar de modo de video, para la cual se utiliza la interrupcin 10h, Driver o controlador de video, con el nmero adecuado de funcin). Al primer tipo de interrupciones se las denomina interrupciones de hardware y son las interrupciones reales. Esto es, que estando un programa en ejecucin, se interrumpa ste para ejecutar un trozo de cdigo necesario para atender a la peticin de un dispositivo (como puede ser el teclado); son las interrupciones que vimos al hablar del PIC (acto seguido, se reanuda la ejecucin del programa en cuestin). Al segundo tipo de interrupciones se las denomina interrupciones de software y son las 'ficticias' ya que no hay ningn dispositivo pidiendo atencin del procesador, sino que es el programa del usuario el que ejecuta una funcin BIOS o DOS mediante una interrupcin. En este caso, no se interrumpe el programa en forma sbita sino que es dicho programa el que lanza una interrupcin, cuya rutina de atencin a la misma, est 'conectada' a un grupo de funciones o rutinas. Debido a que la interrupcin puede interrumpir, al programa en

ejecucin, en cualquiera de sus instrucciones, es necesario resguardar el contenido del registro de estado (FLAGS), para que al volver de la interrupcin, tengan (las banderas) el mismo valor (sobre todo, hay que guardar la direccin de la siguiente instruccin a ejecutar en el programa actual). El lugar para depositarlos es una zona de memoria denominada PILA (la pila del procesador). Al acto de introducir un dato en la pila se lo denomina apilar y a sacarlo de la misma se lo denomina desapilar; para apilar, el procesador har lo siguiente: -- Apila el contenido del registro de estado (flags) -- Apila la direccin de retorno (contenido de los registros CS e IP). -- Inhibe las interrupciones (IF=0 y TF=0). Esto se hace para que no se produzca otra interrupcin durante la secuencia de aceptacin de la interrupcin. -- Activa el pin INTA* (lo pone a nivel bajo). El dispositivo que ha solicitado la interrupcin, al notar el cambio en el pin INTA*, queda enterado de la aceptacin de la interrupcin. -- Lee el nmero del vector de interrupcin del bus de datos. Previamente, el dispositivo lo ha depositado en respuesta a la activacin del pin INTA*. -- Obtiene la direccin del subprograma de atencin a la interrupcin. Dicha direccin se encuentra (como hemos visto antes) almacenada en la tabla de vectores. -- El 8086 ejecuta la subrutina que finaliza con la instruccin IRET o Retorno de Interrupcin, cuya ejecucin restituye en CS e IP la direccin de retorno salvada en la pila, y en el registro de estado el valor de los flags. Al restaurar los flags, se anula la inhibicin anterior de IF y TF, con lo cual, otra vez se aceptan interrupciones, pudiendo as tener interrupciones en cascada. Los componentes que se usan para interrupciones son: -- Tabla de vectores: Es una zona de memoria que contiene las direcciones de comienzo o punteros al subprograma de atencin a la interrupcin aceptada. La tabla est compuesta de 256 entradas; es decir, son posibles 256 interrupciones diferentes en la PC. Cada una de estas entradas, contiene 4 Bytes: los 2 ltimos (una palabra) dan la direccin base del segmento y los 2 primeros dan el desplazamiento. Estos sirven para indicar el comienzo de una rutina de interrupcin, en la forma segmento : desplazamiento. Durante la aceptacin de una interrupcin, el 8086 carga la direccin base del segmento en el registro CS y el desplazamiento en el contador de programa IP. De esta forma, la siguiente instruccin a ejecutar, que viene dada por los registros CS:IP, ser la primera del subprograma de atencin a la interrupcin. -- Pines (lneas de bus) para demandar interrupcin desde el exterior. Existen 3 lneas externas jerarquizadas que son, por orden de prioridades decrecientes: RESET, NMI e INTR. Solo INTR es enmascarable (cuando un pin de demanda de interrupcin est enmascarado-inhabilitado la activacin del pin, no produce ninguna interrupcin). Es decir, que si se activan los pines RESET o NMI, siempre van a conducir a la ejecucin de una interrupcin. Pero si se activa el pin INTR, tenemos dos opciones (dependiendo de si est enmascarado o no), que son hacer caso omiso de la peticin de interrupcin, o atender dicha interrupcin, respectivamente. -- Pin INTR: Una peticin de interrupcin sobre este pin es enmascarable mediante el bit IF (bandera de interrupcin) del registro FLAGS o registro de estado. Este bit IF, que es la mscara de INTR (para saber si est enmascarada o no la lnea INTR, se mira este flag), puede tener (obviamente) dos valores: 0 1 (enmascarado es 0). Para manipular este bit, disponemos de dos instrucciones en ensamblador: CLI (Clear IF, o borrar flag IF) que lo pone con valor 0. STI (Set IF, o activar flag IF) que lo pone con valor 1. La peticin de interrupcin se realiza activando el pin INTR con nivel alto (1) y debe mantenerse as hasta que por el pin INTA* (pin asociado al pin INTR), se active en nivel bajo (0), indicando que se ha aceptado la interrupcin solicitada. INTR ( Interrupt Request (peticin de interrupcin). INTA* ( Interrupt Accepted (interrupcin aceptada). -- Pin NMI: Este pin est reservado para acontecimientos graves, como puede ser un corte de corriente, un error de memoria o bus, etc. La activacin del NMI no conlleva ninguna lectura en el bus de datos del N de vector de interrupcin, sino que la CPU directamente busca el vector de interrupcin nmero 2. -- Pin RESET: Inicializa el sistema. En la peticin del RESET no se almacena nada (en la pila) ni se accede a la tabla de vectores para conseguir la direccin de comienzo. Al activar el pin RESET, el registro de estado queda borrado (0). Entonces: CS = FFFFh. IP = 0000h. De esta manera, la siguiente instruccin a ejecutar por el procesador es la contenida a partir de FFFF:0, cdigo de reinicializacin y carga del sistema operativo (son los ltimos Bytes de la ROM). El resto de los registros de segmentos quedan con valor 0. Es decir: DS = 0000 ES = 0000 SS = 0000 -- Interrupciones internas o desvos. El microprocesador 8086 tiene 2 interrupciones internas: Divisin imposible y funcionamiento paso a paso (TRACE). -- Divisin imposible: se produce cuando se divide por 0 o cuando el cociente resultante de la divisin no cabe en el registro preparado para contenerlo. En ambos casos, se ejecuta la interrupcin 0. -- Funcionamiento paso a paso: si el programador coloca a 1 el bit TF (TRACE) del registro de estado, al final de cada instruccin, la CPU bifurcar a la posicin de memoria indicada por el vector de interrupcin 1 (esto es lo que utilizan los debuggers o depuradores de cdigo para hacer un seguimiento del programa, instruccin por instruccin. -- La pila del procesador. La pila es una caracterstica interna del 8086; es una estructura de datos situada en la RAM y proporciona, a los programas, un lugar donde almacenar datos de forma segura, pudiendo compartirlos con otros procedimientos o programas de forma cmoda y prctica. La funcin ms importante de la pila es la de mantener las direcciones de retorno de las llamadas a procedimientos e interrupciones, as como guardar los parmetros pasados a estos procedimientos (tambin se utiliza para almacenamiento temporal de datos). La pila tiene su nombre por analoga con los montones de platos apilados (pilas de platos) ya que opera en el orden LIFO (LAST IN FIRST OUT) o que el ltimo en entrar es el primero en salir (crece en orden inverso ya que cuando llegan nuevos datos, el tope de la pila, se acerca ms a posiciones ms bajas de memoria); cuando un dato nuevo es introducido en la pila, se dice que es apilado (push) debido a que se sita por encima de los dems, es decir al tope. Esto significa que cuando la pila se utiliza para seguir la pista de los retornos de las subrutinas, la primera llamada a subrutina que se hizo, es la ltima que se devuelve (la pila mantiene ordenado el funcionamiento del programa, las subrutinas y rutina de tratamiento de interrupciones, sin importar la complejidad de la operacin). Existen 3 registros destinados a gestionar la pila: - Registro de segmento de pila (SS): indica la direccin base del segmento de pila - Puntero de pila (SP): apunta al tope de la pila. - Puntero base de pila (BP): se usa para moverse a travs de la pila sin cambiar el tope. Se suele utilizar para acceder a los distintos parmetros al llamar a una funcin.

Los elementos que se almacenan en la pila son del tipo palabra (2 Bytes); esto quiere decir, entre otras cosas, que el puntero de pila (SP) incrementa/decrementa en 2, su valor, para apuntar a un nuevo elemento dentro de la pila (fruto de apilar o desapilar un elemento). Tambin conlleva el que si queremos almacenar un Byte en la pila, primero lo debemos convertir en palabra (2 Bytes) y luego almacenarla (meter 8 bits en un registro de 16 y almacenarlo). Las instrucciones para manejar la pila son: PUSH ===> Guarda un dato en la pila (decrementando, previamente, SP en 2 unidades para que apunte al nuevo lugar). Ejemplo: PUSH AX ==> Apila el contenido de AX en la cima de la pila. POP ===> Obtiene un dato de la pila (incrementando SP en 2 para que apunte al nuevo elemento). Ejemplo: POP AX ==> Desapila el contenido del tope de la pila en el registro AX. Es decir, AX contendr el valor que hubiera en la cima de la pila (el puntero de pila se actualiza incrementndolo en 2). PUSHF===> Guarda el contenido del registro de estado (FLAGS) en la pila (decrementando, previamente, SP en 2 para que apunte al nuevo elemento). No es necesario indicar sobre qu acta esta instruccin pues lo lleva implcito en su nombre (PUSH FLAGS). POPF===> Introduce, en el registro de estado, el contenido del tope de la pila (incrementando SP en 2 para que apunte al nuevo lugar). Al igual que con la instruccin anterior, no es necesario indicar sobre qu acta esta instruccin (POP FLAGS). Conviene recordar el hecho de que la pila crece en orden inverso al normal (de direcciones de memoria altas a bajas). Por lo tanto es necesario tener en cuenta el uso que se va a hacer de la pila (en el programa) debido a que si reservamos espacio para una pila pequea, en caso de sobrepasarla (haciendo muchos PUSH seguidos), machacara nuestro programa. Hay que tener en cuenta que no solo es nuestro programa el que utiliza la pila (mediante las instrucciones PUSH, llamadas a procedimientos, interrupciones, etc.). Por ejemplo, 18.2 veces por segundo se produce la interrupcin de reloj, con lo cual, se est apilando y posteriormente quitando informacin de la pila (por regla general, basta con tener una pila de unos 2 KB, es decir, espacio para almacenar 1024 elementos; es muy difcil que se sobrepase este tamao). -- CODIFICACION DE LAS INSTRUCCIONES EN EL 8086. Cada procesador tiene un conjunto de instrucciones, para manejarlo, as como para manejar la mquina. Indistintamente del lenguaje de programacin que estemos utilizando, cuando obtenemos el ejecutable, ste est compuesto nicamente por ese tipo de instrucciones bsicas (instrucciones de cdigo mquina); dependiendo de la calidad y prestaciones de ese lenguaje de programacin, el cdigo resultante, necesitar ms instrucciones del procesador o menos. Por todos es conocido, que hay lenguajes de alto o medio nivel (como: C, Pascal, Basic, etc.) en los que para una misma tarea, uno dar un ejecutable ms grande que otro (velocidad aparte). Esto no sucede con ensamblador en el que, para cada instruccin, existe uno y solo un cdigo mquina. La estructura de esas instrucciones bsicas o de cdigo mquina (del 8086) se codifican sobre 4 campos (como mximo) y tienen un tamao de 1 a 6 Bytes. Es decir, dependiendo de la instruccin que se trate, necesitar ms o menos Bytes para su codificacin, as como ms o menos campos. Los cuatro campos de una instruccin cdigo mquina son: 1.-- Cdigo de operacin: es el nico que siempre aparece (es de 8 bits). Una vez que el procesador descifra el significado de este campo, sabe si la instruccin consta de ms campos. Tambin contiene informacin acerca de si va a trabajar con Bytes o palabras 2.-- Modo de direccionamiento (Byte EA): le indica al procesador el nmero de operandos que acompaan al cdigo de operacin, as como el tipo de estos operandos (registros, memoria, valor inmediato). 3.-- Desplazamiento del dato (sobre 8 o 16 bits): en caso de existir este campo, supone un desplazamiento sobre la direccin dada por un registro ndice o base (especificado, este registro, mediante el Byte EA). 4.-- Valor inmediato (sobre 8 o 16 bits): contiene un valor numrico de 8 o 16 bits, que va a ser utilizado para una operacin aritmtica, transferencias de datos a registros o memoria, etc. Entrando un poco ms en detalle, Byte EA contiene 3 subcampos: MOD y R/M especifican el modo de direccionamiento y REG especifica el registro que se trata en la instruccin. -- El MOD, que es de 2 bits, puede tener 4 valores diferentes: los 3 primeros seleccionan el desplazamiento en los modos de direccionamiento de memoria y el cuarto selecciona un registro. Detallemos la funcin de estos bits en cada una: 00 ===> No hay desplazamiento. 01 ===> Se usa un Byte para codificar el desplazamiento. 10 ===> Se usan 2 Bytes (una palabra) para codificar el desplazamiento. 11 ===> Hace que R/M seleccione un registro usando la misma codificacin que para REG (ver ms abajo), en lugar de un modo de direccionamiento de la memoria (se produce una transferencia de un registro a otro). -- El REG, que es de 3 bits, codifica el registro empleado. Por tanto es posible especificar hasta 8 registros diferentes (por medio de este campo); es decir, se seleccionar un registro de entre un grupo de 8. Cuando se accede a registros de 16 bits (tamao WORD) el subcampo REG, se codifica de la siguiente manera: AX (000), CX (001), DX (010), BX (011) SP (100), BP (101), SI (110), DI (111) Cuando se accede a registros de 8 bits (tamao BYTE), la codificacin queda: AL (000), CL (001), DL (010), BL (011) AH (100), CH (101), DH (110), BH (111) -- El R/M indica el segundo registro (si lo hay) o el tipo de direccionamiento a memoria. En caso de que haya segundo registro, ste se codifica de la misma forma que para el campo REG pero si se trata de un direccionamiento, estos tres bits, seleccionan uno de los modos de acuerdo con la siguiente tabla: 000 = [BX + SI + desplazamiento] 001 = [BX + DI + desplazamiento] 010 = [BP + SI + desplazamiento] 011 = [BP + DI + desplazamiento] 100 = [SI + desplazamiento] 101 = [DI + desplazamiento] 110 = [BP + desplazamiento] 111 = [BX + desplazamiento] El desplazamiento, en caso de existir, supone un incremento en la direccin dada por un registro ndice y/o base, dando lugar a un desplazamiento final (dentro de un segmento dado); es decir, como se ve en la tabla superior, podemos acceder a memoria a travs de un registro base (BX, BP) y/o un registro ndice (SI, DI). Ejemplo: tenemos el registro DI apuntando a (con valor igual a) la direccin 3000h (direcciones siempre en hexadecimal). En esa direccin tenemos el comienzo de una cadena de caracteres que queremos convertir a maysculas y una vez que los hemos convertido, los queremos copiar a la memoria de pantalla. Podemos ir incrementando DI para tratar cada uno de estos caracteres o utilizar DI junto con un desplazamiento, para acceder a cada uno de los caracteres (para acceder al primer elemento sera: DI+0 ; para el segundo: DI+1; etc.). De esta forma, al terminar la tarea, DI seguir apuntando al principio de la cadena y podremos copiar la cadena desde el principio a donde corresponda (si no utilizramos desplazamiento, tendramos que tener una variable apuntando al inicio de la cadena, para tenerlo luego localizable).

-- MODOS DE DIRECCIONAMIENTO EN EL 8086. Como ya hemos visto, las instrucciones estn codificadas con 0, 1 2 operandos. Las operaciones se realizan entre registros o registros y memoria pero NUNCA entre memoria y memoria. Existen varios modos de direccionamiento; esta variedad se ofrece para una mayor comodidad en la programacin (por ejemplo, se puede utilizar el modo directo, cuando se conoce la direccin de memoria). Los modos son: Inmediato El dato aparece directamente en la instruccin (se indica explcitamente en la instruccin). Ejemplo: MOV AL,0AEH ===> Almacena el valor AEh en el registro de tipo Byte (AL). Modo Registro Cuando en la instruccin se realizan transferencias entre registros del procesador. Ejemplo: MOV AX,BX ===> Introduce el valor de BX en AX. Directo a memoria Aparece en la instruccin, de forma explcita, la direccin a la cual se quiere acceder (en la codificacin de la instruccin podemos encontrar 2 Bytes indicando la posicin de memoria que se quiere direccionar). Ejemplo: MOV CX,WORD PTR DS:[7777h] ===> Introduce el valor almacenado en las posiciones de memoria 7777h y 77778h (dentro del segmento de datos) en el registro de tipo palabra (CX). Relativo a un registro base Accede a una posicin de memoria con la ayuda de un registro base. La direccin final de memoria se indicar de la forma: Direccin final = Registro_Base + desplazamiento. Donde Registro_Base es BX o BP. Ejemplo: MOV AH,BYTE PTR [BX+7] ===> Introduce, en AH, el valor contenido en la posicin de memoria direccionada mediante BX+7. Relativo a un registro ndice (Indexado) La direccin se obtiene sumando un desplazamiento (que se indicar en la instruccin) al contenido de un registro ndice. 'Indice fuente' en ingls = 'Source Index' = SI. 'Indice destino' en ingls = 'Destine Index' = DI. La direccin final de la posicin de memoria se indicar de la forma: Direccin final = Registro_Indice + desplazamiento. Donde Registro_Indice es SI o DI. Ejemplo: MOV AX,WORD PTR [SI+7] ===> Introduce, en AX, el valor contenido en las posiciones de memoria direccionadas mediante SI+7 y SI+8. En realidad, excepto cuando se utilizan los dos registros ndices en una misma operacin (al copiar cadenas de caracteres, p.e., en cuyo caso hay que asignar a SI la direccin de la cadena origen y a DI la direccin de la cadena destino), podemos hacer uso de los registros SI y DI indistintamente al trabajar con direccionamientos; es decir, que las dos instrucciones siguientes son correctas y realizan exactamente la misma tarea (siempre que SI y DI tengan el mismo valor y estn en el mismo segmento): MOV AX,WORD PTR [SI+7] MOV AX,WORD PTR [DI+7] Modos indirectos Si en los dos ltimos modos de direccionamiento no se especifica desplazamiento, entonces hablamos de: Modo de direccionamiento indirecto por registro base Modo de direccionamiento indirecto por registro ndice respectivamente. Ejemplo: MOV AL,BYTE PTR [SI] ===> Introduce, en AL, el contenido de la posicin de memoria direccionada mediante SI. Indexado mediante una base La posicin de memoria seleccionada se direcciona mediante cuatro configuraciones posibles: un registro BX o BP contiene la base y un registro SI o DI contiene el desplazamiento (puede existir un desplazamiento opcional indicado mediante un valor numrico). La direccin final de la posicin de memoria se indicar de la forma: Direccin final = Registro_Base + Registro_Indice + desplazamiento. Donde Registro_Base es BX o BP y Registro_Indice es SI o DI. As las cuatro configuraciones posibles son: -- [BX + SI + desplazamiento] -- [BX + DI + desplazamiento] -- [BP + SI + desplazamiento] -- [BP + DI + desplazamiento] Ejemplo: MOV BYTE PTR [BX+SI],AL ===> Introduce el valor del registro AL en la posicin de memoria direccionada mediante: BX + SI . De esta forma, podemos manejar todo el MegaByte de memoria sin necesidad de modificar el valor del registro DS (registro segmento de datos). Podemos utilizar el registro ES cuando queramos acceder a posiciones de memoria que estn fuera de nuestro segmento de datos. Ejemplo: MOV AX,WORD PTR ES:[BX+7] ===> Introduce, en AX, el valor contenido en las posiciones de memoria direccionadas mediante: BX+7 y BX+8 (dentro del segmento ES). -- CONJUNTO DE INSTRUCCIONES DEL 8086. En lenguaje ensamblador disponemos de instrucciones para modificar el valor de algunas de las banderas del registro de estado. As: -- CLC (Clear Cf = Borrar o poner a cero el flag de acarreo). Sintaxis: CLC. -- STC (Set Cf = Activar o poner a uno el flag de acarreo). Sintaxis: STC. -- CLI (Clear If = Borrar o poner a cero el flag de interrupcin). Sintaxis: CLI. Esta instruccin la usamos cuando queremos que ninguna interrupcin enmascarable nos interrumpa el proceso en el que estamos. -- STI (Set If = Activar o poner a uno el flag de interrupcin). Sintaxis: STI. Mediante esta instruccin habilitamos de nuevo las interrupciones. -- CLD (Clear Df = Borrar o poner a cero el flag de direccin). Sintaxis: CLD. Esta instruccin se usa cuando se est trabajando con hileras o cadenas de caracteres. -- STD (Set Df = Activar o poner a uno el flag de direccin). Sintaxis: STD. Esta instruccin se usa cuando se est trabajando con hileras o cadenas de caracteres. El resto de los flags no se pueden modificar mediante las instrucciones CLx y STx. No obstante, por ejemplo, una forma de modificar el

Tf es con las instrucciones PUSHF y POPF. As, si lo que queremos es poner el flag Tf con valor 1 (no importando el resto de las banderas), basta con realizar las siguientes operaciones: MOV AX,0000 0001 0000 0000b PUSH AX POPF La primera instruccin prepara un nuevo registro de estado (FLAGS) con el flag Tf en 1 y los otros (flags) en 0. La segunda instruccin deja este nuevo registro de estado en la pila. La tercera lnea hace que el nuevo registro de estado sea la palabra introducida por la orden anterior; es decir, se trata de utilizar la instruccin POPF para poder tomar, de la pila, un nuevo registro de estado a gusto del programador (que previamente ha sido depositado mediante PUSH registro). -- Movimiento de datos. Las instrucciones pertenecientes a este grupo, tienen como objetivo: -- Actualizar un registro con un valor. -- Copiar la informacin de un registro a una posicin de memoria. -- Copiar la informacin de una posicin de memoria a un registro. -- Mover la informacin de un registro a otro. -- Intercambiar la informacin entre dos registros. -- MOV. Es la instruccin principal usada en movimientos de datos. Su sintaxis es: MOV destino,fuente El destino siempre a la izquierda y la fuente a la derecha. Con esta instruccin podemos hacer: -- Mover el contenido de un registro fuente, o una posicin de memoria, a un registro destino; o el contenido de un registro a una posicin de memoria. Ejemplo: MOV BX,SI ===> Mueve el contenido del registro SI al registro BX. -- Mover un dato (valor inmediato) a un registro o posicin de memoria. Ejemplo: MOV BYTE PTR [SI],7 ===> Introduce el nmero 7 en la posicin de memoria direccionada por SI. Otro: MOV AX,25 ===> Mueve el nmero 25 al registro AX. La instruccin MOV, como hemos podido ver, se utiliza para movimientos o transferencias de datos: de registro a registro, de registro a memoria y de memoria a registro pero nunca de memoria a memoria ya que la arquitectura del procesador y bus no lo permiten. Veamos algunos ejemplos de aplicacin: Ejemplo 1: MOV ax,5 ===> mueve el valor inmediato (o dato) 5 al registro AX. Si le decimos al procesador que introduzca un 5 en AX, pondr a cero el registro AH. Veamos como se codifica esta: MOV AX,5 ===> B8 05 00 (Cdigo mquina, siempre en hexadecimal). En primer lugar tenemos el primer Byte que contiene el cdigo de operacin (B8); como, este, tiene implcita la utilizacin del registro AX, como destino, no es necesario el Byte de direccionamiento (sera necesario para transferencias con otros registros). De esta manera se gana velocidad en la ejecucin del programa utilizando los registros para lo que han sido creados (AX acumulador, CX contador, etc.). Despus del cdigo de operacin tenemos dos Bytes (1 palabra); estos forman el campo Valor Inmediato (de los 4 campos que puede tener una instruccin cdigo mquina, sta solo tiene dos: el cdigo de operacin y el valor inmediato), cuyo tamao, en esta instruccin, es de 2 Bytes (el orden de estos Bytes es muy significativo; para acelerar el programa, cuando se manejan transferencias de datos, se lleg a la conclusin de que si se almacenan los Bytes que componen una palabra en orden inverso al normal, es mucho ms rpido recuperarlos; es decir, que el Byte de mayor peso queda a la derecha del de menor peso). De lo anterior se desprende que el nmero 5, al introducirlo en una palabra de memoria, quedara como: 05 00. Otro ejemplo: MOV al,5 ===> Introduce el valor 5 en el registro AL. En este caso, AH, queda como estaba antes de la instruccin ya que en la misma no interviene tal registro (de ninguna forma) y la instruccin se codifica como: MOV AL,5 ===> B0 05 Este ejemplo es prcticamente como el anterior, excepto que el cdigo de operacin en vez de ser B8 es B0 y adems ya no hay 2 Bytes en el campo valor inmediato, sino que hay uno solo (vamos a introducir el dato en un registro de tamao Byte). En general, las transferencias: MOV registro , dato_inmediato tienen un cdigo de operacin, cuyo primer dgito hexadecimal, es B. Hay 16 cdigos de operacin diferentes (uno para cada registro): B0 ===> MOV AL , dato_inmediato_tamao_Byte B1 ===> MOV CL, dato_inmediato_tamao_Byte B2 ===> MOV DL, dato_inmediato_tamao_Byte B3 ===> MOV BL, dato_inmediato_tamao_Byte B4 ===> MOV AH, dato_inmediato_tamao_Byte B5 ===> MOV CH, dato_inmediato_tamao_Byte B6 ===> MOV DH, dato_inmediato_tamao_Byte B7 ===> MOV BH, dato_inmediato_tamao_Byte B8 ===> MOV AX, dato_inmediato_tamao_word B9 ===> MOV CX, dato_inmediato_tamao_word BA ===> MOV DX, dato_inmediato_tamao_word BB ===> MOV BX, dato_inmediato_tamao_word BC ===> MOV SP, dato_inmediato_tamao_word BD ===> MOV BP, dato_inmediato_tamao_word BE ===> MOV SI, dato_inmediato_tamao_word BF ===> MOV DI, dato_inmediato_tamao_word Ejemplo 2: cuando se trata de transferencias entre registros: MOV CX,SI ===> Introduce el valor del registro SI en el registro CX. La instruccin se codifica como: MOV CX,SI ===> 8B CE En esta instruccin tenemos un cdigo de operacin y el Byte EA (mediante el Byte EA, el procesador, sabe qu registros intervienen en la transferencia); descomponindolo en sus dgitos binarios, tenemos: CE ===> 1100 1110 El MOD con valor 11, hace que R/M seleccione un registro (como fuente); el REG con valor 001, indica que el registro destino es CX; el R/M con valor 110, indica que el registro fuente es SI. Ejemplo 3: para introducir un dato en memoria se utilizan: a) las variables (que tambin existen en ensamblador) o b) se indica una posicin de memoria concreta, pasando de variables (hay una tercera manera que es utilizar, c) registros ndice o base). a) En el primer caso, si queremos introducir el valor 70h en la variable X, basta con escribir: MOV X,70h (previamente la variable X la hemos definido y con su tamao: Byte, palabra, doble palabra). Una vez que el compilador d el cdigo ejecutable, lo que antes era la variable X, ahora ser la posicin de memoria ocupada por la variable. Podramos hacer un programa sin usar variables (indicando posiciones de memoria directamente) pero eso es ms parecido a cdigo mquina puro que a ensamblador.

b) En el segundo caso, hay que indicar la posicin de memoria concreta (hay que tener en cuenta si esa posicin de memoria la utilizamos como un Byte o palabra; esto es as ya que si, por medio del programa, queremos guardar un 5 en la posicin de memoria 7654h, por ejemplo, el procesador no sabe si queremos guardar un Byte o una palabra). Para que no surja ningn inconveniente, el lenguaje ensamblador cuenta con ciertos convencionalismos para tratar estas transferencias: 1) Cuando queremos introducir un Byte, en una posicin dada de memoria, lo hacemos con el siguiente formato: MOV BYTE PTR DS:[7654H],5 BYTE PTR indica que vamos a acceder a una posicin de memoria del tipo BYTE. 2) Cuando queremos introducir una palabra, a partir de una posicin de memoria, el formato queda: MOV WORD PTR DS:[7654H],5 WORD PTR indica que vamos a acceder a una posicin de memoria del tipo WORD. Hay que tener en cuenta que cuando se quiere acceder a una posicin concreta de memoria, sin pasar por una variable, se debe indicar entre corchetes (como en los ejemplos de arriba); adems, se debe indicar un segmento (para que el procesador sepa a qu zona, de 64 KB, de la memoria pertenece la posicin dada entre los corchetes). En este caso indicamos el DS (segmento de datos), aunque podramos haber seleccionado el ES (segmento extra de datos); obsrvese la manera de indicar una direccin en forma segmentada (no real): primero se indica el segmento, luego dos puntos (para separar) y luego, entre corchetes, el offset o desplazamiento dentro de ese segmento. Segmento:[desplazamiento] Veamos como se codifica una instruccin en la que se hace acceso a memoria. MOV WORD PTR DS:[7654H],5 ===> C7 06 54 76 05 00 Esta instruccin introduce el valor 5 a partir de la posicin de memoria 7654h y necesita dos posiciones de memoria para almacenarlo, ya que se trata de un valor inmediato de 16 bits (queda almacenada en dos posiciones de memoria; en [7654h] estar el 05 y en la [7655h] contendr el valor 00). Vemos que esta instruccin ha ocupado el mximo posible (6 Bytes) de tal forma que los 4 campos de instruccin estn presentes; el cdigo de operacin (C7) indica una operacin MOV sobre una direccin o desplazamiento concreto (con un valor numrico de tipo palabra); los Bytes 3 y 4, forman el desplazamiento (tener en cuenta el tema del orden inverso en los Bytes); los 5 y 6, forman el valor inmediato a introducir (tener en cuenta, de nuevo, el orden inverso). c) En el tercer caso nos valemos de un registro ndice o base, el cual contiene la direccin de la posicin de memoria que nos interesa. Un ejemplo es: MOV BYTE PTR [DI],5 Obsrvese que aqu no es necesario indicar el segmento al que nos referimos (est implcito). Otro ejemplo, pero aplicando desplazamiento: MOV WORD PTR DS:[DI+7654H],5 Introduce el valor 5 (tipo palabra) en la posicin de memoria direccionada mediante: DI + 7654H (es prcticamente igual que la instruccin anterior, excepto que en sta, hemos incluido el registro DS para acceder a la posicin de memoria oportuna). La codificacin de la instruccin quedara como sigue: MOV WORD PTR DS:[DI+7654H],5 ==> C7 85 54 76 05 00 El 'Byte EA', de esta instruccin, es: 85h que en binario queda como: 1000 0101; el MOD est con valor 10 (indica que se usan 2 Bytes para codificar el desplazamiento 7654h); el REG con 000 (ya que el valor a memorizar es un dato inmediato); el R/M con 101 (indicando que, la direccin final, viene dada por: DI + desplazamiento). Veamos algn ejemplo ms: MOV BYTE PTR [DI+7],0AEH Esta instruccin deposita el valor AEh en la posicin de memoria apuntada por: DI+7, dentro del segmento direccionado por ES. Vemoslo ms detalladamente estudiando su codificacin: MOV BYTE PTR [DI+7],0AEH ===> C6 45 07 AE En primer lugar tenemos el cdigo de operacin (C6) que indica, al procesador, que se va a transferir un dato inmediato, de tipo Byte, a una posicin de memoria; el tercer Byte (campo 'desplazamiento') tiene un valor de 7, que es el que hemos indicado en la instruccin (este valor es el que se sumar, a DI, para direccionar la posicin de memoria deseada); el cuarto Byte (campo 'valor inmediato') tiene un valor de AEh (este valor es el que se depositar en la posicin de memoria direccionada mediante DI+7). Solo nos queda estudiar el segundo Byte (Byte EA o modo de direccionamiento), el cual tiene un valor de 45h (en hexadecimal). Este 45h, queda como 0100 0101 (en binario); tenemos as que el MOD tiene un valor de 01 (indica que se utiliza un Byte para indicar desplazamiento), el REG 000 y el R/M 101. Un ltimo ejemplo: MOV WORD PTR [BX+SI+37H],AX Esta instruccin, introduce el valor del registro AX en la direccin de memoria indicada mediante el resultado de la suma: BX+SI+37h, dentro del segmento DS (ya que SI trabaja en DS). Veamos su codificacin: MOV WORD PTR [BX+SI+37H],AX ===> 89 40 37 El primer Byte (cdigo de operacin) tiene el valor 89h que indica que se va a realizar una transferencia de datos, de tipo palabra, desde un registro (tamao palabra) a un destino que puede ser (dependiendo del valor del Byte EA): un registro de tamao palabra o una direccin de memoria (sabemos que el destino se trata de una direccin de memoria porque lo hemos indicado as al teclear la instruccin, pero el procesador no lo sabr hasta que descifre el valor del Byte EA). Este Byte tiene un valor de 40h, que en binario queda como: 0100 0000; el MOD tiene un valor de 01 (indica que se usa 1 Byte para codificar el desplazamiento, pues solo es necesario 1 Byte para codificar el valor 37h); el REG, que aqu tiene valor 000, indica que el registro fuente, empleado, es AX y el R/M, con valor 000, indica que la direccin final se consigue mediante la suma: BX + SI + desplazamiento. Finalmente, el tercer Byte (campo 'desplazamiento') contiene el valor 37h. -- XCHG. Intercambia el contenido de dos registros, o el contenido de un registro y el de una posicin de memoria. Sintaxis: XCHG registro,registro/memoria. XCHG viene del ingls: EXCHANGE (Cambio), por tanto es un cambio entre los dos operandos dados tras el cdigo de operacin de la instruccin. Ejemplo: XCHG AX,WORD PTR [BX] ===> Tras ejecutarse esta instruccin, AX contendr el valor que hubiera en la posicin de memoria direccionada por BX y viceversa. Otro: XCHG CX,DX ===> Intercambia los contenidos de CX y DX. -- PUSH, POP, PUSHF, POPF. Realiza operaciones en la Pila. Ejemplo: PUSH AX ===> Introduce, en la cima de la pila, el valor contenido en AX. -- Transferencia de control. Son un conjunto de instrucciones que permiten, al programador, romper el flujo secuencial en un programa. Su funcin consiste en aadir un valor de desplazamiento al puntero de instrucciones (IP) y, en algunos casos, variar el valor de CS. La finalidad est en permitir: ejecutar trozos de cdigo (si se cumple una condicin), ejecutar trozos de cdigo repetidas veces (bucle), ejecutar trozos de cdigos desde diferentes puntos del programa (procedimientos), etc. O sea son 5 los tipos: - Saltos incondicionales (JMP). - Bucles (LOOP). - Saltos condicionales (Jnnn), donde nnn indica la condicin. - Llamadas a procedimientos (CALL). - Llamadas a interrupciones o funciones (INT).

-- JMP (salto incondicional). Provoca la transferencia de control a la direccin que se especifica a continuacin del cdigo de operacin. Su sintaxis es: JMP direccin Direccin puede ser una etiqueta (la etiqueta es un nombre que asociamos a una lnea de instruccin en ensamblador; es como una especie de apuntador a esa lnea), una direccin contenida en un registro o una variable. Estos saltos pueden ser directos o indirectos (pueden realizarse dentro del mismo segmento o intersegmento). Directo y NEAR: JMP etiqueta ===> Salto a la direccin etiqueta (puede encontrarse antes o despus de la instruccin de salto; es decir, los saltos se pueden realizar hacia adelante o hacia atrs de la instruccin en curso). Tambin es posible tener, una instruccin de salto, a s misma. Ejemplo: Etiqueta: JMP etiqueta ===> Bloquea al ordenador pues estamos en un bucle sin fin. Otro ejemplo: Inicio: JMP Sanbit MOV cx,7 Sanbit: MOV cx,6 Al ejecutar este trozo de cdigo, desde la etiqueta Inicio, la instruccin: MOV cx,7 nunca se ejecutar. Por tanto, al final de este trozo de cdigo, la variable CX tendr valor 6 (las etiquetas pueden tomar cualquier nombre siempre que no pertenezcan al lenguaje ensamblador ni inicie con un nmero). Al final de la etiqueta debe aparecer el caracter : (los dos puntos) el cual le indica, al ensamblador, que es de tipo NEAR, es decir, que va a ser utilizada para saltos dentro del mismo segmento (si no apareciesen los dos puntos se considerara de tipo FAR, utilizada para saltos entre segmentos). Indirecto y NEAR: JMP [BX] ===> Salto a la direccin indicada en el contenido direccionado mediante BX (es un salto dentro del mismo segmento). Indirecto y FAR: JMP FAR PTR [BX] ===> Salto (a otro segmento) al contenido de la direccin (apuntada por BX ) en doble palabra (nuevos valores de IP y CS). -- LOOP (Bucle o Lazo) Esta instruccin sirve para ejecutar un trozo de cdigo un nmero de veces dado (indicado mediante el registro CX). En cada iteracin del bucle se decrementa el valor del registro CX (el bucle finalizar cuando CX tenga valor 0, es decir, cuando se hayan producido tantas iteraciones como indicaba CX antes de entrar al bucle). Veamos un ejemplo: MOV CX,7 INICIO_BUCLE: ADD WORD PTR [BX],CX INC BX LOOP INICIO_BUCLE MOV SI,BX En el ejemplo que estamos tratando tenemos un bucle que se va a repetir 7 veces. En cada una de estas iteraciones se van a realizar dos operaciones aritmticas; tras realizarlas, llegamos a la instruccin LOOP inicio_bucle. Esta instruccin comprueba si CX vale 0 (previo haberlo decrementado); en caso afirmativo, no hace nada y sigue el flujo de control por la siguiente instruccin (en este caso: MOV SI,BX); en caso de que CX tenga un valor distinto de 0 se bifurca a la direccin inicio_bucle (se va a realizar la siguiente iteracin). Del mismo modo que el utilizar variables nos evita tener que indicar posiciones de memoria concretas (del modo: [2346h], [7283h], etc.), es ms cmodo usar nombres (como: coordenada_superior, valor_total, posicion_cursor, modo, etc.). Usar etiquetas es la solucin, que nos ofrece el ensamblador, para poder dirigirnos a posiciones de memoria en nuestros saltos, bucles, etc. (tambin, se pueden usar para indicar donde empiezan determinadas estructuras de datos). -- Saltos condicionales (Jnnn). Se usan (en ensamblador) para ejecutar otros trozos de cdigo (dependiendo de un resultado o del valor de determinado registro o Variable). Para realizar un salto condicional, usualmente, antes hemos de hacer una comparacin u operacin aritmtica o lgica. -- Comparaciones. Es raro el programa ensamblador en el que se encuentre una comparacin y acto seguido no haya un salto condicional. La sintaxis de la instruccin es: CMP registro,registro CMP registro,memoria CMP memoria,registro CMP registro,valor CMP valor,registro El orden de los operandos (a comparar) es muy importante (no es lo mismo la instruccin CMP AX,7 que CMP 7,AX ; en la comparacin obtenemos ms informacin que un simple 'son iguales' o 'son diferentes', tambin sabemos qu operando es el mayor). Si queremos comparar 2 registros (por ejemplo: AX con CX) la instruccin apropiada ser: CMP AX,CX. Los datos a comparar deben ser del mismo tamao (se comparar un dato de tipo Byte con otro de tipo Byte o uno de tipo palabra con otro de tipo palabra (nunca se comparar uno de tipo Byte con otro de tipo palabra). Un ejemplo de mala utilizacin de CMP es: CMP AX,CL ===> No podemos comparar un dato de tipo palabra (AX) con uno de tipo Byte (CL). El 'medio de comunicacin' (por decirlo de alguna manera) entre una comparacin y el salto condicional asociado, son las banderas de estado (FLAGS). Lo que hace la instruccin de comparacin es restar, al primer operando, el segundo (lo hace mediante unos registros internos del procesador, a los que no tiene acceso el programador de forma que los operandos usados, por el programador, no se alteren). Al realizar esta resta, se actualiza el registro de estado (FLAGS); es decir que si los dos datos eran iguales, la bandera Zf tendr valor activo (indicando que el resultado es cero). Cuando un dato es menor que otro son otros flags los que se activan, como el Cf (flag de acarreo o Carry). Todos los saltos condicionales deben estar dentro del rango: +127 -128 Bytes; es decir, que solo se pueden saltar 127 Bytes hacia adelante y 128 hacia atrs (dentro del cdigo del programa). Si sumamos esos 127 Bytes y los otros 128 tenemos un valor de 255 que es el mayor nmero que puede contener un dato de tipo Byte (con un Byte se indica lo grande que va a ser el salto). Tambin es til saber que existen saltos condicionales empleados cuando se comparan datos con y sin signo. -- Saltos basados en datos sin signo: Instruccin Efecto Flags comprobados --------------------------------------------------------------------------------------------JE/JZ (salta si igual) Zf=1 JNE/JNZ (salta si no igual) Zf=0 JA/JNBE (salta si superior) Cf=0 y Zf=0 JAE/JNB (salta si superior o igual) Cf=0 JB/JNAE (salta si inferior) Cf=1 JBE/JNA (salta si inferior o igual) Cf=1 Zf=1

-- Saltos basados en datos con signo: Instruccin Efecto Flags comprobados --------------------------------------------------------------------------------------------JE/JZ (salta si igual) Zf=1 JNE/JNZ (salta si no igual) Zf=0 JG/JNLE (salta si mayor) Zf=0 y Sf=Of JGE/JNL (salta si mayor o igual) Sf=Of JL/JNGE (salta si menor) Sf<>Of JLE/JNG (salta si menor o igual) Zf=1 Sf<>Of Adems de estos saltos, encontramos una serie de saltos condicionales basados en comprobaciones aritmticas especiales: Instruccin Efecto Flags comprobados --------------------------------------------------------------------------------------------JS (salta si negativo) Sf=1 JNS (salta si no negativo) Sf=0 JC (salta si se ha producido acarreo) Cf=1 JNC (salta si no se ha producido acarreo) Cf=0 JO (salta si se ha producido overflow) Of=1 JNO (salta si no se ha producido overflow) Of=0 JP/JPE (salta si paridad par) Pf=1 JNP/JPO (salta si paridad impar) Pf=0 JCX (salta si CX=0) registro CX=0 Veamos las equivalencias entre las sentencias if..then (de los lenguajes de alto nivel) y las construcciones CMP..Jnnn. -- El equivalente a la sentencia: 'If modo=5 then fondo=7' vendra dado, en ensamblador, por la construccin: CMP modo,5 jnz no_fon mov fondo,7 no_fon: ............ -- El equivalente a: CMP modo,5 jnz no_fon mov fondo,7 jmp fin_fon no_fon: mov fondo,6 fin_fon: ............ -- El equivalente a: 'If modo <> 24 then fondo=modo' quedara, en ensamblador, de la siguiente manera: CMP modo,24 ; suponemos las variables (fondo y modo) de tipo Byte. jz fin_fon mov al,modo mov fondo,al fin_fon: ............. 'If modo < 23 then modo=23' quedara, en ensamblador, de la siguiente manera: 'If modo=5 then fondo=7 else fondo=6' vendra dado en ensamblador por:

--El equivalente a: CMP modo,23 jnb fin_fon mov modo,23 fin_fon: .............

-- Llamadas a procedimientos (CALL). Al igual que en los lenguajes de alto nivel, en ensamblador, tenemos los llamados procedimientos (trozos de cdigo que van a ser usados en distintas partes del programa) los cuales nos permiten tener un cdigo ms estructurado. El formato de un procedimiento, en ensamblador, es tal como el ejemplo de llamado a inicializacin que cuando va a ser llamado, desde otro segmento, se dice que es tipo FAR y se declara as: inicializacin PROC FAR Cuerpo del procedimiento. RET ; Instruccin para retornar del Procedimiento. inicializacin ENDP Cuando el procedimiento se usa solo en el segmento que fue declarado se denomina NEAR; en este caso no es necesario indicar que se trata de NEAR (si no se especifica que es FAR, se supone que es NEAR). O sea que, los siguientes formatos, son equivalentes: inicializacin PROC Cuerpo del procedimiento. RET inicializacin ENDP inicializacin PROC NEAR Cuerpo del procedimiento. RET inicializacin ENDP Para llamar a un procedimiento y transferirle (de este modo) el control usamos la instruccin: CALL nombre_procedimiento En el caso del ejemplo anterior, sera: CALL inicializacin (inicializacin = nombre que se le dio al procedimiento). Existen dos tipos de llamadas a procedimientos: -- Llamadas directas: se hacen mediante la instruccin CALL nombre_procedimiento. -- Llamadas indirectas: no se especifica el nombre en cuestin sino la direccin que contiene la direccin de comienzo del procedimiento que se quiere llamar (este mtodo se suele usar en programacin de utilidades residentes, cuando se llama a una interrupcin parcheada). En este tipo de llamada (en funcin de que sea de tipo NEAR o FAR) las posiciones de memoria donde tengamos almacenada la direccin sern de tipo WORD (palabra) o DWORD (doble palabra).

-- Llamadas a Interrupciones o funciones (INT). Ya vimos que pueden haber interrupciones tipo hardware y software (llamadas a procedimientos o subrutinas). Estas ltimas se encuentran en la ROM del ordenador y utilizan al registro acumulador (AX), implcitamente, el cual debe ser cargado antes de invocar la instruccin; por otra parte, tambin estn las funciones del DOS (sistema operativo de discos) entre otras. Es decir, hay ciertas funciones de muy bajo nivel como: acceso a discos, teclado, etc., que vienen programadas en la ROM, del ordenador, para mantener compatibilidad con el resto de las PC's y, por otra parte, ayudar al usuario en la programacin. El sistema operativo ofrece, al programador, una serie de funciones para manejo de: ficheros, memoria, etc.; la manera de utilizar estas funciones (pasarles el control) es a travs de la instruccin INT cuya sintaxis es la siguiente: INT nmero_interrupcin. Donde nmero_interrupcin es un nmero entre 0 y 255. Por ejemplo, para acceder al driver de video, se usa: INT 10H ===> Provocara una llamada a la interrupcin 10h (16 en decimal). De igual forma, para acceder a las funciones del DOS, tenemos: INT 21H ===> Provocara una llamada a la interrupcin 21h (33 en decimal). Estas interrupciones de software se dividen en funciones y stas, a su vez, en subfunciones. Para acceder a cada funcin Subfuncin, existe una convencin de llamada (hay que introducir, en determinados registros, el valor adecuado). Por ejemplo, para crear un fichero, accedemos a la funcin 3Ch de la interrupcin 21h y la llamada se realiza as: MOV AH,3Ch ; Seleccionamos la funcin INT 21H ; pasamos el control a la funcin. Otro ejemplo sera leer un caracter desde el teclado; llamamos a la funcin 00h de la interrupcin 16h, como sigue: MOV AH,00h ; Seleccionamos la funcin INT 16H ; pasamos el control a la funcin. -- Instrucciones aritmticas (En principio trabajaremos con nmeros codificados en binario sin signo). A diferencia de los lenguajes de alto nivel (en los que existen instrucciones aritmticas), en ensamblador del 8086, contamos solo con unas pocas instrucciones bsicas fundamentales, como son : suma, resta, producto, divisin y algo ms. -- ADD (Suma en el 8086). Realiza la suma entre dos operandos dados (estos operandos deben ser del mismo tamao). Sintaxis: ADD operando1,operando2. Se realiza la suma de los dos operandos y se deposita el resultado en el operando1 (puede producirse desbordamiento). Por ejemplo: ADD AX,BX cuando: AX=F000H y BX=3333H. Al realizarse la suma se produce overflow (desbordamiento), quedando (tras la ejecucin): AX=2333H (con la correspondiente prdida del bit ms significativo); esta situacin se indica en el registro de estado (FLAGS) activando el flag de overflow (Of). Otro ejemplo: ADD CX,WORD PTR [BX] ===> Suma, a CX, el contenido (16 bits) de la posicin de memoria direccionada mediante BX. Otro: ADD BYTE PTR [SI],7 ===> Suma el valor 7 al contenido (8 bits) de la posicin direccionada por SI. Otro ms: ADD variable1,2345h ===> Suma, a la variable1 (que hemos tenido que definir de tipo palabra), el valor 2345h (tipo palabra). -- SUB (Resta en el 8086). Realiza la resta entre dos operandos dados (estos operandos deben ser del mismo tamao). Sintaxis: SUB operando1,operando2. Resta, del primer operando, el segundo. Aqu tambin se nos pueden plantear situaciones especiales como cuando restamos, a un operando pequeo, uno ms grande (recordemos que por ahora solo trabajamos en binario puro, es decir, nmeros sin signo). Por ejemplo: SUB CX,DX cuando: CX =0077h y DX=8273h. Tras realizarse la operacin: CX =7E74h; esto se debe a que la resta se realiza de derecha a izquierda y bit a bit. Es decir: CX = 0000 0000 0111 0111 - DX = 1000 0010 0111 0011 -------------------------CX = 0111 1110 0111 0100 = 7E74H (en base hexadecimal). Otro ejemplo: SUB AX,37h ===> Resta, al AX, el valor 37h Otro: SUB BYTE PTR ES:[SI],AL ===> Resta, el valor contenido en AL, al contenido direccionado mediante SI (dentro del segmento de datos apuntado por ES). Otro ms: SUB variable1,word ptr [di] ===> Este ejemplo es de instruccin no permitida (no podemos direccionar dos posiciones de memoria en la misma instruccin. Es decir que esta instruccin tendr que escribirse as: MOV AX,WORD PTR [DI] ===> Deposito, en AX, el valor contenido en la posicin de memoria direccionada por DI (de esta manera, en la siguiente instruccin usar AX y no un contenido de memoria). Otro: SUB variable1,AX ===> Resta, a variable1 (posicin de memoria tipo palabra), el contenido del registro AX. -- INC (Incremento en una unidad). Se utiliza cuando se quiere sumar una unidad a un valor dado. La sintaxis es: INC operando. Ejemplo: INC AX ===> Incrementa, el valor de AX, en una unidad (si antes de la instruccin, AX, tena el valor 3656h ahora tendr 3657h). Muy importante: Si antes de la instruccin, AX, tena el valor FFFFh ahora tendr el valor 0000h (al sumar bit a bit y de derecha a izquierda, quedan todos en cero (con un 1 que se pierde porque no cabe en el registro); aqu se producira overflow. Otro ejemplo: INC BYTE PTR [BX] ===> Incrementa, en una unidad, el valor contenido en la posicin direccionada por BX. -- DEC (Decremento en una unidad). Se utiliza cuando se quiere restar una unidad a un valor dado. La sintaxis de la instruccin es: DEC operando. Ejemplo: DEC AX ===> Decrementa, el valor de AX, en una unidad (si antes de la instruccin, AX, tena el valor 3656h ahora tendr 3655h). Muy importante: Si antes de la instruccin, AX, tena el valor 0000h ahora tendr el valor FFFFh (al restar bit a bit y de derecha a izquierda, quedan todos con valor 1). Otro ejemplo: DEC BYTE PTR [BX] ===> Decrementa, en una unidad, el valor contenido en la posicin direccionada por BX. -- ADC (Suma teniendo en cuenta el acarreo anterior). Se utiliza para operaciones cuyos operandos tienen ms de un registro de longitud (al hacer la suma, se tiene en cuenta el posible acarreo de una operacin anterior). Esto es posible gracias a la bandera Cf (de acarreo).

-- SBB (Resta teniendo en cuenta 'lo que pido prestado' de la operacin anterior): Se utiliza para operaciones cuyos operandos tienen ms de un registro de longitud (se resta, el operando fuente, del destino y si Cf = 1, se resta una unidad). -- Multiplicacin y Divisin: Estas operaciones aceptan solo un operando y, segn sea su tamao (Byte o palabra), asumen que el otro est en AL o AX, respectivamente (tienen el registro acumulador implcito en la instruccin). -- MUL (multiplicacin de datos sin signo). Sintaxis: MUL operando (Registro o contenido de memoria). Realiza la multiplicacin, del operando dado, con el acumulador (dependiendo del tamao del operando introducido en la operacin, el procesador, tomar AL o AX como segundo operando). -- Operando de tipo Byte El procesador asume que, el otro operando, se encuentra en AL y el resultado lo depositar en el registro AX. -- Operando de tipo palabra El procesador asume que, el otro operando, est en AX y el resultado, de la operacin, lo depositar en el par de registros DX:AX (DX la parte ms significativa o de mayor peso del resultado). -- IMUL (multiplicacin de datos con signo). Igual que el MUL pero teniendo en cuenta que se trabaja con nmeros signados. -- DIV (Divisin de datos sin signo). Sintaxis: DIV divisor (Registro o contenido de memoria). Divide el operando (almacenado en el registro acumulador) por el divisor. Es decir: acumulador/divisor (dependiendo del tamao del divisor introducido, el procesador, asume que el dividendo se encuentra en AX o en el par de registros DX,AX). -- Divisor de tipo Byte El procesador asume que, el dividendo, se encuentra en AX y el resultado se descompondr en AH (resto) y AL (cociente). -- Divisor de tipo palabra El procesador asume que, el dividendo, se encuentra en el par de registros DX:AX (AX es la parte menos significativa) y el Resultado, de la operacin, se descompondr en DX (resto) y AX (cociente). Importante: hay que tener en cuenta, al utilizar esta instruccin, que la ejecucin de la operacin no desemboque en error (sucede con la divisin por cero o cuando el cociente, obtenido en una divisin, no cabe en el registro utilizado para almacenarlo). En estos casos, se produce una INT 0, que origina la terminacin del programa en curso. -- IDIV (Divisin de datos con signo). Igual que el DIV pero teniendo en cuenta que se trabaja con nmeros signados. -- Instrucciones para manejo de bits. -- Instrucciones de desplazamiento de bits Son instrucciones que nos permiten desplazar los bits dentro de un registro o una posicin de memoria. Estas instrucciones actan sobre datos de tipo Byte (8 bits) y de tipo palabra (16 bits). -- SHL (desplazamiento a la izquierda). Mediante esta instruccin podemos desplazar, a la izquierda, los bits de un registro o posicin de memoria (es la manera ms rpida y cmoda de multiplicar por nmeros equivalentes a potencias enteras de 2). Los desplazamientos pueden ser de una sola posicin o de varias. Cuando queremos realizar un solo desplazamiento usamos los formatos: SHL registro,1 SHL memoria,1 Pero cuando queremos realizar desplazamientos de ms de 1 posicin, debemos usar el registro CL (para indicar el nmero de desplazamientos deseados): SHL registro,CL SHL memoria,CL Ejemplo 1: queremos desplazar (a la izquierda) una posicin los bits del registro AL; la instruccin necesaria sera: SHL AL,1. Supongamos que, en principio, AL = B7h; si antes de realizar la operacin, el registro AL, tiene el valor: 1011 0111 Tras realizar el desplazamiento, el registro quedara como: 0110 1110 Hemos desplazado todos los bits una posicin a la izquierda; el bit de mayor peso (bit 7), o el de ms a la izquierda, se pierde y el bit de ms a la derecha (bit 0), o de menor peso, toma el valor 0. El AL (tras la instruccin) queda en 6Eh. Si volvemos a ejecutar la instruccin (SHL AL,1), con el nuevo valor de AL (tras la ejecucin), tendremos: AL = 1101 1100 y si pasamos, este nmero (binario), a hexadecimal tenemos: AL = 0DCh. Si seguimos realizando desplazamientos terminaremos por quedarnos con el registro con todos los bits en cero, debido a que el valor que entra por la derecha, en cada desplazamiento, es un cero (0). Ejemplo 2: queremos desplazar 3 posiciones a la izquierda los bits del registro AL; para ello, primero, tenemos que introducir en CL el nmero de 'movimientos' que se van a realizar (sobre cada bit) y luego ejecutar la instruccin de desplazamiento. As: MOV CL,3 ===> Indicamos 3 'desplazamientos'. SHL AL,CL ===> Realiza el desplazamiento hacia la izquierda (3 veces). Supongamos que antes de ejecutar la instruccin: AL = 83h (en binario: AL = 1000 0011). Tras la instruccin, los bits quedaran: AL = 0001 1000 (en hexadecimal: AL = 18h). Ejemplo 3: supongamos que queremos multiplicar, el contenido del registro AL, por 2; podremos realizarlo mediante: SHL AL,1 (cuando estemos seguros que el bit de mayor peso valga cero ya que se perdera al realizar el desplazamiento, con lo cual la multiplicacin sera errnea). Evidentemente, si hacemos 2 desplazamientos, estamos multiplicando por 4 y con 3 por 8, etc. -- SHR (desplazamiento a la derecha). Mediante esta instruccin podemos desplazar, a la derecha, los bits de un registro o posicin de memoria (es la instruccin opuesta y complementaria a SHL). En este caso, la instruccin puede utilizarse para realizar divisiones por 2. Los desplazamientos pueden ser de una sola posicin o de varias. Cuando queremos realizar un solo desplazamiento usamos los formatos: SHR registro,1 SHR memoria,1 Pero cuando queremos realizar desplazamientos de ms de 1 posicin, debemos usar el registro CL (para indicar el nmero de desplazamientos deseados): SHR registro,CL SHR memoria,CL Ejemplo: queremos desplazar, a la derecha, una posicin los bits del registro DX; la instruccin necesaria sera: SHR DX,1. Supongamos que en principio: DX = 4251h (el valor binario sera: 0100 0010 0101 0001). Tras realizar el desplazamiento, el registro quedara como: DX = 0010 0001 0010 1000. Hemos desplazado todos los bits una posicin a la derecha; el bit de menor peso (bit 0), o el de ms a la derecha, se pierde y el de

ms a la izquierda (bit 15), o de mayor peso, toma el valor 0. El registro DX (tras la instruccin) queda en 2128h. Si volvemos a ejecutar la instruccin (SHR DX,1), con el nuevo valor de DX (tras la ejecucin), tendremos: DX = 0001 0000 1001 0100 Si pasamos este nmero (binario) a hexadecimal, tenemos que: DX = 1094h. Si seguimos realizando desplazamientos, a la derecha, terminaremos por quedarnos con el registro con todos los bits en cero debido a que el valor que entra por la izquierda, en cada desplazamiento, es 0. -- Instrucciones de rotacin de bits Son anlogas a las anteriores (de desplazamiento); la diferencia es que no se producen desplazamientos sino rotaciones en los bits ( no se pierde ningn bit ya que entra por el lado opuesto al que sale). Estas instrucciones, al igual que las anteriores, actan sobre datos de tipo Byte (8 bits) y de tipo palabra (16 bits). -- ROL (Rotacin a la izquierda). Rota a la izquierda los bits de un registro o posicin de memoria (el bit ms significativo, al rotar, pasa a ser el menos significativo). Sintaxis: ROL registro,1 ROL registro,CL ROL memoria,1 ROL memoria,CL Ejemplo: tenemos el registro AL con el valor 78h que, en binario, es: 0111 1000. Si ejecutamos la instruccin (ROL AL,1) AL tendr el valor binario: 1111 0000. Si volvemos a ejecutar esa instruccin, con el nuevo valor de AL, tendremos: 1110 0001. Si lo volvemos a hacer repetidas veces, tendremos: 1100 0011 1000 0111 0000 1111 0001 1110 0011 1100 0111 1000 ===> volvi al valor original. -- ROR (Rotacin a la derecha). Rota a la derecha los bits de un registro o posicin de memoria (el bit menos significativo, al rotar, pasa a ser el ms significativo). Sintaxis: ROR registro,1 ROR registro,CL ROR memoria,1 ROR memoria,CL Ejemplo: tenemos el registro AL con el valor 78h (igual que en el ejemplo anterior). Si ejecutamos la instruccin (ROR AL,1) AL tendr el valor binario: 0011 1100. Si lo volvemos a hacer repetidas veces, tendremos: 0001 1110 0000 1111 1000 0111 1100 0011 1110 0001 1111 0000 0111 1000 ===> volvi al valor original. -- RCL y RCR (Rotar a izquierda y derecha con carry o acarreo). Estas instrucciones son variantes de las anteriores. La diferencia estriba en que la accin de rotar se va a hacer en dos pasos: 1.- El bit que se encuentra en el flag Cf es el utilizado para introducir en el extremo del operando. 2.- El bit que sale por el otro extremo (bit rotado) pasa a la bandera Cf. Ejemplo: Tenemos el registro AL con el valor 78h (igual que en el ejemplo anterior) y tenemos el Cf (flag de Carry o acarreo) con valor 1, en binario: AL = 0111 1000 Cf=1. Si ejecutamos la instruccin (RCR AL,1) AL tendr el valor binario: 1011 1100 (el valor que ha entrado por la izquierda es el que tena Cf, pero a la vez, esta bandera tendr valor cero por el bit rotado de la derecha). -- Operaciones lgicas o booleanas Estas trabajan a nivel de bits con un tamao de operando dado; no es lo mismo un NOT 7 con un tipo de datos Byte (originara, como Resultado, un 248), que hacer un NOT 7 con un tipo de datos word (originara, como resultado, un 65528). Vemos que el tipo de Datos, sobre el que se realiza una operacin lgica, condiciona el resultado de la operacin. La finalidad de estas instrucciones es modificar uno o varios bits concretos de un registro o una posicin de memoria (son tiles para aislar ciertos bits y trabajar, con ellos, como si fueran variables independientes). Es decir que, usando adecuadamente estas operaciones lgicas, podemos tener hasta 16 variables (con valor 0 1) en un registro de tipo word. -- NOT (no lgico). Consiste en sustituir los unos por ceros y viceversa en un operando dado. Sintaxis: NOT registro/posicin_de_memoria. Ejemplo: NOT AL Supongamos que AL tiene el valor 99h (en binario tendramos: AL = 1001 1001). La instruccin invierte el valor de cada bit (si antes de la instruccin vala 1, ahora valdr 0 y viceversa). Siguiendo este criterio, despus de realizar la operacin, AL valdr: 0110 0110, que en base 16 (hexadecimal) es: AL = 66h. Si ejecutamos de nuevo la instruccin (NOT AL), con el nuevo valor de AL, obtendremos el mismo valor que al principio (AL = 99h). Otro: veamos qu sucede con la operacin NOT AX, suponiendo que: AX = 99h (ahora estamos trabajando sobre un operando de tamao word o palabra, por lo tanto, tenemos 16 bits para cambiar de valor), en binario: 0000 0000 1001 1001; despus de la instruccin: AX = 1111 1111 0110 0110 (en base 16, AX = 0FF66H). Nota: el 0 (de 0FF66H) se pone para que, el ensamblador, sepa que estamos refirindonos a un nmero y no a una variable llamada FF66H. -- AND (y lgico). La operacin lgica AND (al contrario que la NOT) opera sobre dos operandos (el resultado se almacena en el primer operando, que puede ser un registro o una posicin de memoria). El resultado se obtiene de la siguiente manera: se compara cada uno de los bits del primer operando con los correspondientes del segundo (si ambos son unos el bit del resultado se pone en uno; si alguno de los dos o los dos son ceros el bit del resultado valdr cero; de ah viene el nombre de la instruccin: uno y otro). Esta operacin se utiliza para poner en cero determinados bits. Sintaxis: AND registro,registro AND registro,posicin_de_memoria

AND registro,valor_inmediato AND posicin_de_memoria,registro AND posicin_de_memoria,valor_inmediato Ejemplo: supongamos que AX = 1717h y que VAR1 (variable con la que accedemos a una posicin de memoria del tipo Word) tiene el valor 9876h. En binario tendramos: AX = 0001 0111 0001 0111 VAR1 = 1001 1000 0111 0110 Se trata de operandos de tipo word (16 bits) por lo tanto hay que realizar 16 operaciones (1 para cada posicin) con los bits. El resultado de AND AX,VAR1 sera: AX = 0001 0000 0001 0110 ===> 1016h. -- OR (o lgico). Se utiliza para poner en uno determinados bits de un registro o posicin de memoria; trabaja sobre dos operandos (almacenando el resultado en el primer operando). El resultado se obtiene de la siguiente manera: se compara cada uno de los bits, del primer operando, con los correspondientes del segundo (si alguno es uno el bit del resultado se pone en uno; si los dos son ceros el bit del resultado valdr cero; de ah viene el nombre de la instruccin: uno u otro). Sintaxis: OR registro,registro OR registro,posicin_de_memoria OR registro,valor_inmediato OR posicin_de_memoria,registro OR posicin_de_memoria,valor_inmediato Ejemplo: supongamos que CL = 25h y que COLUM (variable con la que accedemos a una posicin de memoria del tipo Byte) tiene el valor AEh. En binario tendramos: COLUM = 1010 1110 CL = 0010 0101 Se trata de operandos del tipo Byte (8 bits) por lo tanto hay que realizar 8 operaciones (1 para cada posicin) con los bits. El resultado de OR COLUM,CL sera: COLUM = 10101111 ===> 0AFh. -- XOR (o exclusivo). Opera en modo parecido a la OR pero con una diferencia: se compara cada uno de los bits, del primer operando, con los del segundo y si ambos tienen igual valor el bit del resultado ser cero. Sintaxis: XOR registro,registro XOR registro,posicin_de_memoria XOR registro,valor_inmediato XOR posicin_de_memoria,registro XOR posicin_de_memoria,valor_inmediato Esta instruccin se usa, normalmente, para poner en cero un registro (es la manera ms rpida). Ejemplo: supongamos que queremos poner a cero el registro AX (da igual el valor que tenga AX ) con valor 2637h. En binario tendramos: AX = 0010 0110 0011 0111 Si realizamos la operacin (XOR AX,AX) llegamos a la conclusin que todos los bits, del resultado, van a ser ceros (al comparar un registro, con si mismo, todos los bits son iguales); la operacin lgica ser: AX = 0010 0110 0011 0111 AX = 0010 0110 0011 0111 --------------------------AX = 0000 0000 0000 0000 Esta forma de borrar es ms rpida pues tarda, en realizarse, 3 pulsos (de reloj) y tiene un cdigo ejecutable de 2 Bytes mientras que la (MOV AX,0) tiene 3 Bytes y tarda 4 pulsos de reloj. -- TEST (prueba). Es similar a la AND pero no modifica el valor de los operandos (solo el registro de estado ya que, para realizar la operacin, utiliza registros internos del procesador). Esta instruccin se realiza para comprobar el valor de uno o varios bits dentro de un registro. Sintaxis: TEST registro,registro TEST registro,posicin_de_memoria TEST registro,valor_inmediato TEST posicin_de_memoria,registro TEST posicin_de_memoria,valor_inmediato Ejemplo: existen dos posiciones consecutivas de memoria, tipo Byte, que utiliza la ROM BIOS para mantener y actualizar el estado de teclas especiales; nos interesa solo 0000:0417h (posicin 0417h dentro del segmento que comienza en la 0000h); esta posicin de memoria contiene la siguiente informacin lgica: bit 7 6 5 4 3 2 1 0 Estado de teclas cuando el bit correspondiente tiene valor 1. ---------------------------- ===> Tecla Maysculas derecha pulsada. ====> Tecla Maysculas izquierda pulsada. =====> Tecla Control pulsada. ======> Tecla Alt pulsada. =======> Scroll Lock activado. ========> Num Lock activado. =========> Caps Lock (Bloq Mays) activado. ==========> Insert activado. Si el bit 3 (tecla ALT) estuviera en cero querra decir que no est pulsada (en estos momentos). El bit 7 contiene informacin booleana o lgica (verdadero o falso) acerca del modo de insercin del teclado (mediante este bit podremos saber si est activado o no); debido a que hay otras variables lgicas, dentro de este Byte, no podemos realizar una comparacin para conocer el estado de insertar ( no podemos escribir : CMP BYTE PTR ES:[DI],10000000b ). El proceso debera ser: ;******** trozo de programa. XOR AX,AX ; Pone en cero al AX (ganando en rapidez y tamao del programa ejecutable. MOV ES,AX ; Hace que la base del segmento direccionado, mediante el registro ES, se encuentre en ; la posicin 0000h (al principio de la memoria de la PC) ya que no es posible ; introducir un valor_inmediato en un registro de segmento (no podemos escribir: ; MOV ES,0000h) pues el procesador no lo permite; debemos valernos de otro registro, ; como: AX, DX, etc., para introducir el valor deseado en el de segmento. TEST BYTE PTR ES:[0417H],10000000b ; En el: TEST posicin_de_memoria, valor inmediato, debemos indicar que vamos a ; comparar una posicin de tipo Byte (lo hacemos mediante: BYTE PTR) indicando, ; a continuacin, el segmento y desplazamiento (donde se encuentra ese Byte).

; Utilizamos el nmero 10000000b (como valor_inmediato) para indicar que vamos a ; examinar el bit 7 (modo insertar). JZ no_insertando ; Si el Zf es uno: hacemos un salto condicional a una posicin del programa en la que se ; realizan las acciones para el teclado en modo de no insercin. [....] ; Se realizan las instrucciones para el modo de insercin. JMP fin_insercin ; Salta al trozo siguiente al reservado para el modo de no insercin. no_insertando: ; Trozo de cdigo preparado para utilizar en el caso en que el teclado NO est en el [....] ; modo de insercin. fin_insercin: ; Hemos terminado con el tema de la insercin y pasamos a otra cosa. ;****** fin del trozo de programa. Para comprenderlo mejor vamos a suponer que el Byte ES:[0417H] tiene el valor: ES:[0417H] = 1010 1110 valor_inmediato = 1000 0000 -------------TEST = 1000 0000 El Zf, tras la operacin (que indica si el resultado es cero), estar en cero (el resultado tiene un valor distinto de cero); por lo tanto, insertar est en el modo activo. Supongamos, ahora, que el Byte ES:[0417H] tiene el valor: ES:[0417H] = 0010 0010 valor_inmediato = 1000 0000 -------------TEST = 0000 0000 El Zf estar en uno (el resultado tiene un valor de cero); en este caso, insertar, est en modo inactivo (el teclado est en modo SOBREESCRIBIR). -- NEG (complemento a 2). Esta operacin, por su forma de trabajar, se utiliza para convertir (un nmero) en negativo. Ejemplo: NEG AX ; Equivale a: NOT AX seguido de INC AX -- Operaciones para el manejo de hileras o cadenas de caracteres Nos permiten (a grandes rasgos) realizar movimientos de bloques de una zona de la memoria a otra. -- MOVS (MOV String: mover cadena de caracteres). Se utiliza para mover un Byte o una palabra desde la posicin de memoria direccionada por DS:SI a la ES:DI (antes de introducir esta instruccin, en el programa, deberamos haber cargado los registros con valores apropiados). MOVSB --> Mueve el Byte contenido en la posicin direccionada por DS:SI a ES:DI. MOVSW --> Mueve la palabra contenida en DS:SI y DS:SI+1 a ES:DI y ES:DI+1. -- LODS (LOaD String: cargar, cadena de caracteres, en el acumulador). Se utiliza para introducir, en el registro acumulador (AX si trabajamos con palabras o AL si es con Bytes), la palabra o Byte direccionado mediante DS:SI. LODSB ---> Introduce, en AL, el Byte contenido en la posicin direccionada por DS:SI. LODSW ---> Introduce, en AX, los Bytes contenidos en DS:SI y DS:SI+1. -- STOS (STOre String: almacenar cadena de caracteres). Almacena, el contenido del acumulador (AX si trabajamos con palabras o AL si es con Bytes), en la posicin de memoria direccionada mediante ES:DI. STOSB ---> Almacena, el AL, en la posicin direccionada por ES:DI. STOSW ---> Almacena, el AX, en las posiciones direccionadas por ES:DI y ES:DI+1. -- CMPS (CoMPare String: comparar cadenas de caracteres). Se usa para comparar cadenas de caracteres (compara las cadenas que empiezan en las direcciones DS:SI y ES:DI). Podemos comparar un Byte (el de una cadena con el de otra) o una palabra (la de una cadena con la de otra). CMPSB ---> Compara el Byte contenido en DS:SI con el situado en ES:DI. CMPSW ---> Compara la palabra contenida en DS:SI y DS:SI+1 con la situada en ES:DI y ES:DI+1. -- SCAS. Compara el contenido del acumulador (AX si trabajamos con palabras o AL si es con Bytes) con la palabra o Byte contenido en la posicin de memoria ES:DI. SCASB ---> Compara, el AL, con el Byte contenido en la posicin ES:DI. SCASW ---> Compara, el AX, con la palabra contenida en las posiciones ES:DI y ES:DI+1. Lo ms normal es utilizar estas instrucciones antecedidas de una de las siguientes partculas de repeticin: -- REP (REPetir CX veces) Repite una operacin de cadenas (antecedida) tantas veces como indique el registro CX (tras cada repeticin se decrementa el CX y se pregunta si es cero) incrementando o decrementando los ndices usados (SI y/o DI): uno solo (STOS, LODS, SCAS) o los dos (MOVS, CMPS); dependiendo del tamao usado (Byte o palabra), los incrementos o decrementos, sern de 1 o 2 unidades, respectivamente; la forma en que se indica que los movimientos o comparaciones se realizarn hacia adelante o hacia atrs, viene dada por el Df (si queremos que se realicen hacia adelante, debemos poner el Df en cero). Ejemplo: queremos mover 77 palabras (hacia adelante) desde la posicin de memoria 7384h del segmento que comienza en 8273h hacia la zona que comienza en: 7263h:8293h. MOV AX,7263h MOV ES,AX ; Registro del segmento destino (ES) con valor adecuado (7263h). MOV DI,8293h ; Indice destino (DI) con valor adecuado (8293h). MOV AX,8273h MOV DS,AX ; Registro del segmento fuente (DS) con valor adecuado (8273h). MOV SI,7384h ; Indice fuente (SI) con valor adecuado (7384h). MOV CX,77 ; Indicamos que queremos hacer 77 movimientos. CLD ; Los movimientos los vamos a hacer hacia adelante. REP MOVSW ; Realiza 77 veces la instruccin MOVSW, actualizando debidamente los punteros fuente (SI) y ; destino (DI), tras cada iteracin, decrementando el CX (cuando llega a cero deja de repetir la ; instruccin MOVSW). En cada uno de los 77 movimientos, se toma la palabra contenida en DS:SI

; y DS:SI+1 copindola a partir de ES:DI. Acto seguido, se aaden dos unidades a SI y a DI, para ; procesar el resto de las palabras que componen el bloque indicado. Otro: queremos copiar una cadena origen a partir de Cadena_destino. ;******inicio de los datos [...] ; Grupo de datos Cadena_origen db 'SanBit V6.0 (Super Utilidades)' Cadena_destino db 'SanBit V5.6 (Utilidades residentes)' [...] ; Otro grupo de datos ;******fin de datos. ;*****cdigo de programa PUSH DS POP ES ; Le damos, al registro ES, el mismo valor que tiene DS (suponemos que ; el DS estaba apuntado al principio de los datos). MOV SI,OFFSET Cadena_origen ;Mediante OFFSET (desplazamiento) introducimos, en SI, el ; desplazamiento de la variable Cadena_origen (con la instruccin ; MOV SI,Cadena_origen introducimos la primera palabra, contenida en ; Cadena_origen, al registro SI). MOV DI,OFFSET Cadena_destino ; Hacemos que DI apunte a Cadena_destino. CLD ; Indica movimiento de datos hacia adelante. MOV CX,15 ; CX nos da la longitud de Cadena_origen. REP MOVSW ; Realiza 15 movimientos de tipo palabra (mueve 30 Bytes desde ; Cadena_origen hacia Cadena_destino). ;******fin de cdigo de programa. Tras la ejecucin de este trozo de programa, la variable Cadena_destino, tendr la cadena: 'SanBit V6.0 Al trabajar con palabras (en lugar de Bytes) se gana mucho en velocidad pues (el procesador) usa, el BUS, la mitad de las veces. -- REPZ o REPE (Repetir mientras CX <> 0 y Zf = 1). Repite una operacin de comparacin de cadenas (no tiene sentido un movimiento de cadenas con REPZ) tantas veces como indique el CX, siempre que el Zf sea 1 (se realizar la operacin mientras CX sea distinto de cero y los Bytes o palabras comparadas sean iguales). Ejemplo: queremos comparar la cadena de 837 Bytes que inicia en DS:SI con la situada a partir de ES:DI suponiendo que los registros de direccin (DS, SI, ES, DI) tienen valores adecuados. MOV CX,837 ; Indicamos que queremos 837 comparaciones de tipo Byte. REPZ CMPSB ; Realiza la comparacin y si los elementos son iguales (mirando Zf) actualiza SI y DI, ; comprobando si quedan elementos (CX <> 0); si no son iguales, o CX <> 0, deja de realizar ; comparaciones. JNZ diferentes ; Si, tras la instruccin (REP CMPSB), el Zf = 0 (algn Byte, contenido en la cadena fuente, no ; coincide con su correspondiente en la destino) realizamos un salto condicional a un trozo de ; cdigo utilizado para el caso de que las cadenas sean diferentes. [...] ; Grupo de instrucciones que se ejecutan cuando las cadenas son iguales. JMP fin_comparaciones ; Salta al trozo de instrucciones que continan con el programa. diferentes: ; Grupo de instrucciones que se ejecutan cuando las cadenas son diferentes. [...] fin_comparaciones: Una aplicacin de REPZ es para verificar si ha sido instalado, en memoria, un programa (se busca un trozo de programa, desde el principio de la memoria); si no se produce ninguna coincidencia es porque el programa residente no est instalado. -- REPNZ o REPNE (Repetir mientras CX <> 0 y Zf <> 1). Repite una operacin de comparacin de cadenas tantas veces como indique el CX, siempre que el Zf sea 0 (se realizar la operacin mientras CX sea distinto de cero y los Bytes o palabras comparadas sean diferentes). Nota: cuando realizamos comparaciones o movimientos de cadenas, de longitud par, se hace de palabra en palabra (si la longitud es impar se trabaja con Bytes). -- FUNCIONES DEL DOS (Sistema Operativo de Discos). Son todas aquellas interrupciones de software utilizadas, por el programador y por el propio sistema operativo, para acceder a los distintos subsistemas del procesador como son: discos, teclado, ficheros (parte lgica), etc. Usaremos estas funciones cuando queramos: crear ficheros, borrar ficheros, leer ficheros, solicitar memoria libre (para trabajar con los datos de nuestros programas), etc. En definitiva, las funciones del DOS nos proporcionan un vnculo de comunicacin cmodo y seguro (las BIOS solo nos permiten trabajar con discos en funcin a pistas, sectores, etc., es decir, a ms bajo nivel; nos facilitan el trabajo con la parte fsica, por ejemplo: sector X del cilindro Y de la cabeza Z). Al trabajar con la parte lgica (ficheros), el DOS debe hacer uso de la parte fsica (que es donde estn almacenados los ficheros); para este trabajo, las funciones DOS usan las BIOS. Entre las interrupciones ms importantes (de las funciones DOS) estn: -- INT 20h = Terminacin de proceso. -- INT 22h = Gestor de terminacin del programa en curso. -- INT 23h = Gestor de CTRL+C. -- INT 24h = Gestor de errores crticos. -- INT 25h = Lectura de sectores de disco. -- INT 26h = Escritura de sectores a disco. -- INT 27h = Dejar programa residente y salir (en su lugar usamos la funcin 31h de la INT 21h). -- INT 28h a INT 2Eh = Reservadas (no est permitido su uso al programador). -- INT 2Fh = Interrupcin mltiple o Interrupcin del Multiplexor. Las funciones reservadas han sido pensadas (por los programadores del DOS) para uso exclusivo del mismo DOS o funciones vacas (sin contenido) en previsin de un aumento de funciones (en una prxima versin del DOS). La INT 2Fh proporciona informacin acerca del estado de ciertos programas residentes (del DOS) como: DOSKEY, PRINT, APPEND, SHARE, etc. (podremos saber si estn instalados o no y en caso de que estn, la INT 2Fh, nos sirve como un interfaz o vnculo de comunicacin con estos). La mayora de los servicios o funciones del sistema operativo MS-DOS se obtienen a travs de la INT 21h; es por esto que se la denomina DOS-API ( APPLICATION PROGRAM INTERFACE ) o Interfaz entre programas de aplicaciones y el MS-DOS. La INT 21h est compuesta por un grupo de funciones (antes de acceder hay que indicar el nmero de funcin que queremos ejecutar); en determinados casos, una funcin, es tan compleja que necesita de varias subfunciones para poder desempear todo su trabajo (deberemos indicar el nmero de funcin y el de la subfuncin) por lo tanto, previo a la llamada a la INT 21H se realizar lo siguiente: -- Introducimos, en AH, el nmero de funcin a la que deseamos acceder.

-- En caso de que deseemos acceder a una subfuncin (dentro de una funcin) debemos indicarlo en AL (la mayora de las funciones requieren de otros registros para almacenar el comienzo de: un buffer de disco, una cadena de texto para sacar por pantalla, etc.). Ejemplo: queremos usar la funcin 9h de la INT 21h para sacar por pantalla una cadena de texto (se encuentra almacenada a partir de la etiqueta: cadena_de_texto). MOV AH,9 ; Indicamos el nmero de funcin a ejecutar. MOV DX,OFFSET cadena_de_texto ; Introducimos, en DX, la direccin donde comienza la cadena en cuestin. INT 21h ; Llamamos a la INT 21h la cual ejecutar la funcin 9h. -- Funciones de Entrada/Salida de caracteres -- INT 21h Funcin 01H = Entrada de Caracter con Eco. -- LLAMADA: AH = 01H -- DEVUELVE: AL = Cdigo ASCII del Caracter ledo. -- EFECTO: se lee un caracter del teclado y se enva a la pantalla (si al llamar a la funcin no haba ningn caracter disponible, se esperar a que lo haya). Tanto la entrada como la salida pueden ser redireccionadas (los caracteres se pueden tomar de un dispositivo diferente al teclado y enviar a uno diferente de la pantalla). En la versin 1.0 del MS-DOS se toma el caracter desde teclado y se enva hacia la pantalla (esta funcin no admita redireccin de entrada/salida). -- INT 21h Funcin 02H = Salida de Caracter. -- LLAMADA: AH = 02H DL = Cdigo ASCII a enviar al display -- DEVUELVE: NADA. -- EFECTO: se enva, el caracter depositado en DL, al dispositivo estndar de salida (la salida puede ser redireccionada hacia un fichero, impresora, etc.). En la versin 1.0 del DOS se enva el caracter hacia la pantalla (esta funcin no admita redireccin de Salida). -- INT 21H Funcin 05H = Envo de Caracter a la Impresora. -- LLAMADA: AH = 05H DL = Cdigo ASCII a enviar al dispositivo de salida. -- DEVUELVE: NADA. -- EFECTO: se enva el caracter, depositado en DL, al puerto paralelo (si no se ha redireccionado la salida, el dispositivo, por defecto va en: LPT1 o PRN). En la versin 1.0 del DOS se enva el caracter al primer dispositivo del listado (LPT1 o PRN). En versiones posteriores de MS-DOS, se puede redireccionar la salida. -- INT 21h Funcin 09H = Visualizacin de una cadena de caracteres. -- LLAMADA: AH = 09H DS:DX = comienzo de la cadena a visualizar (DS debe apuntar al comienzo del segmento donde se encuentra la cadena y DX el desplazamiento desde dicho comienzo). -- DEVUELVE: NADA. -- EFECTO: se enva una cadena de caracteres al dispositivo estndar de salida (si no se ha redireccionado, la cadena se enviar a la pantalla). En la versin 1.0 del DOS la cadena debe finalizar con un caracter $ (24h) para reconocer el fin. -- INT 21h Funcin 0BH = Comprobacin del estado de la entrada. -- LLAMADA: AH = 0BH -- DEVUELVE: AL = 00H si no hay caracter disponible. AL = FFH si hay algn caracter disponible. -- EFECTO: se verifica si hay algn caracter procedente del teclado (la entrada puede ser redireccionada). En la versin 1.0 del DOS, en caso de que haya un caracter disponible, sucesivas llamadas a esta funcin seguirn dando un valor verdadero hasta que se recoja el caracter con alguna de las funciones de entrada de caracter (como la funcin 01h). -- Funciones de manejo de disco -- INT 21h Funcin 0EH = Seleccin de disco. -- LLAMADA: AH = 0EH DL = Cdigo de la unidad (0=A , 1=B , etc.) -- DEVUELVE: AL = Nmero de unidades lgicas del sistema. -- EFECTO: Selecciona una unidad de disco para que se convierta en la actual (por default); ofrece, adems, informacin acerca del nmero total de unidades lgicas del sistema. En la versin 1.0 del DOS una unidad fsica (como disco duro) puede estar particionada en varias unidades lgicas designadas por: C, D, E, etc. -- INT 21h Funcin 19H = Obtener disco actual. -- LLAMADA: AH = 19H -- DEVUELVE: AL = Cdigo de la unidad actual (0=A , 1=B , etc.) -- EFECTO: Devuelve el cdigo de la unidad de disco activa o por defecto (para la versin 1.0 del DOS, igual que el anterior). -- Funciones de gestin de directorios -- INT 21h Funcin 39H = Crear directorio (MKDIR). -- LLAMADA: AH = 39H DS:DX = comienzo de una cadena ASCIIZ (cadena de cdigo ASCII que termina con el cdigo de 0h; contiene el nombre y ruta del directorio). -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Se crea un nuevo directorio usando la unidad de disco y la va de acceso especificada en la cadena ASCIIZ. Como en la versin 1.0 del DOS no existan subdirectorios si queremos crear uno llamado PROGS (dentro del DOS) la cadena ASCIIZ se definira as: Nombre_del_directorio db 'C:\DOS\PROGS',0 Si en el momento de llamar la funcin la unidad activa es la C, no es necesario indicarlo (si nos encontramos en el DOS, tampoco necesitamos indicarlo). Esta funcin se aborta (indicndolo mediante Cf y AX) si: - La va de acceso es incorrecta. - El directorio a crear ya existe. - El directorio a crear es un subdirectorio del Raz y ya est lleno.

-- INT 21h Funcin 3AH = Borrar directorio (RMDIR). -- LLAMADA: AH = 3AH DS:DX = comienzo de una cadena ASCIIZ. -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Se elimina el directorio indicado de la unidad de disco y la va de acceso especificada en la cadena ASCIIZ. Esta funcin se aborta (indicndolo mediante Cf y AX) si: - La va de acceso es incorrecta. - El directorio especificado es el directorio activo. - El directorio especificado no est vaco (contiene algn fichero). -- INT 21h Funcin 3BH = Establecer directorio actual (CHDIR). -- LLAMADA: AH = 3BH DS:DX = comienzo de una cadena ASCIIZ. -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Establece como directorio actual el indicado mediante la cadena ASCIIZ. Esta funcin se aborta (indicndolo mediante Cf y AX) si la va de acceso ASCIIZ es incorrecta. -- INT 21h Funcin 47H = Obtener directorio actual. -- LLAMADA: AH = 47H DL = Cdigo de la unidad de disco (0 = unidad actual; 1 = A ; 2 = B ; etc.). DS:SI = comienzo de un buffer de 64 Bytes (contendr el nombre del directorio con la va de acceso al mismo). -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Establece como directorio actual el indicado mediante la cadena ASCIIZ. Esta funcin se aborta (indicndolo mediante Cf y AX) si el cdigo de unidad no es vlido o la va de acceso, que antecede al nombre del directorio, no incluye el cdigo \ o el nombre de directorio no acaba con el caracter 0h. -- Funciones para manejo de Ficheros -- INT 21h Funcin 3CH = Crear Fichero (CREATE). -- LLAMADA: AH = 3CH CX = Atributos del fichero (00H = Normal; 01H = de Solo Lectura; 02H = Oculto; 03H = de Sistema). DS:DX = comienzo de una cadena ASCIIZ. -- DEVUELVE: Si se ejecut correctamente (Cf = 0): AX = Handle o manejador de fichero (si no: AX = Cdigo de error). -- EFECTO: Si el fichero indicado ya exista se vaca su contenido (quedando con longitud 0); si no exista se crea. En ambos casos, el fichero se abre y se devuelve un Handle (nmero para acceder al fichero) para los restantes accesos al mismo Esta funcin se abortar (indicndolo mediante Cf y AX) si: - La va de acceso indicada (en la cadena ASCIIZ) es errnea. - Se va a crear el fichero en el directorio raz y ya est lleno. -- INT 21h Funcin 3DH = Abrir Fichero. -- LLAMADA: AH = 3DH AL = Modo de acceso. Bits 0-2: Permiso de lectura/escritura. 000b Acceso de solo lectura. 001b Acceso de solo escritura. 010b Acceso de lectura/escritura. Bit 3: 0b (Reservado). Bits 4-6: Modo de comparticin de Fichero. 000b Solo el programa actual puede acceder al archivo. 001b Solo el programa actual puede acceder al archivo. 010b Otro programa puede leer el archivo, pero no escribir en l. 011b Otro programa puede escribir en el archivo, pero no leerlo. 100b Otro programa puede leer y escribir en el archivo. Bit 7: Bit de 'herencia' o Handle-flag. 0b Si el handle se hereda por un programa hijo. 1b Si el handle no se hereda. DS:DX = comienzo de una cadena ASCIIZ. -- DEVUELVE: Si se ejecut correctamente (Cf = 0): AX = Handle o manejador de fichero (si no: AX = Cdigo de error). -- EFECTO: Se abre un fichero ya existente y se devuelve un Handle (el puntero se coloca sobre el primer Byte del fichero). -- INT 21h Funcin 3EH = Cerrar el manejador del Fichero. -- LLAMADA: AH = 3EH BX = Handle. -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Se cierra un fichero y el Handle se libera para nuevos ficheros (se vuelven al disco los buffers internos asociados al fichero). Si por error se llamara (a esta funcin), con el valor 0, se cerrara el dispositivo de entrada estndar en cuyo caso no se aceptaran datos del teclado (si el valor del handle fuera 1, se cerrara la pantalla y no se enviaran caracteres a esta). Hay en total 5 handles reservados para referenciar a diferentes dispositivos: Handle 0 ---> Dispositivo estndar de entrada. (CON). Handle 1 ---> Dispositivo estndar de salida. (CON). Handle 2 ---> Dispositivo estndar de error. (CON). Handle 3 ---> Dispositivo auxiliar estndar. (AUX). Handle 4 ---> Dispositivo estndar de listado. (PRN). Normalmente, el 2 referencia a la pantalla (se utiliza a la hora de mostrar errores) y el 4 a la impresora. -- INT 21h Funcin 3FH = Lectura de Fichero o dispositivo. -- LLAMADA: AH = 3FH BX = Handle. CX = Nmero de Bytes a leer. DS:DX = comienzo del buffer donde se depositarn los caracteres ledos. -- DEVUELVE: Si se ejecut correctamente (Cf = 0): AX = Bytes transferidos (si no: AX = Cdigo de error). -- EFECTO: Se realiza una transferencia desde el fichero referenciado (por ese handle) hacia el buffer de memoria especificado

mediante DS:DX (se transferirn tantos caracteres como se especifique en CX, antes de llamar la funcin, actualizando el puntero hasta el caracter que sigue al bloque ledo); si se devuelve Cf = 0, pero AX=0, quiere decir que el puntero del fichero estaba al final (no se pudo leer ningn caracter); si se devuelve Cf = 0, pero el AX es menor que la cantidad de Bytes a leer, significa que se produjo algn error o no se pudieron leer los caracteres solicitados. Mediante esta funcin es posible leer caracteres del teclado, usando el Handle 0. -- INT 21h Funcin 40H = Escritura en Fichero o dispositivo. -- LLAMADA: AH = 40H BX = Handle. CX = Nmero de Bytes a escribir. DS:DX = comienzo del buffer desde donde se van a tomar los caracteres a escribir. -- DEVUELVE: Si se ejecut correctamente (Cf = 0): AX = Bytes transferidos (si no: AX = Cdigo de error). -- EFECTO: Se realiza una transferencia desde el buffer de memoria (indicado mediante DS:DX) hacia el fichero o dispositivo referenciado por el Handle (se transferirn tantos caracteres como se especifique en CX, antes de llamar la funcin actualizando el puntero una posicin por delante del bloque escrito, para que futuras escrituras no 'machaquen' los datos que hubiera); si se devuelve Cf = 0, pero AX=0, quiere decir que el dispositivo (en que se encuentra el fichero) ya estaba lleno antes de la llamada a esta funcin; si se devuelve Cf = 0, pero el AX es menor que la cantidad de Bytes a escribir, significa que se produjo algn error o no se pudieron escribir los caracteres solicitados. Mediante esta funcin es posible escribir caracteres en la pantalla, usando el Handle 1. -- INT 21h Funcin 41H = Borrar Fichero. -- LLAMADA: AH = 41H DS:DX = comienzo de la cadena ASCIIZ. -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Se borra el fichero indicado mediante la cadena ASCIIZ. La funcin se aborta si: - La va de acceso contenida en la cadena ASCIIZ es errnea. - Si el fichero a borrar es de solo lectura. -- INT 21h Funcin 42H = Establecer puntero de fichero. -- LLAMADA: AH = 42H AL = Cdigo de desplazamiento (00h: desde el inicio del fichero; 01h: posicin actual del puntero; 02h: desde el final del fichero). BX = Handle del fichero. CX = Mitad ms significativa del desplazamiento. DX = Mitad menos significativa del desplazamiento. -- DEVUELVE: Si se ejecut correctamente (Cf = 0): DX = Mitad ms significativa del puntero actualizado y AX la menos significativa (si no: AX = Cdigo de error). -- EFECTO: Cambia el valor del puntero permitiendo un acceso aleatorio (podremos escribir y leer caracteres, en cualquier posicin del fichero, sin pasar por las anteriores). El valor del puntero, devuelto por la funcin (en DX,AX), se corresponde con un desplazamiento (desde el inicio del fichero). -- INT 21h Funcin 43H (Subfuncin 00h) = Obtener atributos de fichero. -- LLAMADA: AH = 43H AL = 00h DS:DX = comienzo de la cadena ASCIIZ. -- DEVUELVE: Si se ejecut correctamente (Cf = 0): CX = Atributos del fichero. Si bit 0 = 1, Fichero de solo lectura. Si bit 1 = 1, Fichero oculto. Si bit 2 = 1, Fichero de sistema. Si bit 5 = 1, El archivo ha sido modificado desde el ltimo backup. Si NO se ejecut correctamente (Cf = 1): AX = Cdigo de error. -- EFECTO: Se obtiene informacin de un fichero indicado por la cadena ASCIIZ (se producir un error si la cadena es errnea). -- INT 21h Funcin 43H (Subfuncin 01h ) = Establecer atributos de fichero. -- LLAMADA: AH = 43H AL = 01h CX = Nuevos atributos para fichero (se deben establecer los bits 3 y 4 en 0). Si ponemos bit 0 = 1, atributo de solo lectura. Si ponemos bit 1 = 1, atributo de oculto. Si ponemos bit 2 = 1, atributo de sistema. Si ponemos bit 5 = 1, indicar que el fichero ha sido modificado desde el ltimo backup. DS:DX = comienzo de la cadena ASCIIZ. -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Se establecen atributos a un fichero dado por una cadena ASCIIZ (se producir un error si la cadena es errnea). No puede usarse, esta funcin, para establecer atributo de etiqueta de volumen (bit 3), ni de directorio(bit 4). -- INT 21h Funcin 56H = Renombrar o Mover Fichero. -- LLAMADA: AH = 56H DS:DX = comienzo de la cadena ASCIIZ con el nombre actual del fichero. ES:DI = comienzo de la cadena ASCIIZ con el nuevo nombre. -- DEVUELVE: AX = Cdigo de error (si se ejecut correctamente: Cf = 0). -- EFECTO: Cambia el nombre a un fichero dado y permite moverlo a otro directorio dentro del mismo dispositivo (en el segundo caso debemos cambiar el camino que nos lleva al fichero). Se producir un error si: - La cadena ASCIIZ indicada es errnea. - Ya existe un fichero con el mismo nombre que el indicado. - Se intenta mover el fichero a otro dispositivo o unidad. - El fichero se mueve al directorio raz y ste est lleno. -- Funciones de terminacin de procesos -- INT 21h Funcin 00H = Terminar la ejecucin del Programa. -- LLAMADA: AH = 00H CS = comienzo de segmento del PSP.

-- DEVUELVE: NADA. -- EFECTO: Finaliza la ejecucin del programa en curso. Esto conlleva a: - Liberacin de toda la memoria asignada al programa. - Todos los buffers de los ficheros son vaciados. - Se cierra cualquier fichero abierto por el programa. - Restaurar los vectores de interrupcin (INT 22H, INT 23H, INT 24H) cuyo contenido original fuera almacenado en la pila. Esta funcin est pensada para programas COM, en los cuales, el PSP est en el mismo segmento que el cdigo del programa (como en los programas EXE el PSP est en diferente segmento, no se debe llamar a esta funcin desde estos). No obstante, tanto en los COM como en los EXE, es preferible utilizar la funcin 4CH ya que devuelve un cdigo de retorno. -- INT 21h Funcin 4CH = Terminacin del Programa con Cdigo de Retorno. -- LLAMADA: AH = 4CH AL = Cdigo de retorno. -- DEVUELVE: NADA. -- EFECTO: Finaliza la ejecucin del programa en curso y se devuelve un cdigo de retorno al programa padre (este cdigo ofrece informacin, al programa padre, acerca de la ejecucin del programa, p.e., se produjo un error). La terminacin del programa conlleva a: - Liberacin de toda la memoria asignada al programa. - Todos los buffers de los ficheros son vaciados. - Se cierra cualquier fichero abierto por el programa. - Restaurar los vectores de interrupcin (INT 22H, INT 23H, INT 24H) cuyo contenido original fue almacenado en la pila. Este es el mtodo idneo para la terminacin de programas ya que no necesita que el registro CS tenga ningn contenido especial. -- INT 21h Funcin 31H = Finalizar el Programa y Conservar Residente. -- LLAMADA: AH = 31H AL = Cdigo de retorno. DX = Cantidad de prrafos de memoria a dejar residente (un prrafo equivale a 16 Bytes). -- DEVUELVE: NADA. -- EFECTO: Finaliza la ejecucin del programa en curso y se devuelve un cdigo de retorno al programa padre (este cdigo ofrece informacin, al programa padre, acerca de la ejecucin del programa, p.e., se produjo un error). Adems: se deja residente el programa o parte del mismo, de forma que las siguientes ejecuciones de programas no lo 'machaquen. La terminacin del programa conlleva a: - Liberacin de toda la memoria asignada al programa. - Todos los buffers de los ficheros son vaciados. - Se cierra cualquier fichero abierto por el programa. - Restaurar los vectores de interrupcin (INT 22H, INT 23H, INT 24H) cuyo contenido original fue almacenado en la pila. Esta funcin se utiliza en programacin de utilidades residentes (como SideKick o SanBit). Una vez que el programa queda residente (en memoria) la activacin del mismo se realiza de acuerdo a algn criterio del propio programa (como la pulsacin de una combinacin de teclas) ya que el residente toma el control y al acabar su tarea le devuelve el mando al programa que se estuviera ejecutando antes de la activacin del residente. -- FUNCIONES DEL BIOS (Sistema Bsico de Entrada/Salida = Basic Input/Output System). Permiten una comunicacin entre el ordenador (circuitos, dispositivos, componentes) y los programas (contenidos en ROM) que lo utilizan (los programas se comunican con el hardware y los dispositivos conectados); las funciones permiten, al programador, acceder a los diferentes subsistemas o perifricos del ordenador sin necesidad de saber modelo ni marca (facilitan la compatibilidad entre PC's). Por ejemplo, si queremos acceder al disco duro usamos la funcin correspondiente. Si bien los principales servicios son con la INT 10H (controlador de video) y la INT 16H (controlador de teclado) existen varios ms que permiten controlar el resto de los dispositivos. As: -- INT 11h = Buscar la configuracin del equipo. -- INT 12h = Determinar el tamao de memoria RAM. -- INT 13h = Controlador o Driver de disco. -- INT 14h = Driver del Puerto Serie o Puerto de Comunicaciones. -- INT 15h = Driver del Puerto Paralelo [Impresora]. -- INT 17h = Escritura en sectores del disco. -- INT 18h = ROM del BASIC. -- INT 19h = Reinicializacin del Sistema o Reset o Reboot. -- INT 1Ah = Driver del reloj de Tiempo Real. -- Funciones Fundamentales de la INT 10H (Driver de Video) -- INT 10h Funcin 00H = Establecer modo de Video. -- LLAMADA: AH = 00H AL = Modo de video (plaquetas grficas: MDA, CGA, etc.). Modo de Video 00h 01h 02h 03h 04h 05h 06h 07h 0Dh 0Eh 0Fh 10h 10h Cantidad de Colores 16 16 16 16 4 4 2 2 16 16 2 4 16 Plaquetas usadas

Resolucin

Tipo

40 por 25 40 por 25 80 por 25 80 por 25 320 por 200 320 por 200 640 por 200 80 por 25 320 por 200 640 por 200 640 por 350 640 por 350 640 por 350

Texto Texto Texto Texto Grfico Grfico Grfico Texto Grfico Grfico Grfico Grfico Grfico

CGA, EGA, MCGA, VGA (B&N) CGA, EGA, MCGA, VGA CGA, EGA, MCGA, VGA (B&N) CGA, EGA, MCGA, VGA CGA, EGA, MCGA, VGA CGA, EGA, MCGA, VGA (B&N) CGA, EGA, MCGA, VGA (B&N) MDA, EGA, VGA EGA, VGA EGA, VGA EGA, VGA EGA de 64 KB de RAM EGA >= 64 KB y VGA

11h 640 por 480 2 Grfico MCGA, VGA 12h 640 por 480 16 Grfico VGA 13h 320 por 200 256 Grfico MCGA VGA Modos mayores al 13h pertenecen a tarjetas Super-Vga o superior. -- DEVUELVE: NADA. -- EFECTO: Selecciona y activa el modo de video especificado (con borrado automtico de la pantalla); cuando deseamos que el contenido de la pantalla no se pierda (caso de programacin de utilidades residentes), se debe poner en 1 el bit 7 del registro AL (que contiene el modo de video). As por ejemplo, si queremos cambiar a modo 13h sin que se pierda el contenido que hubiera en la pantalla en vez de introducir, en AL, el nmero 13h (00010011b) introduciramos el 93h (10010011b). -- INT 10h Funcin 01H = Establecer tamao del Cursor. -- LLAMADA: AH = 01H Bits 0 a 4 de CH = Lnea inicial del Cursor; bits 0 a 4 de CL = Lnea final del Cursor (los dems en 0). -- DEVUELVE: NADA. -- EFECTO: Selecciona un nuevo tipo de cursor en modo texto (ver funcin 02h si se quiere desaparecer el cursor de la pantalla, teniendo en cuenta tipo de tarjeta y modo de video pues se dispondr de ms o menos pixels para dibujarlo. As por ejemplo, en modos de video VGA, se dispone de 14 lneas para crearlo y en CGA de 8). -- INT 10h Funcin 02H = Posicionar el Cursor. -- LLAMADA: AH = 02H BH = Pgina de video (0 para grficos). DH = Fila donde situar el cursor. DL = Columna donde situar el cursor. -- DEVUELVE: NADA. -- EFECTO: Posiciona el cursor, en pantalla, de acuerdo a las coordenadas indicadas en los registros DH y DL (el cursor se desplazar en la pgina de video, indicada mediante BH, pues existe uno para cada pgina). Las coordenadas para filas y columnas empiezan a partir de 0 (la esquina superior izquierda tendr las coordenadas 0,0 ); la columna mxima es la 39 o 79 (segn estemos en un modo de video de 40 u 80 columnas); la lnea mxima es la 24 o 49 (segn se est en un modo de 25 o 50 lneas). Un 'truco' para hacer desaparecer el cursor, de la pantalla, es dar valores no vlidos a la columna y/o fila (columna = 100). -- INT 10h Funcin 03H = Buscar posicin y tamao del Cursor. -- LLAMADA: AH = 03H BH = Pgina de video. -- DEVUELVE: CH = Lnea inicial del cursor CL = Lnea final del cursor DH = Fila donde se encuentra el cursor DL = Columna donde se encuentra el cursor -- EFECTO: Obtiene las coordenadas y tamao del cursor en una pgina de video dada (se puede acceder al cursor de cada pgina independientemente de cul sea la pgina activa). -- INT 10h Funcin 05H = Establecer nueva pgina de video. -- LLAMADA: AH = 05H AL = Pgina de video. Pginas Modo de Video Tarjetas que lo soportan

8 (0 - 7) 00h y 01h CGA, EGA, MCGA, VGA. 4 (0 - 3) 02h y 03h CGA. 8 (0 - 7) 02h y 03h ECGA, MCGA, VGA. 8 (0 - 7) 07h EGA, VGA. 8 (0 - 7) 0Dh EGA, VGA. 4 (0 - 3) 0Eh EGA, VGA. 2 (0 - 1) 0Fh EGA, VGA. 2 (0 - 1) 10h EGA, VGA. Modos superiores al 11h cuentan con una sola pgina de video. -- DEVUELVE: NADA. -- EFECTO: Establece (como activa) la nueva pgina de video (indicada mediante el AL) mostrndose, por pantalla. el contenido de esa pgina situando el cursor en la posicin que le corresponda para esa pgina. El cambio de una pgina a otra, dentro del mismo modo de video, no afecta a su contenido (no se borra la pantalla como ocurre al cambiar el modo de video). -- INT 10h Funcin 06H = Desplazar lneas de texto hacia arriba. -- LLAMADA: AH = 06H AL = Nmero de lneas a desplazar (si AL=0, se borra toda la ventana seleccionada mediante CX y DX). BH = Atributo a usar en las lneas borradas. CH = Fila donde comienza la ventana de texto. CL = Columna donde comienza la ventana de texto (esquina superior izquierda). DH = Fila donde acaba la ventana de texto. DL = Columna donde acaba la ventana de texto (esquina inferior derecha). -- DEVUELVE: NADA. -- EFECTO: Desplaza hacia arriba (ventana anterior a especificada); las lneas desplazadas quedan vacas (rellenndose con blancos); el color utilizado (en estas lneas vacas) se indica mediante el BH. -- INT 10h Funcin 07H = Desplazar lneas de texto hacia abajo. -- LLAMADA: AH = 07H AL = Nmero de lneas a desplazar (si AL=0, se borra toda la ventana seleccionada mediante CX y DX). BH = Atributo a usar en las lneas borradas. CH = Lnea donde comienza la ventana de texto. CL = Columna donde comienza la ventana de texto.

DH = Lnea donde acaba la ventana de texto. DL = Columna donde acaba la ventana de texto. -- DEVUELVE: NADA. -- EFECTO: Desplaza hacia abajo (ventana posterior a especificada); las lneas desplazadas quedan vacas (rellenndose con blancos); el color utilizado (en estas lneas vacas) se indica mediante el BH. Mediante la llamada, a estas dos ltimas funciones, obtenemos un mtodo cmodo (aunque lento) de borrar la pantalla. -- INT 10h Funcin 08H = Leer caracter y atributo en la posicin del cursor. -- LLAMADA: AH = 08H BH = Pgina de video (en exhibicin). -- DEVUELVE: AH = Atributo (color del caracter). AL = Cdigo ASCII del caracter ledo. -- EFECTO: Esta funcin es usada por el programa SanBit para obtener el cdigo de los caracteres que hay en pantalla. -- INT 10h Funcin 09H = Escribir caracter y atributo en la posicin del cursor. -- LLAMADA: AH = 09H AL = Cdigo del caracter a escribir. BH = Pgina de video (activa) donde escribir el caracter. BL = Atributo o color que va a tener el caracter. CX = Cantidad de veces que se debe escribir el caracter (uno a continuacin de otro). -- DEVUELVE: NADA. -- EFECTO: Se escribe un caracter en la posicin actual del cursor (para escribir un caracter, sin modificar el color que afectara a esa posicin, debe usarse la funcin 0AH). -- INT 10h Funcin 0AH = Escribir carcter sin modificar el color. -- LLAMADA: AH = 0AH AL = Cdigo del caracter a escribir. BH = Pgina de video donde escribir el caracter. CX = Cantidad de veces que se debe escribir el caracter (uno a continuacin de otro). -- DEVUELVE: NADA. -- EFECTO: Se escribe un caracter en la posicin actual del cursor y tendr el color que tena el antiguo (en esa posicin). -- INT 10h Funcin 0CH = Escribir un punto o pixel grfico. -- LLAMADA: AH = 0CH AL = Color a usar (en monitores de alta resolucin vara la intensidad). BH = Pgina de video donde escribir el punto. CX = Columna donde escribir el pixel (coordenada grfica x). DX = Fila donde escribir el pixel (coordenada grfica y). -- DEVUELVE: NADA. -- EFECTO: Da un nuevo color a un pixel grfico (funcin vlida solo para modos grficos). -- INT 10h Funcin 0DH = Lectura de un pixel grfico. -- LLAMADA: AH = 0DH BH = Pgina de video. CX = Columna del pixel que nos interesa (coordenada grfica x). DX = Fila del pixel que nos interesa (coordenada grfica y). -- DEVUELVE: AL = Valor de color del pixel. -- EFECTO: Obtiene el color de un punto de la pantalla (funcin vlida solo para modos grficos). -- INT 10h Funcin 0FH = Obtener el Modo de video actual. -- LLAMADA: AH = 0FH -- DEVUELVE: AL = Modo de video actual. AH = Cantidad de caracteres que caben en una lnea en el modo de video actual. BH = Nmero de la pgina activa. -- EFECTO: La utilidad de esta funcin reside en la construccin de programas residentes (el programa residente, antes de activarse definitivamente y mostrar sus datos / rtulos por pantalla, debe saber el modo de video en el que estaba trabajando el usuario para que, al salir del programa residente, se pueda restituir y no se pierda la informacin que haba anteriormente), para conocer los caracteres que caben en una lnea y la pgina actual de video. -- Funciones fundamentales de la INT 13H (Driver de Disco). -- INT 13h Funcin 00H = Restablecer el sistema de Disco. -- LLAMADA: AH = 00H DL = Nmero de unidad (0 = A, etc. para flexibles y 80h = primera, etc. para duros). -- DEVUELVE: CF = Validez de la operacin (si es 1 hubo algn error). AH = Cdigo de estado. -- EFECTO: Se usa despus que la operacin anterior report un error grave pues esta funcin reinicializa el controlador de discos (se coloca en el cilindro 0). -- INT 13h Funcin 02H = Leer sectores del Disco. -- LLAMADA: AH = 02H AL = Cantidad de sectores a leer. CH = Nmero de pista (la primera es cero). CL = Nmero del sector inicial (el primero es uno). DH = Nmero de cabeza (para flexibles es lado 0 o 1). DL = Nmero de unidad. ES:BX = Direccin de inicio del buffer de E/S (el rea debe ser lo suficientemente grande como para contener todos los sectores a leer). -- DEVUELVE: CF = Validez de la operacin. Si CF = 0, AL, contiene la cantidad de sectores ledos (BX, CX y DX se preservan). Si CF = 1, AH, contiene el cdigo de estado (restablece la unidad y reintenta la operacin). -- EFECTO: Se lee el nmero especificado de sectores (en la misma pista) y, de manera directa, los enva a la memoria.

-- INT 13h Funcin 03H = Escribir sectores del Disco. Escribe el rea especificada (sobre el disco) desde la memoria (512 Bytes o mltiplo de 512) y maneja los registros y Procesamiento igual que la funcin 02h. -- INT 13h Funcin 05H = Formatear pistas del Disco. -- LLAMADA: AH = 05H AL = Cantidad de sectores a formatear. CH = Nmero de pista. DH = Nmero de cabeza. DL = Nmero de unidad. ES:BX = Apunta al comienzo de un grupo de campos de direccin para pista; para cada sector del flexible, en una pista, debe haber 4 Bytes: ! Nmero de pista (cilindro). ! Nmero de cabeza (superficie). ! Nmero de sector. ! Bytes por sector (00h = 128, 01h = 256, 02h = 512, 03h = 1024). Por ejemplo: para formatear la pista 3, cabeza 0 y 512 Bytes, la primera entrada para la Pista ser: 03 00 01 02h -- DEVUELVE: CF = Validez de la operacin. AH = Cdigo de estado. -- EFECTO: Formatea pistas de acuerdo con uno de cuatro tamaos diferentes (antes, de esta, se debera usar la funcin 17h, para establecer el tipo de disco, y la 18h, para establecer el tipo de medio). -- INT 13h Funcin 08H = Obtener parmetros de la unidad de Disco. -- LLAMADA: AH = 08H DL = Nmero de unidad. -- DEVUELVE: Si CF = 1, en AH viene el cdigo de error. Si CF = 0: BL = tipo de flexible (01h = 360K, 02h = 1.2M, 03h = 720K, 04h = 1.44M). CH = Nmero superior de cilindro/pista. CL = Nmero superior de sector/cilindro. DH = Nmero superior de cabeza. DL = Cantidad de unidades conectadas al controlador. ES:DI = Comienzo de tabla de 11 Bytes para parmetros de unidad (Bytes por sector, sectores por pista, etc.). -- EFECTO: Se obtiene la informacin sobre la unidad de disco deseada (puede usarse el comando D, de Debug, para desplegar los nmeros). -- INT 13h Funcin 09H = Inicializar la unidad de Disco duro. -- LLAMADA: AH = 09H DL = Nmero de unidad. -- DEVUELVE: Si CF = 1, en AH viene el cdigo de estado. -- EFECTO: El BIOS realiza esta funcin cuando arranca su computadora. -- INT 13h Funcin 0CH = Buscar cilindro de Disco duro. -- LLAMADA: AH = 0CH CH = Nmero de cilindro/pista. CL = Nmero de sector/cilindro. DH = Nmero de cabeza. DL = Nmero de unidad. -- DEVUELVE: Si CF = 1, en AH viene el cdigo de estado. -- EFECTO: Coloca la cabeza de lectura/escritura en el cilindro especificado pero no transfiere informacin. -- INT 13h Funcin 15H = Obtener el tipo de Disco. -- LLAMADA: AH = 15H DL = Nmero de unidad. -- DEVUELVE: Si CF = 1, en AH viene el cdigo de error. Si CF = 0, en AH puede venir: 00h = No est presente la unidad/disco. 01h = Unidad de disco flexible no es sensible a cambio de disco. 02h = Unidad de disco sensible a cambio. 03h = Unidad de disco duro (CX:DX traen la cantidad de sectores de la unidad). -- EFECTO: Se obtiene la informacin acerca de la unidad especificada. -- INT 13h Funcin 16H = Cambio de estado del Disco flexible. -- LLAMADA: AH = 16H DL = Nmero de unidad. -- DEVUELVE: La operacin regresa, en AH, uno de los cdigos siguientes: 00h = No se ha cambiado de disco (CF = 0). 01h = Parmetro de disco no vlido (CF = 1: error). 06h = Disco cambiado (CF = 1: no existe error). 80h = Unidad de disco no est preparada (CF = 1: error). -- EFECTO: Se verifica si hubo un cambio de disco (para sistemas que son sensibles a cambios). -- Funciones fundamentales de la INT 16H (Driver de Teclado). -- INT 16h Funcin 00H = Leer caracter del teclado. -- LLAMADA: AH = 00H -- DEVUELVE: AL = Cdigo ASCII de la tecla. AH = Cdigo extendido de la tecla o Scan-Code (es el nmero que identifica a una tecla o combinaciones de ellas, que no disponen de un smbolo ASCII para representarlas. Como ejemplo tendramos las teclas de: funcin, Home, End, Alt+F2, etc.). -- EFECTO: Recibe el cdigo ASCII del teclado y el de rastreo o extendido de la tecla (si no haba ningn caracter disponible en el buffer de teclado, la funcin esperar a que se introduzca alguno). Una vez que se ha ledo el caracter se elimina del buffer, para que siguientes llamadas (a esta funcin) no lo vuelvan a invocar. Cuando (a la salida de la funcin) AL es

cero en AH est el cdigo extendido de esa tecla o combinacin de ellas (cuando nos encontramos ante la pulsacin de una tecla 'normal' el AL contiene el ASCII de la tecla y AH el de rastreo). -- INT 16h Funcin 01H = Obtener el estado del buffer de teclado. -- LLAMADA: AH = 01H -- DEVUELVE: Zf = 0, si haba alguna tecla disponible (en el buffer). AH = Cdigo de rastreo o extendido. AL = Cdigo ASCII de la tecla. -- EFECTO: Se puede saber cuando hay algn caracter esperando (en el buffer de teclado) en cuyo caso se muestra su cdigo ASCII y su cdigo de rastreo o extendido (segn proceda). Esta funcin no elimina ningn caracter del buffer de teclado. Por lo tanto, sucesivas llamadas a esta funcin, mostrarn siempre el mismo resultado (para borrar el caracter del buffer utilizar la funcin 00H). -- INT 16h Funcin 02H = Obtener el estado del teclado. -- LLAMADA: AH = 02H -- DEVUELVE: AL = Valor del Byte de estado del teclado (est en la direccin 0000:0417h de datos del BIOS). bit 7 6 5 4 3 2 1 0 Estado de teclas cuando el bit correspondiente tiene valor 1. ---------------------------- ===> Tecla Mays. derecha pulsada. ====> Tecla Mays. izquierda pulsada. =====> Alguna Tecla Control pulsada. ======> Tecla Alt pulsada. =======> Scroll Lock activado. ========> Num Lock activado. =========> Caps Lock (Bloq Mays) activado. ==========> Insert activado. -- EFECTO: Obtenemos informacin acerca del estado de ciertas teclas especiales (CTRL, ALT, SHIFT, etc.) y el de Num Lock (Bloque numrico), etc. -- INT 16h Funcin 03H = Establecer factor de Repeticin. -- LLAMADA: AH = 03H AL = 05H BH = Retardo antes de la primera repeticin de tecla. BL = Velocidad de Repeticin. -- DEVUELVE: NADA. -- EFECTO: Permite modificar la velocidad de repeticin de teclado y el tiempo que hay que tener pulsada una tecla para que se genere la primera repeticin. Esta funcin es la base de la utilidad SB-TECLA del programa SanBit. -- INT 16h Funcin 05H = Simular pulsacin de tecla. -- LLAMADA: AH = 05H CH = Cdigo extendido o Cdigo de rastreo. CL = Cdigo ASCII de la tecla en cuestin. -- DEVUELVE: Cf = 0 si el Buffer de Teclado no est lleno (cabe otro caracter) entonces: AL = 00h sino es 01h. -- EFECTO: Podemos simular la pulsacin de una tecla (la utilizan ciertos programas residentes para realizar Macros de Teclado). -- INT 16h Funcin 10H = Leer caracter del teclado Expandido. -- LLAMADA: AH = 10H -- DEVUELVE: AH = Cdigo de Rastreo o Extendido. AL = Cdigo ASCII del caracter introducido. -- EFECTO: Acepta un caracter del teclado (devuelve el cdigo ASCII con el de rastreo o extendido y es solo para teclados Expandidos). Esta funcin es similar a la 00h; la diferencia reside en que trabaja con teclados de 101 y 102 teclas, mientras que la 00h (que es la funcin original para entrada de caracteres desde teclado) trabaja con los cdigos originales del teclado de 84 teclas (entre otras, no acepta las teclas de funcin: F11 ni F12 pues los cdigos de rastreo son diferentes para cada uno de los teclados: el original y el expandido). -- INT 16h Funcin 11H = Obtener estado del buffer de teclado. -- LLAMADA: AH = 11H -- DEVUELVE: Zf = 0 si haba alguna tecla disponible (en el buffer). AH = Cdigo de rastreo o extendido. AL = Cdigo ASCII de la tecla. -- EFECTO: Se puede saber cuando hay algn caracter esperando en el buffer de teclado (no elimina ningn carcter; por lo tanto, sucesivas llamadas a esta, mostrarn siempre el mismo resultado). Esta funcin (que es solo para teclados expandidos) es similar a la 01h; la diferencia reside en que esta tiene en cuenta los cdigos de teclas especiales (por ejemplo: F11 y F12). -- INT 16h Funcin 12H = Obtener estado del Teclado Expandido. -- LLAMADA: AH = 12H -- DEVUELVE: AX = Valor de la Palabra de estado (del teclado expandido). bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Estado de teclas cuando el bit correspondiente tiene valor 1. -------------------------------------------- ===> Tecla Mays. derecha pulsada. ===> Tecla Mays. izquierda pulsada. ===> Alguna tecla CONTROL pulsada. ===> Alguna tecla ALT pulsada. ===> Scroll Lock activado. ===> Num Lock activado. ===> Caps Lock (Bloq Mays) activado. ===> Insert activado. ===> CONTROL izquierda pulsada. ===> ALT izquierda pulsada. ===> CONTROL derecha pulsada.

====> ALT derecha pulsada. =====> Tecla Scroll Lock pulsada. ======> Tecla Num Lock pulsada. =======> Tecla Caps Lock pulsada. ========> Tecla SysRep pulsada. -- EFECTO: Esta funcin es similar a la 02h; la diferencia reside en que esta ofrece un Byte de informacin adicional acerca del estado de los conmutadores y teclas especiales (p.e., con la 12h podemos saber cul de las teclas CTRL ha sido pulsada). BIBLIOGRAFIA: - La ROM BIOS de IBM. - Funciones del MS-DOS (Ray Duncan... Microsoft Press/Anaya Multimedia). (Ray Duncan... Microsoft Press/Anaya Multimedia).

- Extensiones del MS-DOS (Ray Duncan... Microsoft Press/Anaya Multimedia). - Apartado de correos 2064, 30080 Murcia FidoNet 2:346/401 SubNet 93:3468/101 RANet MasterNet VirNet Internet ClubNet

S-ar putea să vă placă și