Top Banner

of 100

trabajo de asembler

Jul 11, 2015

Download

Documents

Zul Pg
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

Manual de Lenguaje Ensamblador

TEMARIO Introduccin. I.- Definiciones y conceptos preliminares. 1.- Conceptos bsicos. 1.1.- El lenguaje de maquina y el lenguaje ensamblador. 1.2.- Interpretes, compiladores y ensambladores. 1.3.- El proceso de link, las rutinas de RUN-TIME y los servicios del sistema operativo. 2.- La arquitectura de las computadoras personales IBM y Compatibles. 3.- La arquitectura de los microprocesadores Intel. 4.- El sistema operativo MS-DOS. 5.- Ensambladores y Macroensambladores. 6. Sistemas numricos 7. Operaciones con bytes 7.1. AND 7.2. OR 7.3. XOR 7.4. NOT 8. El juego de registros. 9.- Qu es....la BIOS? 9.1. Configuracin avanzada y del chipset 9.2. Perifricos integrados 9.3. Administracin de energa 9.4. Configuracin de PNP y slots PCI 9.5. Autoconfiguracin de la BIOS 9.6. Otras utilidades 9.7. Salir de la BIOS 9.8. Actualizar la BIOS 9.9. La BIOS y la pila 9.10. Cmo saltarse la password de la BIOS II.- El lenguaje ensamblador. 1.- Un ejemplo clsico. 2.- El formato del ensamblador. 3.- Directivas. 4.- Conjunto de instrucciones. 5.- Macros y procedimientos. 6.- Interrupciones. III.- Creacin y depuracin de programas en lenguaje ensamblador 1.- Edicin. 2.- Ensamblado. 3.- Link.

Manual de Lenguaje Ensamblador 4.- Ejecucin. 5.- Depuracin. 5.1.- Uso de DEBUG de DOS I 5.2.- Uso de DEBUG II: Trazar un Programa 5.3.- Uso de DEBUG III: Escribir un Programa 5.4.- Observaciones 6.- La utilera exe2bin y los archivos .exe y .com . Resumen del DEBUG Apndice a.- Modelo de registros del 8086. Apndice b.- Registros expandidos del 8087. Apndice c.- Modelo de segmentacin de memoria. Apndice d.- Directivas del MASM. Apndice e.- Juego de instrucciones del 8086, 8087, 80186, 80286 y 80287. Apndice f.- Interrupciones. Apndice g.- Ejemplos adicionales. Bibliografa.

Manual de Lenguaje Ensamblador

INTRODUCCION. El presente manual, es un documento que est orientado a la introduccin a la programacin en lenguaje Ensamblador, y principalmente, a aquellas personas que nunca han trabajado con este lenguaje y probablemente con ningn otro. Tal y como lo indica su ttulo, est enfocado al lenguaje ensamblador de los microprocesadores Intel, particularmente el 8088, 8086, 80186, 80188 y 80286. Sin embargo, todos los programas generados para estos procesadores corrern en un 80386 80486. Adicionalmente se proporciona el juego de instrucciones de los coprocesadores matemticos 8087 y 80287, que es compatible con el de los microprocesadores ya citados, es decir, el manual se enfoca completamente hacia las computadoras que operan con procesadores de la familia x86 de Intel y, considerando que el ensamblador basa su funcionamiento en los recursos internos del procesador, los ejemplos descritos no son compatibles con ninguna otra arquitectura. Este documento trata de abarcar, de la forma ms general, todo aquello que involucra el conocimiento y uso del lenguaje ensamblador. As, ha sido organizado en tres partes. La primera describe los conocimientos bsicos que deben poseerse para una mejor comprensin e interpretacin de lo que es el lenguaje ensamblador y cmo debe ser usado. La segunda parte est dedicada por completo a lo que es el lenguaje ensamblador, las interrupciones del sistema operativo MS-DOS y el conjunto de instrucciones 8086-80286. La ltima parte se ha dedicado al proceso de ensamble, la depuracin de programas en ensamblador, y algunas consideraciones sobre la creacin de programas y su ejecucin.

Manual de Lenguaje Ensamblador

Manual de Lenguaje Ensamblador I.- DEFINICIONES Y CONCEPTOS PRELIMINARES. 1.- CONCEPTOS BASICOS. 1.1.- EL LENGUAJE DE MAQUINA Y EL LENGUAJE ENSAMBLADOR. Todo procesador, grande o pequeo, desde el de una calculadora hasta el de un supercomputador, ya sea de propsito general o especfico, posee un lenguaje nico que es capaz de reconocer y ejecutar. Por razones que resultan obvias, este lenguaje ha sido denominado Lenguaje de Mquina y ms que ser propio de un computador pertenece a su microprocesador. El lenguaje de mquina est compuesto por una serie de instrucciones, que son las nicas que pueden ser reconocidas y ejecutadas por el microprocesador. Este lenguaje es un conjunto de nmeros que representan las operaciones que realiza el microprocesador a travs de su circuitera interna. Estas instrucciones, por decirlo as, estn grabadas o "alambradas" en el hardware y no pueden ser cambiadas. El nivel ms bajo al que podemos aspirar a llegar en el control de un microprocesador es precisamente el del lenguaje de mquina. Ahora bien, siendo el lenguaje de mquina un conjunto de nmeros, cmo es capaz el microprocesador de saber cundo un nmero representa una instruccin y cundo un dato? El secreto de esto reside en la direccin de inicio de un programa y en el estado del microprocesador. La direccin de inicio nos indica en qu localidad de memoria comienza un programa, y en consecuencia que datos deberemos considerar como instrucciones. El estado del microprocesador nos permite saber cundo ste espera una instruccin y cundo ste espera un dato. Obviamente, el lenguaje de mquina de un microprocesador no puede ser ejecutado por otro microprocesador de arquitectura distinta, a menos que haya cierto tipo de compatibilidad prevista. Por ejemplo, un 80486 es capaz de ejecutar lenguaje de mquina propio y soporta el cdigo generado para microprocesadores anteriores de la misma serie (desde un 8086 hasta un 80386). Por otra parte, un PowerPC es capaz de ejecutar instrucciones de los microprocesadores Motorola 68xxx y de los Intel 80xx/80x86. En ambos casos, el diseo de los microprocesadores se hizo tratando de mantener cierto nivel de compatibilidad con los desarrollados anteriormente. En el segundo caso, este nivel de compatibilidad se extendi a los de otra marca. Sin embargo, un 8088 no puede ejecutar cdigo de un 80186 o superiores, ya que los procesadores ms avanzados poseen juegos de instrucciones y registros nuevos no contenidos por un 8088. Un caso similar es la serie 68xxx, pero de ninguna manera podemos esperar que un Intel ejecute cdigo de un Motorola y viceversa. Y esto no tiene nada que ver con la compaa, ya que Intel desarrolla otros tipos de microprocesadores como el 80860 y el iWARP, los cuales no pueden compartir cdigo ni entre ellos ni entre los 80xx/80xxx.

Manual de Lenguaje Ensamblador Ahora bien, mientras que con el lenguaje de mquina, nosotros obtenemos un control total del microprocesador, la programacin en este lenguaje resulta muy difcil y fcil para cometer errores. No tanto por el hecho de que las instrucciones son slo nmeros, sino porque se debe calcular y trabajar con las direcciones de memoria de los datos, los saltos y las direcciones de llamadas a subrutinas, adems de que para poder hacer ejecutable un programa, se deben enlazar las rutinas de run-time y servicios del sistema operativo. Este proceso es al que se le denomina ensamblado de cdigo. Para facilitar la elaboracin de programas a este nivel, se desarrollaron los Ensambladores y el Lenguaje Ensamblador.

Existe una correspondencia 1 a 1 entre las instrucciones del lenguaje de mquina y las del lenguaje ensamblador. Cada uno de los valores numricos del lenguaje de mquina tiene una representacin simblica de 3 a 5 letras como instruccin del lenguaje ensamblador. Adicionalmente, este lenguaje proporciona un conjunto de pseudo-operaciones (tambin conocidas como directivas del ensamblador) que sirven para definir datos, rutinas y todo tipo de informacin para que el programa ejecutable sea creado de determinada forma y en determinado lugar. 1.2- INTERPRETES, COMPILADORES Y ENSAMBLADORES. An cuando el lenguaje ensamblador fue diseado para hacer ms fcil la programacin de bajo nivel, esta resulta todava complicada y muy laboriosa. Por tal motivo se desarrollaron los lenguajes de alto nivel, para facilitar la programacin de los computadores, minimizando la cantidad de instrucciones a especificar. Sin embargo, esto no quiere decir que el microprocesador ejecute dichos lenguajes. Cada una de las instrucciones de un lenguaje de alto nivel o de un nivel intermedio, equivalen a varias de lenguaje mquina o lenguaje ensamblador. La traduccin de las instrucciones de nivel superior a las de bajo nivel la realizan determinados programas. Por una parte tenemos los intrpretes, como DBase, BASIC, APL, y Lisp. En estos, cada vez que se encuentra una instruccin, se llama una determinada rutina de lenguaje de mquina que se encarga de realizar las operaciones asociadas, pero en ningn momento se genera un cdigo objeto y mucho menos un cdigo ejecutable. Por otra parte, tenemos los compiladores, como los desarrollados para Fortran, Clipper, COBOL, Pascal o C, que en vez de llamar y ejecutar una rutina en lenguaje de mquina, stos juntan esas rutinas para formar el cdigo objeto que, despus de enlazar las rutinas de run-time y llamadas a otros programas y servicios del sistema operativo, se transformar en el programa ejecutable. Finalmente, tenemos los ensambladores como los descritos en este trabajo que son como una versin reducida y elemental de un compilador (pero

Manual de Lenguaje Ensamblador que de ninguna manera deben considerarse como tales), ya que lo nico que tienen que hacer es cambiar toda referencia simblica por la direccin correspondiente, calcular los saltos, resolver referencias y llamadas a otros programas, y realizar el proceso de enlace. Los ensambladores son programas destinados a realizar el ensamblado de un determinado cdigo. 1.3.- EL PROCESO DE LIGA, LAS RUTINAS DE RUN-TIME Y LOS SERVICIOS DEL SISTEMA OPERATIVO. Para crear un programa ejecutable a partir de un cdigo objeto se requiere que se resuelvan las llamadas a otros programas y a los servicios del sistema operativo, y agregar las rutinas o informacin de run-time para que el programa pueda ser cargado a memoria y ejecutado. Este proceso es lo que se conoce como Link o proceso de liga, y se realiza a travs de un ligador o Linker que toma de entrada el cdigo objeto y produce de salida el cdigo ejecutable. Las rutinas de RUN-TIME son necesarias, puesto que el sistema operativo requiere tener control sobre el programa en cualquier momento, adems de que la asignacin de recursos y su acceso deben hacerse solamente a travs del sistema operativo. Para los computadores personales, esto no es tan complejo como para otros computadores y sistemas operativos, pero es requerido.

IBM

2.- LA ARQUITECTURA Y COMPATIBLES.

DE

LAS

COMPUTADORAS

PERSONALES

Los computadores PC estn compuestos fsicamente por: monitor, teclado, CPU, floppy drives, hard disk drives, perifricos y componentes adicionales. Lgicamente estn compuestos por el BIOS (Basic Input-Output System) y el sistema operativo MS-DOS (MicroSoft Disk Operating System). El teclado se encuentra conectado a un puerto de entrada destinado especficamente para tal propsito. Este tiene asociado un rea de memoria (buffer) al cual llegan los cdigos de las teclas presionadas en el teclado. La CPU est compuesta por la memoria RAM, memoria ROM (donde reside el BIOS), los controladores de disco, la tarjeta de video, los puertos de entradasalida y el microprocesador. Los perifricos se encuentran conectados y asociados por el sistema operativo con un puerto en particular (una vez que el puerto ha sido abierto). Las tarjetas controladores de floppy y disco duro se encargan de intercambiar informacin entre memoria, procesador y unidades de disco. Para tal propsito se reservan en memoria reas especficas, para servir de buffers en el intercambio de datos del computador con las unidades de disco. El monitor y la tarjeta de video estn muy relacionados entre s, ya que si bien el monitor se encarga de desplegar la informacin, no es ste quien la mantiene, sino la memoria designada a la tarjeta de video. Esta memoria es

Manual de Lenguaje Ensamblador como cualquier otra, direccionable y modificable, y es en donde se guarda la informacin que aparece en pantalla. Debido al tipo de microprocesador empleado, la memoria de la PC se encuentra dividida en una serie de blocks denominados segmentos, de 64KB cada uno. La memoria es accesada especificando el segmento y el desplazamiento dentro del segmento (segmento: desplazamiento, para mayor detalle ver el apndice C). Para las PCs la memoria se clasifica en tres tipos: - Convencional: Es la memoria de tipo bsico y que abarca las direcciones de 0 a 640KB. En sta es donde se cargan los programas de usuario y el sistema operativo, y es la que est disponible para equipo XT (8088,8086, 80186 y 80188). - Extendida: Esta memoria slo est disponible para procesadores 80286 y mayores (equipo AT, 80386 y 80486). Muchos programas que usan la memoria convencional no pueden usar la memoria extendida porque las direcciones en memoria extendida estn ms all de las que el programa puede reconocer. nicamente las direcciones dentro de los 640KB pueden ser reconocidas por todos los programas. Para reconocer la memoria extendida se requiere de un manejador de memoria extendida, como HIMEM.SYS que provee MS-DOS. - Expandida: Esta es la memoria que se agrega al computador a travs de una tarjeta de expansin, y que debe ser administrada por un programa especial, como el EMM386.EXE. A diferencia de la memoria convencional o extendida, la memoria expandida es dividida en bloques de 16K llamados pginas (pages). Cuando un programa solicita informacin de memoria expandida el manejador copia la pgina correspondiente en un rea denominada page frame para poder ser accesada en la memoria extendida. Como se puede observar, el 8088, 8086, 80188 y 80186 son capaces de direccionar hasta 1 MB de memoria. Ya hemos indicado que la memoria convencional slo abarca 640KB, as nos quedan 384KB libres. Esta parte de la memoria es denominada parte alta, y como no est disponible para muchos programas generalmente se usa para cargar drivers del sistema operativo, programas residentes y datos de hardware (ROM y pginas de video).

3.- LA ARQUITECTURA DE LOS MICROPROCESADORES INTEL. Sin importar de qu microprocesador se trate, los microprocesadores del 8088 al 80486 usan el modelo de registros del 8086. Los microprocesadores matemticos 80287 al 80487 utilizan el modelo de registros expandidos del 8087. Para mayor detalle ver los apndices A y B. Los microprocesadores matemticos estn diseados exclusivamente para efectuar operaciones aritmticas de una manera ms rpida y precisa bajo el

Manual de Lenguaje Ensamblador control de otro procesador razn por la cual se denominan coprocesadores. Estos tambin poseen un juego de instrucciones de lenguaje de mquina propio. La diferencia entre los diversos microprocesadores de uso general y los coprocesadores reside en el nuevo conjunto de instrucciones, registros y sealizadores agregados con cada nueva liberacin de un procesador superior. Estas adiciones se hicieron con el fin de agregar un mayor poder de cmputo sin alterar la estructura bsica, para as mantener la compatibilidad con los desarrollos anteriores, tanto de software como de hardware. La diferencia entre los 8086 y 8088 con los 80186 y 80188 no es muy grande, sta radica en un grupo de instrucciones que fueron agregadas al 80186 y al 80188. La diferencia entre el 8086 y el 8088, lo mismo que entre el 80186 y el 80188, es el modelo de memoria que usan ambos procesadores. El 8088 y el 80188 estn diseados como microprocesadores de 8 bits por lo que el modo de acceso a la memoria es ligeramente distinto pero compatible con el 8086 y el 80186. Esto se ver con ms detalle en un tema posterior. 4.- EL SISTEMA OPERATIVO MS-DOS. Junto con todo lo visto anteriormente, y como se mencion anteriormente, uno de los componentes que caracterizan los computadores personales es su sistema operativo. Una PC puede correr varios sistemas operativos: CP/M, CP/M86, XENIX, Windows, PC-DOS, y MS-DOS. Lo que los define es la forma en que estn integrados sus servicios y la forma en que se accesa a ellos. Esto es precisamente lo que el linker debe enlazar y resolver. Aqu nos enfocaremos exclusivamente en el sistema operativo MS-DOS, y lo que se mencione aqu ser valido para las versiones 3.0 y superiores. Este sistema operativo est organizado de la siguiente manera: Comandos Internos COMMAND.COM) Comandos Externos Utileras y drivers Shell mayores) Servicios (reconocidos y ejecutados por el

(.EXEs y .COMs) (programas de administracin del sistema) (Interfaz amigable, slo versiones 4.0 (Interrupciones)

o

Los servicios, ms conocidos como interrupciones o vectores de interrupcin, es parte medular de lo que es MS-DOS, y no son ms que rutinas definidas por MS-DOS y el BIOS, ubicadas a partir de una localidad de memoria especfica. La manera de acceder a estas rutinas y a los servicios que ofrecen es mediante una instruccin que permite ejecutar una interrupcin. MS-DOS proporciona dos mdulos: IBMBIO.COM (provee una interfaz de bajo nivel para el BIOS) e IBMDOS.COM (contiene un manejador de archivos y servicios para manejo de registros). En equipos compatibles estos archivos tienen los nombres IO.SYS y MSDOS.SYS, respectivamente. El acceso a los servicios del computador se realiza de la siguiente manera:

Manual de Lenguaje Ensamblador Programa DOS EXTERNO de usuario Alto nivel Peticin de IBMDOS.COM Dispositivo I/O DOS Bajo nivel IBMBIO.COM ROM BIOS

5.- ENSAMBLADORES Y MACROENSAMBLADORES. Existen varios ensambladores disponibles para ambiente MS-DOS: el IBM Macro Assembler, el Turbo Assembler de Borland, el Turbo Editassm de Speedware, por citar algunos. Una breve descripcin de cada uno se proporciona a continuacin. Macro Ensamblador IBM: Est integrado por un ensamblador y un macroensamblador. En gran medida su funcionamiento y forma de invocarlo es sumamente similar al de Microsoft. Su forma de uso consiste en generar un archivo fuente en cdigo ASCII, se procede a generar un programa objeto que es ligado y se genera un programa .EXE. Opcionalmente puede recubrirse a la utilera EXE2BIN de MS-DOS para transformarlo a .COM. Es capaz de generar un listado con informacin del proceso de ensamble y referencias cruzadas. Macro Ensamblador de Microsoft: Dependiendo de la versin, este ensamblador es capaz de soportar el juego de instrucciones de distintos tipos de microprocesadores Intel de la serie 80xx/80x86. En su versin 4.0 este soporta desde el 8086 al 80286 y los coprocesadores 8087 y 80287. Requiere 128KB de memoria y sistema operativo MS-DOS v2.0 o superior. Trabaja con un archivo de cdigo fuente creado a partir de un editor y grabado en formato ASCII. Este archivo es usado para el proceso de ensamble y generacin de cdigo objeto. Posteriormente, y con un ligador, es creado el cdigo ejecutable en formato .EXE. Turbo Editassm: Este es desarrollado por Speddware, Inc., y consiste de un ambiente integrado que incluye un editor y utileras para el proceso de ensamble y depuracin. Es capaz de realizar el ensamble lnea a lnea, conforme se introducen los mnemnicos, y permite revisar listas de referencias cruzadas y contenido de los registros. Este ensamblador trabaja con tablas en memoria, por lo que la generacin del cdigo ejecutable no implica la invocacin explcita del ligador por parte del programador. Adicionalmente permite la generacin de listados de mensajes e informacin de cada etapa del proceso y la capacidad de creacin de archivos de cdigo objeto. Turbo Assembler (De Borland Intl): es muy superior al Turbo Editassm. Trabaja de la misma forma, pero proporciona una interfaz mucho ms fcil de usar y un mayor conjunto de utileras y servicios. En lo que se refiere a las presentes notas, nos enfocaremos al Microsoft Macro Assembler v4.0. Los programas ejemplo han sido desarrollados con ste y

Manual de Lenguaje Ensamblador est garantizado su funcionamiento. Estos mismos programas posiblemente funcionen con otros ensambladores sin cambios o con cambios mnimos cuando utilizan directivas o pseudoinstrucciones. Realmente la diferencia entre los ensambladores radica en la forma de generar el cdigo y en las directivas con que cuente, aunque estas diferencias son mnimas. El cdigo ensamblador no cambia puesto que los microprocesadores con los que se va a trabajar son comunes. As, todos los programas que se creen con un ensamblador en particular podrn ser ensamblados en otro, cambiando las pseudo-operaciones no reconocidas por el equivalente indicado en el manual de referencia del paquete empleado. Los programas que componen el Macro Ensamblador Microsoft v4.0 son los siguientes: Programa MASM.EXE SYMDEB.EX E LINK.EXE MAPSYM.EX E CREF.EXE LIB.EXE MAKE.EXE EXEPACK.EX E EXEMOD.EX E COUNT.ASM README.DO C Descripcin Microsoft Macro Assembler Microsoft Symbolic Debuger Utility Microsoft 8086 object linker Microsoft Symbol File Generator Microsoft Cross-Reference Utility Microsoft Library Manager Microsoft Program Maintenance Utility Microsoft EXE File Compression Utility Microsoft EXE File Header Utility Sample source file for SYMDEB session Updated information obtained after the manua was printed.

El Microsoft Macro Assembler v4.0 crea cdigo ejecutable para procesadores 8086, 8088, 80186, 80188, 80286, 8087 y 80287. Adems es capaz de aprovechar las instrucciones del 80286 en la creacin de cdigo protegido y no protegido. El trmino macroensamblador es usado para indicar que el ensamblador en cuestin tiene la capacidad de poder ensamblar programas con facilidad de macro. Una macro es una pseudo-instruccin que define un conjunto de instrucciones asociadas a un nombre simblico. Por cada ocurrencia en el cdigo de esta macro, el ensamblador se encarga de sustituir esa llamada por todas las instrucciones asociadas y, en caso de existir, se dejan los parmetros con los que se estaba llamando la macro y no con los que haba sido definida. Es importante sealar que no se deja una llamada, como a una subrutina o procedimiento, sino que se incorporan todas las instrucciones que definen a la macro.1

Manual de Lenguaje Ensamblador 6. SISTEMAS NUMRICOS Comencemos por los sistemas de numeracin que ms utilizaremos al programar. El bsico va a ser el sistema hexadecimal, aunque debemos de explicar antes el binario, el sistema de numeracin que utiliza el ordenador. Los nmeros que conocemos estn escritos en base 10. Esto significa que tenemos, desde el 0 hasta el 9, diez smbolos para representar cada cifra. Es decir, cada cifra ir de 0 a 9, y al superar el valor "9", cambiar a 0 y sumar uno a su cifra de la izquierda: 9+1: 10. El sistema binario utiliza tan slo dos smbolos, el "0" y el "1". Imaginemos que tenemos el nmero binario "0". Al sumarle una unidad, este nmero binario cambiar a "1". Sin embargo, si volvemos a aadirle otra unidad, a este nmero en formato binario ser el "10" (aumenta la cifra a la izquierda, que era 0, y la anterior toma el valor mnimo). Sumemos ahora otra unidad: el aspecto del nmero ser decimal). Y podramos seguir: "11" (tres en

Binario : 0 ; 1 ; 10 ; 11 ; 100 ; 101 ; 110; 111 ; 1000 ; 1001 ; 1010,... Decimal: 0 1 2 3 4 5 6 7 8 9 10 Esto nos permite establecer un sistema bastante sencillo de conversin del binario al decimal; He aqu los valores siendo n el valor de la cifra: Cifra menos significativa: n*2^0 = 1 si n=1 o 0 si n=0 Segunda cifra: n*2^1 = 2 si n=1 o 0 si n=0 Tercera cifra: n*2^2 = 4 si n=1 o 0 si n=0 Cuarta cifra: n*2^3 = 8 si n=1 o 0 si n=0 etc.,... Y as continuaramos, aumentando el nmero al que se eleva 2. Traduzcamos entonces el nmero binario '10110111' 2^7+ 0 +2^5+2^4+ 0 +2^2+2^1+2^0 = 128 + 0 + 32 + 16 + 4 + 2 + 1 = 183 1 0 1 1 0 1 1 1 De todos modos, esta transformacin la he puesto simplemente para que se comprenda con ms claridad cmo funcionan los nmeros binarios. Es mucho

Manual de Lenguaje Ensamblador ms aconsejable el uso de una calculadora cientfica que permita realizar conversiones entre decimales, hexadecimales y binarios. Se hace su uso ya casi imprescindible al programar. La razn del uso de los nmeros binarios es sencilla. Es lo que entiende el ordenador, ya que interpreta diferencias de voltaje como activado (1) o desactivado (0), aunque no detallar esto. Cada byte de informacin est compuesto por ocho dgitos binarios, y a cada cifra se le llama bit. El nmero utilizado en el ejemplo, el 10110111, sera un byte, y cada una de sus ocho cifras, un bit. Y a partir de ahora, cuando escriba un nmero binario, lo har con la notacin usual, con una "b" al final del nmero (ej: 10010101b) La conversin a hexadecimal es muy utilizada en ensamblador, se trata de un sistema de numeracin en base diecisis. Por tanto, hay diecisis smbolos para cada cifra, y en vez de inventarse para ello nuevos smbolos, se decidi adoptar las primeras letras del abecedario. Por lo tanto, tendremos ahora: Hex Dec 1 --> 1 2 --> 2 3 --> 3 4 --> 4 5 --> 5 6 --> 6 7 --> 7 8 --> 8 9 --> 9 A --> 10 B --> 11 C --> 12 D --> 13 E --> 14 F --> 15 10 --> 16 11 --> 17 Etc,... Como vemos, este sistema nos planteas bastantes problemas para la conversin, una calculadora cientfica ser casi imprescindible para realizar esta operacin. Por que utilizar este sistema? Bien sencillo. Volvamos al byte, y traduzcamos su valor ms alto, "11111111". Resulta ser 256. Ahora pasemos esta cifra al sistema hexadecimal, y nos resultar "FF". Obtenemos un nmero ms comprensible que el binario (difcil de recordar), y ante todo mucho ms compacto, en el que dos cifras nos representaran cada byte. Podremos adems traducir fcilmente el binario a hexadecimal con esta tabla; cada cuatro cifras binarias pueden traducirse al hexadecimal:

Manual de Lenguaje Ensamblador Binari Hexadecim o al 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F Por ejemplo, el nmero binario: 1111 0011 1010 1110 En hexadecimal sera: 1111 0011 1010 1110 F 3 A E Para referirnos a un nmero hexadecimal sin especificarlo, usaremos la notacin que se suele usar al programar, con un 0 al principio (necesario cuando hay letras) y una h al final, por ejemplo, el nmero anterior sera 0F3AEh

7. OPERACIONES CON BYTES Hay cuatro operaciones bsicas que se pueden realizar con un nmero binario, y coinciden con operaciones de la lgica matemtica, con lo que cualquiera que la haya estudiado tendr cierta ventaja para entenderla. Para explicarlas, llamar al valor 0 resultado "falso", y al valor 1 "verdadero". Las operaciones son AND, OR, XOR y NOT 7.1. AND Es un 'y' lgico. Se realiza entre dos cifras binarias confrontando cada cifra con su correspondiente, y el resultado ser "1" si las dos son verdaderas (si las dos valen "1), y "0" (falso) en el resto de los casos. AND 1er. numero 1 1 0 0

2do. numero 1 0 1 0

Resultad o 1 0 0 0

Vuelvo a la lgica para explicarlo ms claramente: Imaginemos la frase: "El hombre es un mamfero y camina erguido". El hecho de que el hombre sea un mamfero es cierto (1), y el de que camine erguido, otro (1). Por lo tanto, al unirlos mediante una conjuncin (y o AND), resulta que ya que se dan las dos, la oracin es verdadera. Pongamos un ejemplo ms complejo, queremos realizar un AND lgico entre dos bytes: 11011000 AND 01101001 Observemos lo que sucede: 11011000 01101001 En sistema decimal sera: AND 01001000 es mas lioso) 72 216 105 AND

(aunque en sistema decimal

Cuando coinciden dos valores de "verdad", el resultado es "verdad", si uno es falso, el resultado es "falso" (no es verdad que "El hombre es un mamfero y respira debajo del agua), y si los dos son falsos, el resultado es falso (no es cierto que "El hombre es un ave y respira debajo del agua) 7.2. OR

Manual de Lenguaje Ensamblador El "o" lgico. El resultado es "verdadero" cuando al menos uno de los factores es verdadero. O sea, es "1" cuando al menos uno de los dos factores es "1". Sera como la frase "Voy a buscar el peine o la caja de bombones", donde que uno sea cierto no significa que el otro no lo sea; es cierta la frase, es verdadera mientras uno de los trminos sean verdaderos.

Operemos con los nmeros "10100110" y "01101100": 10100110 OR 01101100 -------11101110

Como hemos visto, el valor 1 (verdadero) queda en las cifras de las que, confrontadas, al menos una es verdadera. Slo resulta 0 (falso) si los dos nmeros enfrentados son 0 (falsos). 7.3. XOR "OR" exclusivo. Se trata de una orden parecida al OR, tan slo que la verdad de una excluye la de la otra. El resultado, por tanto, es "1" (verdad) cuando uno y slo uno de los dos nmeros es verdadero (y el otro falso, claro). Sera como la oracin "O vivo o estoy muerto", para que sea cierta se tiene que dar una de las dos, pero nunca las dos o ninguna. 10111001 XOR 01011101 -------- 11100100

La orden XOR va a ser bastante til en encriptacin, pero eso ya es otra historia,... 7.4. NOT Esto se aplica sobre un slo nmero, y en trminos de lgica sera la negacin de una oracin, o sea, si el nmero al que se aplica es 1 el resultado es 0, y viceversa. En trminos de lgica matemtica aplicndolo a una oracin, sera por ejemplo, " No es verdad que tenga ganas de estudiar y de no beber ", negando las otras dos que en caso contrario seran verdad: NOT 11100110 Bytes, bits y dems Tan slo, por si alguien no lo conoce, se quiere detallar el modo de almacenamiento del ordenador, incluyendo lo ms temido por el iniciado en Ensamblador, y ms engorroso para el programador, segments y offsets. -------00011001

Manual de Lenguaje Ensamblador La unidad mnima de informacin es el bit. Su estado, como vimos anteriormente, puede ser 1 o 0. Un conjunto de ocho bits, forman un byte. De ellos, el de la derecha es el menos significativo (su valor es menor), y el de m s a la izquierda el ms significativo. Un Kbyte es un conjunto de 1024 (que no 1000) bytes. Igualmente, un MegaByte sern 1024 kbytes, o 1024*1024=1048576 bytes. Otro trmino que se utilizar a menudo, es palabra, o "word". Una "palabra", es un conjunto de dos bytes, y se utiliza por que a menudo se opera con ellas en lugar de bytes. Segments y offsets: Hubo un tiempo, cuando los dinosaurios dominaban la tierra, en el que a "alguien" se le ocurri que con 640K debera de bastarnos para hacerlo todo. Y por aqu comienzan los problemas: El ancho de bus de direcciones, para localizar un punto en memoria, es de 20 bits. Por lo tanto, el nmero mximo de direcciones de memoria a las que podremos acceder ser 1 Mb. Pero como veremos, 20 bits no son ni 2 bytes ni 3, sino as como 2 y medio %-). El problema es ordenarlos para que el procesador conozca la direccin de memoria, y aqu llegan las cosillas,... Se Necesitar para conocer una posicin de memoria de cuatro bytes combinados de una curiosa manera. Hay que imaginar los dos bytes inferiores. Su mayor valor puede ser 0FFFFh (poner un cero delante es una convencin, para que lo entiendan los ensambladores, al igual que la h al final indicando que es un nmero hexadecimal). Esto nos da acceso a 64Kb de memoria, que se considera un bloque. Tambin, a partir de ahora, se llamar Offset a la direccin indicada por estos dos bytes. Ahora se desea ms memoria que 64 Kb, y para esto se poseen los otros dos bytes. Para formar la direccin completa, se toman los 16 bits del registro de segmento y se sitan en los 16 bits superiores de la direccin de 20 bits, dejando los otros cuatro a cero. Vamos, como si se aade cuatro ceros a la derecha, y se suma a este valor de 20 bits, el Offset, da el resultado de la direccin real de memoria A continuacin se presentar una demostracin grfica para el mejor entendimiento: Sea el valor de Segmento 0Ah (o decir, 10 decimal o 1010b, en binario). Y el del Offset que va a valer (en binario) 01011111 00001010. La suma para obtener la direccin de memoria sera tal que as: 0000 0000 0000 1010 0000 (segmento multiplicado*16, con 4 ceros mas) + 0101 1111 0000 1010 (el offset)

Manual de Lenguaje Ensamblador -------------------------------------0000 0101 1111 1010 1010 Y esta sera la direccin *real* de memoria (05FAAh o 24490 Dec). Como puedes observar, y como curiosidad final, distintos segments y offsets especifican direcciones de memoria distintas; por ejemplo, los pares 0040h: 0000 (donde el primero es el Segment y el segundo el Offset, as lo tomaremos a partir de ahora), son iguales que 0000:0400h, y los dos se referiran a la misma posicin de memoria fsica, la 0400h o 1024d. Espero que haya quedado claro, aunque sea simplemente tener una ligera idea. Lo prximo sern los registros, y (y ahora me pongo como los del Pcmana cuando hablan de Windoze95) podremos empezar en serio con nuestro lenguaje favorito X-)

8. JUEGO DE REGISTROS Quiz alguno de vosotros se est preguntando a estas alturas: Y eso del Segment y Offset, dnde se guarda, que indica al ordenador esos sitios en memoria, que indica al ordenador en que punto de la memoria esta y que tiene que ejecutar? Pues bien, para esto y mucho mas sirven los registros. Se trata de una serie de "variables", que contienen informacin que puede ser cambiada. Comenzar, al contrario que todos los libros, por los de segmento y offset actual: CS e IP. El registro CS es una variable de un tamao de dos bytes. Contiene el Segmento actual en que se encuentra el programa. IP, es la variable, de dos bytes tambin, que contiene el Offset actual. Esto significa, el ordenador va interpretando las secuencias de bytes, pero necesita "algo" que le indique donde tiene que leer. La combinacin CS: IP (tal y como me refer antes en lo de segments & Offsets) contiene la direccin en la que el ordenador est interpretando informacin *en el momento*. O sea, indica la direccin de la prxima instruccin que se va a ejecutar. El registro DS y el registro ES tambin sirven para guardar direcciones de Segmentos, y tambin son variables de dos bytes, ser n utilizada para por ejemplo mover datos en memoria, imprimir cadenas, bueno, un etctera largsimo. Digamos que son "punteros", que apuntan a cierta zona de memoria (siempre combinado con otro que haga de Offset, claro). El registro SS apunta a la pila, y el SP es el que contiene el offset de la pila, pero esto lo explicar mas adelante. Luego tenemos una serie de registros que utilizaremos mas comnmente: AX, BX, CX y DX. Todas ocupan dos bytes, y se pueden utilizar divididas en dos partes de longitud un byte, cambiando de nombre. AX se divide en AH y AL, BX en BH y BL, CX en CH y CL y DX en DH y DL. La 'H' se refiere a High en ingls, alto (de mayor valor), y la 'l' a Low (de menor valor). Lo ilustro un poquillo: AX |-----------------------------| 11010110 10111000 AH AL Las funciones de estos cuatro registros son diferentes:

Manual de Lenguaje Ensamblador AX se suele utilizar como propsito general, indica funcin a las interrupciones, etc., y es el ms flexible, ya que ser el nico que permita multiplicaciones y divisiones. Se denomina a veces acumulador. BX nos servir mucho como "handler", para abrir/cerrar archivos, etc., y como registro de propsito general al igual que AX, CX y DX. CX se suele usar como contador. DX suele ser el puntero, sealando haciendo el papel de Offset lugares en memoria (suele combinarse con DS en la forma DS: DX). Y nos quedan ya slo tres registros, BP, SI y DI, que son tambin punteros. SI y DI los utilizaremos a menudo para copiar bytes de un lado a otro, etc. Ni que decir que, como el resto de registros, contienen dos bytes. Igual sucede con BP, de otros dos bytes de tamao. 9.- QU ES... LA BIOS? 9.1 CONFIGURACIN AVANZADA Y DEL CHIPSET Son parmetros que indican qu caractersticas del chipset deben habilitarse y cmo. Afecta habitualmente a la memoria RAM, a las caches (interna y externa) y a veces al micro, a los buses ISA, Vesa, PCI y AGP y a otros dispositivos como los puertos serie y paralelo. Este terreno puede ser algo peligroso, as que apunte todo antes de cambiar nada; lo ms fcil es dejar las ms opciones que pueda en Auto, aunque con eso puede que no saque el mximo de rendimiento. Y es que para ganar hay que sufrir...

Manual de Lenguaje Ensamblador

Auto Configuracin: pues eso, configuracin automtica; la tabla de salvacin cuando no se consigue hacer a mano. Los valores que da tras una primera autoconfiguracin pueden ser vlidos como punto de partida, as que como siempre, apntelos antes de modificarlos. ISA Bus Clock: la velocidad del bus ISA, que en teora debe ser unos 8 MHz. A veces se introduce como una cifra en MHz y otras veces en funcin del bus del sistema (el PCLK), por ejemplo como 1/3 cuando ste es a 33 MHz, como en los 386 y 486 a 33 MHz o 486 a 66 y 100 (que van a 33 externamente). Cuanto ms rpido sea el bus, mejor, pero no se pase: 10 12 MHz ya est bien, ms puede ser arriesgado y se supone que las tarjetas ISA no estn preparadas para nada por encima de 8.

Velocidad de la RAM: en esto existen mltiples formas de proceder. Evidentemente, cuanto mayor le indiquemos que es la velocidad de la RAM ms rpido ir el sistema, pero en muchas ocasiones la RAM no es tan rpida o de calidad como sera deseable y la estabilidad del sistema se resiente, sobre todo al cargarlo de trabajo. Los valores que indican esta velocidad son los ciclos de acceso a RAM, los ciclos de espera (Clock Cycles o, a veces, Wait States) que el rpido microprocesador concede a la lenta RAM antes de mandarle o leer de ella la informacin. En casi todas las BIOS existen opciones para configurar automticamente estos valores; en algunas BIOS basta con introducir la velocidad en nanosegundos de la memoria, as como su tipo (normal -FPM-, EDO o SDRAM); en otras se debe poner la cifra ms baja en ciclos. Por ejemplo, una rfaga habitual en lectura (Read) puede ser 7-3-3-3, y se suele solicitar ese 3 como valor de DRAM Read Timing o DRAM Read Wait State (o Write para escritura). Para EDO o FPM rpida ese 3 puede ser un 2 y para SDRAM suele ser un 1. El 7 puede ser menor, incluso un 5 si tenemos un buen chipset y memoria rpida. Otras veces se indica la velocidad de la memoria simplemente describindola como Slowest, Slower, Faster y Fastest, de menos a ms rpida. As que mire los valores por defecto y vaya subindolos (o bajndolos, si son ciclos de espera) de uno en uno, tras lo cual reinicie y observe el

Manual de Lenguaje Ensamblador rendimiento y la estabilidad del ordenador. Pruebe con Windows 9x, NT o similar, as como con algn juego exigente (mismamente Quake), no con el viejo DOS, que lo soporta casi todo. En cuanto note inestabilidad, vuelva al valor anterior y ya est. Ajustes de la cach: similares a los de la RAM. Algunos consisten en modificar los tiempos de acceso, otros en modificar la forma de acceder a la cach. De cualquier forma, esto depende enteramente de las capacidades de la cach misma, as que juegue poco con estos valores. Para los arriesgados o curiosos, el modo Write Back es mejor que el Write Thru (o Through), aunque no puede usarse siempre. Vdeo y System Cacheable (Shadow): como se coment en el apartado de opciones de la BIOS, copiar la BIOS de la tarjeta de vdeo o del sistema de la lenta ROM a la rpida RAM o, en este caso, usar la cach para lo mismo. Se supone que debera aumentar el rendimiento, pero puede dar problemas con sistemas operativos de 32 bits modernos. Manejo de dispositivos: hoy en da los chipsets deben manejar las controladoras de dispositivos tales como discos duros, puertos serie, etc., que suelen estar incorporadas a la placa base. No lo explicaremos por ahora, puesto que muchas veces existe un men dedicado en exclusiva a este apartado, denominado generalmente Integrated Peripherals. Configuracin por software de la CPU: en la actualidad, bastantes placas base han dejado de lado el mtodo clsico para configurar la CPU y han optado por soluciones jumperless (literalmente, "sin jumpers"), autodetectando los valores correctos de velocidad de bus, multiplicador y voltaje y/o permitiendo que el usuario los seleccione mediante un sencillo men en la BIOS. Como ejemplo tenemos el programa SoftMenu presente en las conocidas placas base Abit, entre ellas la BH6, que durante meses ha sido la placa de ensueo para los overclockers. Y es que aunque esta caracterstica ahorra tiempo y complicaciones a cualquiera, donde se ve toda su potencia es cuando queremos ver hasta dnde podemos forzar nuestro micro... sin pasarnos y sabiendo que esto se supone que anula su garanta, ojo. 9.2. PERIFRICOS INTEGRADOS Las placas base modernas (desde las de los ltimos 486) suelen tener integrados los chips controladores del disco duro, y en muchas ocasiones manejan tambin las disqueteras, los puertos serie y el puerto paralelo. Por ello, las BIOS tienen diversos apartados para manejar estos dispositivos, entre ellos:

Conexin o desconexin de dichas controladoras: de especial importancia en el caso del segundo canal IDE, que en ocasiones est deshabilitado por defecto, y que deberemos habilitar para conectar ms de dos dispositivos IDE (o bien uno lento y uno rpido sin mezclarlos en el mismo canal, lo que baja el rendimiento). Modos de acceso a discos duros (PIO y/o UltraDMA): los discos modernos admiten 5 modos PIO, del ms lento, el PIO-0 o no soporte de

Manual de Lenguaje Ensamblador este tipo de acceso (en discos antiguos, de 100 MB o menos), hasta el ms rpido, el modo PIO-4. Adems, recientemente ha aparecido el modo UltraDMA, an ms rpido. Si la controladora est integrada en la placa base, aqu debe especificar esos datos. Bsquelos en el manual de su disco duro, en Internet en la pgina del fabricante o bien seleccione Auto y no se complique ms. Direcciones e interrupciones (IRQs) de los puertos: bien sean los puertos serie o el paralelo. Resulta muy raro necesitar cambiar los valores por defecto, pero podra ser necesario para evitar conflictos con otros dispositivos que usen esos mismos valores. Tipo de puerto paralelo: el antiguo estndar de puerto paralelo se ha quedado un tanto anticuado hoy en da, sobre todo si lo que queremos conectar no es una impresora sino un escner o una unidad Zip; por ello, se suele poder seleccionar otras posibilidades ms avanzadas como ECP o EPP. Busque en el manual del perifrico para saber qu modo debe escoger. Control del puerto de infrarrojos: aunque muy pocas placas base incluyen los adaptadores y cables necesarios, modernamente casi todas traen los conectores para instalar un puerto de infrarrojos en su sistema. Generalmente deber habilitarse y seleccionar su tipo, direccin de memoria, IRQ y si debe redireccionar la informacin de COM2 a este puerto. 9.3. ADMINISTRACIN DE ENERGA En este men, relativamente reciente (no se implant hasta bien entrada la poca de los 486), es donde se configuran las caractersticas de ahorro de energa del ordenador. Esto puede ser algo totalmente superfluo, por ejemplo si vamos a usar el ordenador de forma continuada al mximo de potencia, o bien algo fundamental, como ocurre en ordenadores porttiles o sencillamente si tenemos la mala costumbre de encender el ordenador al llegar a la oficina y no apagarlo hasta la hora de salir, tanto si lo vamos a usar como si no.

Power Management: literalmente, administracin de energa. Es donde se selecciona si queremos habilitar el ahorro de energa y de qu forma; generalmente se ofrecen Disable (deshabilitado), User define (definido por el usuario) y algunas opciones predeterminadas para un ahorro mnimo o mximo. PM Control by APM: una opcin muy importante; determina si el control de energa deber hacerse segn el estndar APM (Advanced Power Management, administracin avanzada de energa), lo que entre otras cosas permite que Windows sea capaz de suspender el equipo a voluntad o, si utilizamos una fuente ATX, que el sistema efectivamente se apague al pulsar "Apagar el sistema" en el men Inicio. Video Off Method: ofrece diversas opciones para reducir el consumo del sistema de vdeo, de las cuales la ms interesante es DPMS, aunque no

Manual de Lenguaje Ensamblador todos los monitores y tarjetas grficas la soportan; lea el manual de estos aparatos para estar seguro, aunque si son modernos y de cierta calidad es muy probable que la incorporen. La opcin Blank Screen es simplemente un salvapantallas negro, lo que puede ser til en DOS.

PM Timers: para controlar el tiempo que debe permanecer inactivo el ordenador (System) o el disco duro (HDD) antes de que se active el ahorro de energa. Existen 3 grados de ahorro de energa: o Doze: reduce la velocidad de la CPU (el microprocesador). o Standby: reduce la actividad de todo el ordenador. o Suspend: reduce al mnimo la actividad del ordenador; slo debe utilizarse con CPUs tipo SL, como son la mayora de los 486 rpidos y superiores. PM Events: una larga serie de eventos o sucesos que deben ser controlados para saber si el ordenador est inactivo o trabajando. Es habitual no controlar (Disable) la actividad de la IRQ8 (reloj de la BIOS), ya que rara vez se la puede considerar como totalmente inactiva. CPU Fan Off in Suspend: si el ventilador de la CPU va conectado a la placa base, lo apaga cuando el equipo est en suspenso, ya que en ese momento la CPU est prcticamente parada. Modem Wake Up: activa el equipo cuando se detecta una llamada entrante en el mdem. Necesita que el mdem soporte esta caracterstica y que est conectado a la placa base mediante un cable especial. LAN Wake Up: igual que la anterior, pero para la tarjeta de red. Tambin necesita estar conectado a la placa base mediante un cable. 9.4. Configuracin de PNP y slots PCI

Manual de Lenguaje Ensamblador Un men lleno de opciones complicadas (en esta pgina pocas no lo son), de la clase que sera deseable no tener que alterar nunca; se es mi consejo, escoja Auto todas las veces que pueda, pero si tiene algn conflicto entre dispositivos (misma IRQ, sobre todo)... Probablemente se pregunte qu tiene que ver PNP con PCI; pues bien, la gran mayora de dispositivos PCI soportan PNP, a diferencia de las tarjetas ISA, mucho ms problemticas. Por eso, si su placa no tiene slots PCI (como las primeras para 486), no se extrae si este men no aparece. Ah, para el que no lo conozca, el Plug&Play, PNP o P&P, es una tecnologa que facilita la conexin de dispositivos, ya que se supone que basta con enchufar y listo. Claro que no todos los dispositivos son PNP ni es una tecnologa perfecta, si fuera as este men no existira...

PNP OS Installed: informa al sistema de si hay un sistema operativo PNP instalado, es decir, uno que soporta Plug&Play, como Windows 95 (o eso dicen que hace...), en cuyo caso pasa a ste el control de los dispositivos PNP. De cualquier forma, muchas veces lo que esta casilla indique no afecta al correcto funcionamiento del sistema. Resources Controlled by: pues eso, recursos controlados bien manual, bien automticamente. De nuevo, muchas veces es indiferente una u otra opcin... siempre que no haya problemas, claro. IRQx/DMAx assigned to: una lista de las interrupciones (IRQs) y canales DMA que podemos asignar manualmente, bien a tarjetas PCI/ISA PnP (compatibles con PNP), bien a tarjetas Legacy ISA (tarjetas ISA no PNP, que son las ms conflictivas). Necesitaremos conocer los valores de IRQ y/o DMA a reservar, que vendrn en la documentacin del dispositivo problemtico. PCI IDE IRQ Map to: algo que muy probablemente no necesite cambiar nunca, ya que slo afecta a controladoras IDE no integradas en la placa base, sino en forma de tarjeta, que no sean PNP. Assign IRQ to USB: pues eso, si el puerto USB debe tener una interrupcin asignada o no. Si no tiene ningn dispositivo USB conectado (y quin los tiene hoy en da?) puede liberar esa IRQ para otros usos; suele ser la misma interrupcin que para uno de los slots PCI o ISA. 9.5. AUTOCONFIGURACIN DE LA BIOS

Este apartado comprende diversas opciones que se proporcionan para facilitar la configuracin de la BIOS, de las cuales las ms comunes son:

LOAD BIOS DEFAULTS: carga una serie de valores por defecto con poca o nula optimizacin, generalmente tiles para volver a una posicin de partida segura y resolver problemas observados al arrancar. LOAD SYSTEM DEFAULTS: una opcin cuyos efectos varan de unas BIOS a otras. En unos casos carga unos valores por defecto seguros (como LOAD

Manual de Lenguaje Ensamblador BIOS DEFAULTS), en otros carga unos valores ya optimizados para conseguir un rendimiento adecuado, o incluso puede servir para cargar la ltima serie de valores guardados por el usuario. LOAD TURBO DEFAULTS: carga los valores que estima ptimos para incrementar el rendimiento.

En cualquier caso, debe tenerse en cuenta que los cambios no suelen ser guardados automticamente, sino que deben confirmarse al salir de la BIOS. 9.6 Otras utilidades Las BIOS pueden hacer todava ms cosas, dependiendo del modelo en concreto; algunas de las ms usuales estn a continuacin.

Autodeteccin de discos duros IDE Esta opcin permite detectar los discos duros que estn conectados al sistema, as como su configuracin. Resulta muy til para simplificar la tarea de instalar un disco nuevo, as como cuando los datos del disco no estn completos o no parecen funcionar en nuestra BIOS.

Su uso es sencillsimo: se entra en este men y se va detectando cada uno de los cuatro posibles dispositivos IDE. Apunte las opciones que le aparezcan y pruebe a usarlas; recuerde usar el modo LBA para discos de ms de 528 MB. Tenga en cuenta que muchas veces slo por entrar en esta utilidad se alteran

Manual de Lenguaje Ensamblador automticamente los valores de configuracin del disco, as que despus de salir de ella compruebe si los cambios corresponden a los que quera realizar. Control por password Es decir, por una clave de acceso en forma de palabra secreta que slo conozca usted. Tenga en cuenta que si la olvida se ver en graves problemas, hasta el punto de tener que borrar toda la BIOS para poder volver a usar el ordenador, as que apntela en algn lugar seguro. Se suele poder seleccionar, bien en un men especfico o en las BIOS Features, entre tener que introducir la clave cada vez que se arranca el ordenador o slo cuando se van a cambiar datos de la BIOS. Lo primero es el mtodo ideal para seguridad, y adems es gratis; lo segundo es til cuando gente inexperta pero manazas tiene acceso al ordenador (por ejemplo, su sobrinito el tocalotodo). Formateo de disco duro a bajo nivel O, en ingls, HDD Low Level Format. Se trata de un formateo mucho ms intenso que el normal; no slo elimina los datos, sino que reorganiza la propia estructura del disco. Generalmente slo debe usarse cuando el disco est fallando muy a menudo o ha sido infectado por un virus tremendamente resistente, y aun as no resulta recomendable. Si ser duro, que realizarlo suele ser motivo de prdida de la garanta del disco duro! En fin, si se atreve, rmese con los datos de configuracin del disco (cilindros, cabezas...) y rece por no tener que interrumpirlo por nada del mundo, cortes de luz incluidos. Antivirus No, no crea que con esta opcin podr ahorrarse el comprar uno de esos programas antivirus tan tristemente necesarios en los PC. En realidad, lo nico que suele hacer esta opcin (que en ocasiones tiene un men propio y en otras se engloba bajo el Standard Setup, tal vez con el nombre de Virus Warning) es no permitir que se escriba sobre la tabla de particiones o el sector de arranque del disco duro, bien slo durante el arranque o en cualquier momento, dependiendo del modelo concreto de BIOS. La idea es impedir que un virus destroce el disco duro sin darle oportunidad a cargar un disquete de arranque con un antivirus para desinfectar el sistema; no impedir la infeccin, pero es una medida ms de seguridad y gratis. Por cierto, puede ser necesario deshabilitar esta opcin durante la instalacin del sistema operativo o al formatear el disco duro, no sea que la BIOS crea que se trata de un ataque viral.

Manual de Lenguaje Ensamblador 9.7 SALIR DE LA BIOS Pues es sencillo, pero revismoslo para los que no entiendan ingls en absoluto. Generalmente existen dos opciones:

Save and Exit Setup: o bien Write to CMOS and Exit o algo similar; pues eso, grabar los cambios y salir, con lo cual se reinicia el equipo. Debera pedirle confirmacin, en forma de "Y/N?" (Yes o No). Exit Without Saving: o Do Not Write to CMOS and Exit o Discard Changes and Exit o similar; lo contrario, salir sin grabar los cambios. Tambin debera pedir confirmacin.

9.8. ACTUALIZAR LA BIOS La BIOS maneja temas tan crticos como el soporte de uno u otro microprocesador; adems, como programa que es, no est exenta de fallos y se revisa peridicamente para eliminarlos o aadir nuevas funciones. Antiguamente, la nica forma de actualizar una BIOS era extraer el chip de BIOS y sustituirlo por otro, lo cual no se lo recomiendo a nadie, tanto por las posibles incompatibilidades como por lo delicado y caro de la operacin. Modernamente han aparecido BIOS que pueden modificarse con un simple programa software; se las denomina Flash-BIOS, y no son un invento desdeable. Lo que es ms, la existencia de una de estas BIOS o no debera ser argumento de peso a la hora de comprar una placa base, al menos entre los manitas informticos. Tenga en cuenta que mantener un registro de BIOS actualizadas es un servicio que slo ofrecen los grandes fabricantes de placas base... y aun as no siempre se puede encontrar la necesaria actualizacin. Vaya a Actualizar la BIOS para conocer los pasos concretos a seguir; eso s, le aviso de que deber asegurarse de que la operacin de actualizacin no se interrumpe por nada del mundo, as que nada de hacer multitarea, meterle prisa o tocar el teclado mientras se actualiza; son unos segundos, pero de importancia crtica. Adivina qu da del ao va a saltar la luz? Efectivamente, justo cuando est actualizando su BIOS.

9.9 LA BIOS Y LA PILA Como dijimos, la pila conserva los datos de la BIOS cuando el ordenador est apagado. Dura mucho (unos tres aos de media), pero al final se agota. Para cambiarla, apunte todos los datos de la BIOS, desconecte todo y sustityala por una igual, o bien por un paquete

Manual de Lenguaje Ensamblador externo de bateras que se conectan a un jumper (un microinterruptor) de la placa base; ambas cosas las debera encontrar en tiendas de electrnica. Despus conecte todo, arranque el ordenador, entre en la BIOS y reintroduzca todos los datos, ya que se habrn borrado. Se imagina si no tuviera una copia escrita qu aventura? A m me pas hace aos, y no me qued ms remedio que aprender sobre BIOS... bueno, no hay mal que por bien no venga. 9.10: CMO SALTARSE LA PASSWORD DE LA BIOS No, no se trata de hacer ilegalidades en ordenadores ajenos, se trata de saber qu hacer si sufre una repentina amnesia o si la BIOS trae una password ya introducida; por ejemplo, una BIOS con la que luch una vez tena como password por defecto "AMI", el nombre de su fabricante. Adems, en ordenadores de segunda mano pasa no pocas veces. Los mtodos son pocos; realmente slo uno, y muy radical: borrar la BIOS entera. Para ello existen tres formas:

Por software tipo "hacker": algunos programas se especializan en destrozar BIOS, y si tiene suerte quiz incluso le digan cul es la password sin tener que borrar la BIOS. Busque en los "bajos fondos" de Internet... y tenga cuidado con estos programas y con los posibles virus! Mediante un jumper en la placa base: en algunas, no todas, existe un jumper que al cerrarse (al conectarse ambas patillas), y tras unos minutos de espera, permite borrar la BIOS limpiamente. Desconectando la pila: drstico, brutal, pero absolutamente efectivo.

En fin, sea como sea, recuerde tener su copia en papel de la BIOS y de la password para no tener que llegar a estos extremos.

Manual de Lenguaje Ensamblador II.- EL LENGUAJE ENSAMBLADOR. 1.- UN EJEMPLO CLASICO. En esta parte se describe lo que es el lenguaje ensamblador, no al ensamblador o al proceso de ensamblado. Aqu se tratar todo lo concerniente con el lenguaje ensamblador y el conjunto de directivas del Microsoft Macro Assembler v4.0. Si bien esto puede resultar bastante extenso y complejo, aqu slo se describirn las instrucciones y directivas bsicas. Para comenzar veamos un pequeo ejemplo que ilustra el formato del programa fuente. Este ejemplo est completamente desarrollado en lenguaje ensamblador que usa servicios o funciones de MS-DOS (system calls) para imprimir el mensaje Hola mundo!! En pantalla. ; HOLA.ASM ; Programa clsico de ejemplo. Despliega una leyenda en pantalla. STACK SEGMENT STACK ; Segmento de pila DW 64 DUP (?) ; Define espacio en la pila STACK ENDS DATA SEGMENT ; Segmento de datos SALUDO DB "Hola mundo!!",13,10,"$" ; Cadena DATA ENDS CODE SEGMENT ; Segmento de Codigo ASSUME CS: CODE, DS: DATA, SS: STACK INICIO: ; Punto de entrada al programa MOV AX,DATA ; Pone direccion en AX MOV DS, AX ; Pone la direccion en los registros MOV DX, OFFSET SALUDO ; Obtiene direccion del mensaje MOV AH, 09H ; Funcion: Visualizar cadena INT 21H ; Servicio: Funciones alto nivel DOS MOV AH, 4CH ; Funcion: Terminar INT 21H CODE ENDS END INICIO ; Marca fin y define INICIO La descripcin del programa es como sigue: 1.- Las declaraciones SEGMENT y ENDS definen los segmentos a usar. 2.- La variable SALUDO en el segmento DATA, define la cadena a ser desplegada. El signo del dlar al final de la cadena (denominado centinela) es requerido por la funcin de visualizacin de la cadena de MS-DOS. La cadena incluye los cdigos para carriage-return y line-feed.

Manual de Lenguaje Ensamblador 3.- La etiqueta START instrucciones del programa. en el segmento de cdigo marca el inicio de las

4.- La declaracin DW en el segmento de pila define el espacio para ser usado por el stack del programa. 5.- La declaracin ASSUME indica que registros de segmento se asociarn con las etiquetas declaradas en las definiciones de segmentos. 6.- Las primeras dos instrucciones cargan la direccin del segmento de datos en el registro DS. Estas instrucciones no son necesarias para los segmentos de cdigo y stack puesto que la direccin del segmento de cdigo siempre es cargada en el registro CS y la direccin de la declaracin del stack segment es automticamente cargada en el registro SS. 7.- Las ltimas dos instrucciones del segmento CODE usa la funcin 4CH de MS-DOS para regresar el control al sistema operativo. Existen muchas otras formas de hacer esto, pero sta es la ms recomendada. 8.- La directiva END indica el final del cdigo fuente y especifica a START como punto de arranque. 2.- EL FORMATO DEL ENSAMBLADOR. De acuerdo a las convenciones y notacin seguidas en el manual del Microsoft Macro Assembler, y que usaremos nosotros tambin, tenemos: Notacin Negritas Itlicas ,,, letra chica Significado Comandos, smbolos y parmetros a ser usados como se muestra. Todo aquello que debe ser reemplazado por el usuario Indican un parmetro opcional Denota un parmetros que puede repetirse varias veces Separa dos valores mutuamente excluyentes Usada para ejemplos. Cdigo y lo que aparece en pantalla.

Cada programa en lenguaje ensamblador es creado a partir de un archivo fuente de cdigo ensamblador. Estos son archivos de texto que contienen todas las declaraciones de datos e instrucciones que componen al programa y que se agrupan en reas o secciones, cada una con un propsito especial. Las sentencias en ensamblador tienen la siguiente sintaxis:

Manual de Lenguaje Ensamblador [Nombre] mnemnico [operandos] [; comentarios] En cuanto a la estructura, todos los archivos fuente tienen la misma forma: cero o ms segmentos de programa seguidos por una directiva END. No hay una regla sobre la estructura u orden que deben seguir las diversas secciones o reas en la creacin del cdigo fuente de un programa en ensamblador. Sin embargo la mayora de los programas tiene un segmento de datos, un segmento de cdigo y un segmento de stack, los cuales pueden ser puestos en cualquier lugar. Para la definicin de datos y declaracin de instrucciones y operandos el MASM reconoce el conjunto de caracteres formado por letras maysculas, letras minsculas (excluyendo caracteres acentuados, , ), nmeros, y los smbolos: ? @_$:.[](){}+-/*&%!~ \ =# ;," La declaracin de nmeros requiere tener presente ciertas consideraciones. En el MASM un entero se refiere a un nmero entero: combinacin de dgitos hexadecimales, octales, decimales o binarios, ms una raz opcional. La raz se especifica con B, Q u O, D, o H. El ensamblador usar siempre la raz decimal por defecto, si se omite la especificacin de la raz (la cual se puede cambiar con la directiva .RADIX). As nosotros podemos especificar un entero de la siguiente manera: dgitos, digitosB, digitosQ o digitosO, digitosD, digitosH. Si una D o B aparecen al final de un nmero, stas siempre se considerarn un especificador de raz, e.g. 11B ser tratado como 112 (210), mientras que si se trata del nmero 11B16 debe introducirse como 11Bh. Para los nmeros reales tenemos al designador R, que slo puede ser usado con nmeros hexadecimales de 8, 16, 20 dgitos de la forma digitosR. Tambin puede usarse una de las directivas DD, DQ, y DT con el formato [+-] digitos.digitos [E [+-] dgitos]. Las cadenas de carcter y constantes alfanumricas son formadas como caracteres o "caracteres. Para referencias simblicas se utilizan cadenas especiales denominadas nombres. Los nombres son cadenas de caracteres que no se entrecomillan y que deben comenzar con una A..Z a..z _ $ @ los caracteres restantes pueden ser cualquiera de los permitidos, y solamente los 31 primeros caracteres son reconocidos. 3.- DIRECTIVAS. El MASM posee un conjunto de instrucciones que no pertenecen al lenguaje ensamblador propiamente sino que son instrucciones que nicamente son reconocidas por el ensamblador y que han sido agregadas para facilitar la tarea de ensablamblado, tanto para el programador como para el programa que lo lleva a cabo. Dichas instrucciones son denominadas directivas. En general, las directivas son usadas para especificar la organizacin de memoria, realizar ensamblado condicional, definir macros, entrada, salida, control de archivos, listados, cross-reference, direcciones e informacin acerca de la estructura de un

Manual de Lenguaje Ensamblador programa y las declaraciones de datos. El apndice D proporciona una lista completa de estas directivas. Conjunto de instrucciones: Dentro de las directivas ms importantes, tenemos las que establecen el conjunto de instrucciones a soportar para un microprocesador en especial: . 8086(def ault) . 8087(def ault) .186 .286c .289p .287 Activa las instrucciones para el 8086 y 8088 e inhibe las del 80186 y 80286. Activa instrucciones para el 8087 y desactiva las del 80287. Activa las instrucciones del 80186. Activa instrucciones del 80286 en modo no protegido. Activa instrucciones del 80286 en modo protegido y no protegido. Activa las instrucciones para el 80287

Declaracin de segmentos: En lo que respecta a la estructura del programa tenemos las directivas SEGMENT y ENDS que marcan el inicio y final de un segmento del programa. Un segmento de programa es una coleccin de instrucciones y/o datos cuyas direcciones son todas relativas para el mismo registro de segmento. Su sintaxis es: Nombre SEGMENT [alineacin] [combinacin] [clase] Nombre ENDS El nombre del segmento es dado por nombre, y debe ser nico. Segmentos con el mismo nombre se tratan como un mismo segmento. Las opciones alineacin, combinacin, y clase proporcionan informacin al LINK sobre cmo ajustar los segmentos. Para alineacin tenemos los siguientes valores: byte (usa cualquier byte de direccin), word (usa cualquier palabra de direccin, 2 bytes/word), para (usa direcciones de prrafos, 16 bytes/parrfo, deafult), y page (usa direcciones de pgina, 256 bytes/page). Combinacin define cmo se combinarn los segmentos con el mismo nombre. Puede asumir valores de: public (concatena todos los segmentos en uno solo), stack (igual al anterior, pero con direcciones relativas al registro SS, common (crea segmentos sobrepuestos colocando el inicio de todos en una misma direccin), memory (indica al LINK tratar los segmentos igual que MASM con public, at address (direccionamiento relativo a address). clase indica el tipo de segmento, sealados con cualquier nombre. Cabe sealar que en la definicin est permitido el anidar segmentos, pero no se permite de ninguna manera el sobreponerlos.

Manual de Lenguaje Ensamblador Fin de cdigo fuente: Otra directiva importante es la que indica el final de un mdulo. Al alcanzarla el ensamblador ignorar cualquier otra declaracin que siga a sta. Su sintaxis es: END [expresin] La opcin expresin iniciar. permite definir la direccin en la cual el programa

Asignacin de segmentos: La directiva ASSUME permite indicar cuales sern los valores por default que asimilan los registros de segmento. Existen dos formas de hacer esto: ASSUME registrosegmento:nombre,,, ASSUME NOTHING NOTHING cancela valores previos. Etiquetas: Las etiquetas son declaradas Nombre: Donde nombre constituye una cadena de caracteres. Declaracin de datos: Estos se declaran segn el tipo, mediante la regla [Nombre] directiva valor,,, donde directiva puede ser DB (bytes), DW (palabras), DD (palabra doble), DQ (palabra cudruplo), DT (diez bytes). Tambin pueden usarse las directivas LABEL (crea etiquetas de instrucciones o datos), EQU (crea smbolos de igualdad), y el smbolo = (asigna absolutos) para declarar smbolos. Estos tienen la siguiente sintaxis: Nombre = expresin Nombre EQU expresin Nombre LABEL tipo Donde tipo puede ser BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR. Declaracin de estructuras: Para la declaracin de estructuras de datos se emplea la directiva STRUC. Su sintaxis es: Nombre STRUC campos Nombre ENDS

Manual de Lenguaje Ensamblador 4.- CONJUNTO DE INSTRUCCIONES. El juego completo de instrucciones reconocidas por los procesadores intel 8086 a 80286, junto con los coprocesadores 8087 y 80287, se enlistan en el apndice E. Como puede verse en dicho apndice, la mayora de las instrucciones requieren algunos operandos o expresiones para trabajar, y lo cual es vlido tambin para las directivas. Los operandos representan valores, registros o localidades de memoria a ser accesadas de alguna manera. Las expresiones combinan operandos y operadores aritmticos y lgicos para calcular en valor o la direccin a acceder. Los operandos permitidos se enlistan a continuacin: Constantes: Pueden ser nmeros, cadenas o expresiones que representan un valor fijo. Por ejemplo, para cargar un registro con valor constante usaramos la instruccin MOV indicando el registro y el valor que cargaramos dicho registro. mov ax,9 mov al,c mov bx,65535/3 mov cx,count count slo ser vlido si este fue declarado con la directiva EQU. Directos: Aqu se debe especificar la direccin de memoria a accesar en la forma segmento:offset. mov ax,ss:0031h mov al,data:0 mov bx,DGROUP:block Relocalizables: Por medio de un smbolo asociado a una direccin de memoria y que puede ser usado tambin para llamados. mov ax, value call main mov al,OFFSET dgroup:tabla mov bx, count count slo ser vlido si fue declarado con la directiva DW. Contador de localizacin: Usado para indicar la actual localizacin en el actual segmento durante el ensamblado. Representado con el smbolo $ y tambin conocido como centinela. help DB OPCIONES,13,10 F1 DB F1 salva pantalla,13,10 .

Manual de Lenguaje Ensamblador . . F10 DB F10 DISTANCIA = $-help

exit,13,10,$

Registros: Cuando se hace referencia a cualquiera de los registros de propsito general, apuntadores, ndices, o de segmento. Basados: Un operador basado representa una direccin de memoria relativa a uno de los registros de base (BP o BX). Su sintaxis es: Desplazamiento[BP] Desplazamiento [BX] [Desplazamiento][BP] [BP+desplazamiento] [BP].desplazamiento [BP]+desplazamiento En cada caso la direccin efectiva es la suma del desplazamiento y el contenido del registro. mov mov mov mov ax,[BP] al,[bx] bx,12[bx] bx,fred[bp]

Indexado: Un operador indexado representa una direccin de memoria relativa a uno de los registros ndice (SI o DI). Su sintaxis es: desplazamiento[DI] desplazamiento[SI] [desplazamiento][DI] [DI+desplazamiento] [DI].desplazamiento [DI]+desplazamiento En cada caso la direccin efectiva es la suma del desplazamiento y el contenido del registro. mov mov mov mov ax,[si] al,[di] bx,12[di] bx,fred[si]

Base-indexados: Un operador base-indexado representa una direccin de memoria relativa a la combinacin de los registros de base e ndice. Su sintaxis es:

Manual de Lenguaje Ensamblador desplazamiento[BP][SI] desplazamiento[BX][DI] desplazamiento[BX][SI] desplazamiento[BP][DI] [desplazamiento][BP][DI] [BP+DI+desplazamiento] [BP+DI].desplazamiento [DI]+desplazamiento+[BP] en cada caso la direccin efectiva es la suma del desplazamiento y el contenido del registro. mov mov mov mov ax,[BP][si] al,[bx+di] bx,12[bp+di] bx,fred[bx][si]

Estructuras: Su sintaxis es variable.campo. Variable es el nombre con que se declar la estructura, y campo es el nombre del campo dentro de la estructura. date STRUC mes DW ? dia DW ? aa DW ? date ENDS actual mov mov date ja,01,84 ax,actual.dia actual.aa, 85

Operadores y expresiones: Se cuenta con los siguientes operadores: Aritmticos: expresin1 * expresin2 expresin1 / expresin2 expresin1 MOD expresin2 expresin1 + expresin2 expresin1 - expresin2 + expresin - expresin De corrimiento:

Manual de Lenguaje Ensamblador expresin1 SHR contador expresin1 SHL contador Relacionales: expresin1 expresin1 expresin1 expresin1 expresin1 expresin1 De bit: NOT expresin expresin1 AND expresin2 expresin1 OR expresin2 expresin1 XOR expresin2 De ndice: [expresin1] [expresin2] ejemplos: mov mov mov cx,dgroup:1 De apuntador: tipo PTR expresin tipo puede ser BYTE 1, WORD 2, DWORD 4, QWORD 8, TBYTE 10, NEAR 0FFFFh, FAR 0FFFEh. Ejemplos: call FAR PTR subrout3 mov BYTE ptr [array], 1 add al, BYTE ptr [full_word] De nombre de campo: estructura.campo ejemplos: inc month.day mov time.min,0 al, string[3] string[last],al cx,dgroup:[1] ; igual a mov EQ expresin2 NE expresin2 LT expresin2 LE expresin2 GT expresin2 GE expresin2

Manual de Lenguaje Ensamblador mov De propsito especial: OFFSET expresin: Regresa el desplazamiento del operando mov mov bx, OFFSET dgroup:array bx, offset subrout3 [bx].dest

SHORT etiqueta: Para un salto de menos de 128 bytes jmp SHORT loop

LENGTH variable: Regresa el nmero de elementos de variable segn su tipo mov cx,length array

SIZE variable: Regresa el tamao en bytes alojados para variable. mov cx,size array

SEG expresin: Regresa el valor del segmento para expresin mov ax, SEG saludo

5.- MACROS Y PROCEDIMIENTOS. La manera ms fcil de construir el programa en mdulos, es dividirlo en dos o ms partes. Para esto, es necesario que datos, smbolos, y dems valores de un mdulo sean reconocidos por el otro u otros mdulos. Para este tipo de declaraciones globales existen dos directivas: PUBLIC nombre,,, que hace la variable, etiqueta o smbolo absoluto disponible para todos los programas. EXTRN nombre:tipo,,, que especifica una variable, etiqueta o smbolo externos identificados por nombre y tipo (que puede ser BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR, o ABS, ste ltimo para nmeros absolutos). El siguiente ejemplo ilustra el uso de las directivas. El primer listado corresponde al mdulo principal, mientras que el segundo al mdulo que contiene una rutina. Ambos mdulos son archivos que se editan por separado, se ensamblan por separado, pero se ligan juntos. MODULO PRINCIPAL: MAIN.ASM

Manual de Lenguaje Ensamblador NAME PUBLIC EXTRN stack stack data data code start: mov ax,data mov ds,ax jmp print exit: code mov ah,4ch int 21h ENDS END start ; carga localizacion del segmento ; en el registro DS ; va a PRINT en el otro modulo main exit print:near

SEGMENT word stack 'STACK' DW 64 DUP(?) ENDS SEGMENT ENDS word public 'DATA'

SEGMENT byte public 'CODE' ASSUME cs:code, ds:data

SUBMODULO: TASK.ASM NAME task PUBLIC print EXTRN exit:near data entrada salida data code print: mov mov mov mov mov mov int mov mov int ah,06h ; Funcion para borrar pantalla al,0 ; todas las lineas cx,0 ; de 0,0 dh,24d dl,79d bh,0 ; atributo en lineas vacias 10h ; Servicio de e/s video dx, OFFSET entrada ah,09h 21h SEGMENT word public 'DATA' DB "Entrando a un submodulo....",13,10,"$" DB ".......saliendo del submodulo.",01,07,13,10,"$" ENDS SEGMENT byte public 'CODE' ASSUME cs:code, ds:data

Manual de Lenguaje Ensamblador mov int jmp ENDS END dx, OFFSET salida 21h exit ; Regresa al otro modulo

code

La declaracin de macros se hace a travs de ENDM. Su sintaxis es:

las directivas MACRO y

nombre MACRO [parmetros,,,] declaraciones ENDM Los parmetros son los valores que se substituirn en la macro cada vez que se haga referencia a sta. Para la definicin de procedimientos se emplean las directivas PROC y ENDP. Su sintaxis es: nombre PROC [distancia] sentencias nombre ENDP La distancia, que puede ser NEAR (default) o FAR permiten indicar el tipo de acciones a realizar en brincos y llamados a subrutinas. nombre se puede usar como direccin en llamados o brincos. 6.- INTERRUPCIONES. Como se mencion anteriormente la PC esta constituida lgicamente por su BIOS y sistema operativo. La mayora de las rutinas que controlan al computador estn grabadas en el ROM del BIOS, aunque muchas rutinas son establecidas por el sistema operativo y se cargan en RAM al momento de encender al computador. Estas rutinas son denominadas interrupciones y son activadas mediante la instruccin: INT nmero. Una interrupcin es una operacin que invoca la ejecucin de una rutina especfica que suspende la ejecucin del programa que la llam, de tal manera que el sistema toma control del computador colocando en el stack el contenido de los registros CS e IP. El programa suspendido vuelve a activarse cuando termina la ejecucin de la interrupcin y son restablecidos los registros salvados. Existen dos razones para ejecutar una interrupcin: (1) intencionalmente como peticin para la entrada o salida de datos de un dispositivo, y (2) un error serio y no intencional, como sobreflujo o divisin por cero. El operando de una interrupcin indica cal es la rutina a activar. La direccin de la rutina es localizada por medio de una tabla que el sistema mantiene a partir de la direccin 0000:0000h. Existen 256 entradas de 4 bytes de longitud, y cada interrupcin proporciona varias funciones. Las interrupciones de

Manual de Lenguaje Ensamblador 00h a 1Fh correponden al BIOS y de 20h a FFh son del DOS y BASIC. El apndice F proporciona una lista de las interrupciones para equipo XT.

III.- CREACION Y DEPURACION DE PROGRAMAS EN LENGUAJE ENSAMBLADOR 1.- EDICION. Los archivos fuente de cdigo ensamblador deben estar en formato ASCII standard. Para esto puede usarse cualquier editor que permita crear archivos sin formato, e.g. Edlin, Edit, Write, El editor del Turbo Pascal, Works, Word, WordStar, etctera. Las declaraciones pueden ser introducidas en maysculas y/o minsculas. Una buena prctica de programacin es poner todas las palabras reservadas (directivas e instrucciones) en maysculas y todo lo del usuario en minsculas para fines de facilidad de lectura del cdigo. Las sentencias pueden comenzar en cualquier columna, no pueden tener ms de 128 caracteres, no se permiten lneas mltiples ni cdigos de control, y cada lnea debe ser terminada con una combinacin de line-feed y carriage-return. Los comentarios se declaran con ; y terminan al final de la lnea. 2.- ENSAMBLADO. El ensamblado se lleva a cabo invocando al MASM. Este puede ser invocado, usando una lnea de comando, de la siguiente manera:

Manual de Lenguaje Ensamblador MASM archivo [,[objeto][,[listado][,[cross]]]]][opciones][;] donde: Archi Corresponde al programa fuente. Por default se toma la extensin .ASM. Objet Es el nombre para el archivo objeto. o Lista Nombre del archivo de listado de ensamblado. do Cross Es un archivo de referencias cruzadas. OpcionesPueden ser: /A: escribe los segmentos en orden alfabtico /S: escribe los segmentos en orden del fuente /Bnum: fija buffer de tamao num /C: especifica un archivo de referencias cruzadas /L: especifica un listado de ensamble /D: crea listado del paso 1 /Dsym: define un smbolo que puede usarse en el ensamble /Ipath: fija path para bscar archivos a incluir /ML: mantiene sensitividad de letras (mays./mins) en nombres /MX: mantiene sensitividad en nombre publicos y externos /MU: convierte nombres a maysculas /N: suprime tablas en listados /P: checa por cdigo impuro /R: crea cdigo para instrucciones de punto flotante /E: crea cdigo para emular instrucciones de punto flotante /T: suprime mensajes de ensable exitoso /V: despliega estadsticas adicionales en pantalla /X: incluir condicionales falsos en pantalla /Z: despliega lneas de error en pantalla si el ; al final se omite es necesario poner todas las comas que se indican. Si no se quiere poner algn valor basta con dejar la coma.

Manual de Lenguaje Ensamblador La otra forma de invocar al ensamblador es slo tecleando MASM y respondiendo a la informacin que se solicita. Para omitir algn valor slo basta teclear ENTER si dar ningn valor. 3.- LINK. De la misma forma que el ensamblado, la fase de liga se lleva a cabo con el LINK. Este puede ser invocado de la misma forma que el MASM. Los parmetros que este requiere son: LINK objeto [,[ejecutable][,[mapa][,[librera]]]]][opciones][;] donde: objeto ejecutab le mapa librera Es el nombre para el archivo .OBJ Nombre del archivo .EXE Nombre del archivo mapa Nombre del archivo biblioteca de rutinas

opciones Pueden ser: /HELP /PAUSE /EXEPACK /MAP /LINENUMBERS /NOIGNORECASE / NODEFAULTLIBRARYS EARCH /STACK:size / CPARMAXALLOC:nme ro /HIGH /DSALLOCATE muestra lista de opciones pausa en el proceso empaca archivo ejecutable crea mapa se smbolos pblicos copia nmero de lineas al mapa mantiene sensitividad en nombres no usa bibliotecas por default fija el tamao del stack a usar fija alojacin mxima de espacio fija la direccin de carga ms alta aloja grupo de datos

Manual de Lenguaje Ensamblador / ignora asociaciones para NOGROUPASSOCIATIO direcciones N / asigan nuevo nmero a la INT OVERLAYINTERRUPT:n 03Fh mero procesa un nmero de /SEGMENTS:nmero segmentos sigue la convencin de orden /DOSSEG de DOS 4.- EJECUCION. Para la ejecucin del programa simplemente basta teclear su nombre en el prompt de MS-DOS y teclear ENTER. Con esto el programa ser cargado en memoria y el sistema proceder a ejecutarlo. El proceso completo para poder crear un programa ejecutable con el Microsoft Macro Assembler se muestra abajo. Edicin del Archivo Creacin de un archivo sin formato (ASCII) .asm Ensamble MASM programa .obj Liga LINK programa .exe Ejecucin programa

y lo que se vera en pantalla sera lo siguiente: C:\DATA\PROGRAMS\ASM>masm main Microsoft (R) Macro Assembler Version 4.00 Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved. Object filename [main.OBJ]: Source listing [NUL.LST]: Cross-reference [NUL.CRF]: 50966 Bytes symbol space free 0 Warning Errors 0 Severe Errors C:\DATA\PROGRAMS\ASM>masm task Microsoft (R) Macro Assembler Version 4.00 Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved.

Manual de Lenguaje Ensamblador Object filename [task.OBJ]: Source listing [NUL.LST]: Cross-reference [NUL.CRF]: 51034 Bytes symbol space free 0 Warning Errors 0 Severe Errors C:\DATA\PROGRAMS\ASM>link main+task Microsoft (R) 8086 Object Linker Version 3.05 Copyright (C) Microsoft Corp 1983, 1984, 1985. All rights reserved. Run File [MAIN.EXE]: List File [NUL.MAP]: Libraries [.LIB]: C:\DATA\PROGRAMS\ASM>main Entrando a un submodulo.... .......saliendo del submodulo. C:\DATA\PROGRAMS\ASM> 5.- DEPURACION. Para la depuracin de un programa en ensamblador tenemos disponibles dos herramientas. Por un lado tenemos el debuger que nos proporciona MS-DOS (DEBUG.EXE) y por otro lado tenemos el que nos proporciona Microsoft (SYMDEB.EXE). Este ltimo trabaja igual que el de MS-DOS pero nos proporciona muchas ventajas ms. Una de ellas es la facilidad de desplegar el cdigo fuente correspondiente a la instruccin que se esta ejecutando (si el programa ejecutable fue ensamblado o compilado con un ensamblador o compilador compatible), nos permite ejecutar comandos del S.O. y nos permite obtener informacin de las interrupciones de manera simblica. 5.1.- Uso de DEBUG de DOS I DOS y la cnsola de Windows incluyen un programa llamado DEBUG. La palabra "debug" podramos traducirla por depurador, aunque realmente sta no sea su traduccin literal. Supuestamente, un depurador est destinado a la eliminacin de "bichos", cucarachas en nuestros programas. Es una especie de insecticida. En terminos de programacin, podemos decir que se trata de un programa para la localizacin de errores que afectan sensiblemente el funcionamiento de nuestros programas.

Manual de Lenguaje Ensamblador Con el depurador podemos revisar paso por paso la ejecucin de nuestro programa, revisar como va modificndose el contenido de los registros hasta ubicar donde est el "bicho" y aplastarlo. Imagino que el nombre se debe a que los primeros desperfectos en las primeras mquinas de cmputo electrnicas se deba generalmente a la presencia de cucarachas u otros insectos en los circuitos de tubos. El debug de DOS permite, entre otras cosas, editar archivos ejecutables y hasta escribir programas en lenguaje ensamblador. 5.2.- Uso de DEBUG II: Trazar un Programa DEBUG, como muchos otros programas auxiliares de la programacin, trabaja con el sistema hexadecimal. Para ejecutar DEBUG escribimos DEBUG en el puntero de DOS o en el cuadro de ejecucin (Inicio-Ejecutar) de Windows. Aparecer slo un guin que es el apuntador del DEBUG. Las diversas operaciones del DEBUG se indican con letras: A: assemble (ensamblar) C: compare (comparar) D: display (desplegar) E: enter (ingresar) F: full (llenar) G: go (ir) H: Hexadecimal I: in (entrada) L: load (cargar) M: move (mover) N: name (nombrar) O: out (salida) P: proceed (proceder) Q: quit (quitar) R: register (registro) S: search (buscar) trace (trazar o T: rastrear) unassemble U: (desensamblar) W: write (escribir) Ahora no las usaremos todas. Antes de escribir un programa con DEBUG, primero revisemos el que escribimos al comienzo. Cargamos el programa en el DEBUG: C:\tasm\works\primer>DEBUG primer.exe

Manual de Lenguaje Ensamblador Ahora ingresamos la orden T, y obtendremos: -t AX=0E00 BX=0000 CX=0020 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=0DEF ES=0DEF SS=0E01 CS=0DFF IP=0003 NV UP EI PL NZ NA PO NC 0DFF:0003 8ED8 MOV DS,AX Se trata de la segunda instruccin de nuestro programa. La instruccin MOV es una instruccin de asignacin, parecida al operador "=" de C. Lo que hace es mover el contenido del segundo operando, aqu AX, que para el momento tiene la direccin del segmento de datos, al primer operando, DS. Antes de la ejecucin de la instruccin DS=0DEF y AX=0E00; son valores hexadecimales. Ingresemos de nuevo t: -t AX=0E00 BX=0000 CX=0020 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=0E00 ES=0DEF SS=0E01 CS=0DFF IP=0005 NV UP EI PL NZ NA PO NC 0DFF:0005 BA0400 MOV DX,0004 Ahora DS=0E00. Se ha movido lo que estaba en AX a DS. La siguiente instruccin mueve a DX la direccin de nuestra cadena. Habamos escrito "LEA DX, string"; DEBUG lo ha interpretado como "mover a DX lo que est 4 bytes por encima del inicio del segmento de datos". Si se quiere verificar escribimos: D DS:4, desplegar lo que est 4 bytes despus del inicio del segmento de datos: -d ds:4 0E00:0000 gente!$ 0E00:0010 ....>+.....=;... 0E00:0020 s....S&..&:.s... 48 6F 6C 61-20 67 65 6E 74 65 21 24 Hola

C7 06 0E 96 3E 2B 2E C7-06 10 96 3D 3B E8 83 09 73 13 B8 FF FF 53 26 8B-1D 26 3A 0F 73 03 B8 02

En 0E00+4 vemos el cdigo hexadecimal correspondiente a nuestra cadena, que en la columna derecha podemos ver en ASCII. Podemos ver que el

Manual de Lenguaje Ensamblador smbolo "$", que originalmente habamos introducido como 36, y que en la columna del medio aparece en hexadecimal: 24. Sigamos trazando: -t AX=0E00 BX=0000 CX=0020 DX=0004 SP=0040 BP=0000 SI=0000 DI=0000 DS=0E00 ES=0DEF SS=0E01 CS=0DFF IP=0008 NV UP EI PL NZ NA PO NC 0DFF:0008 B409 MOV AH,09 Ahora moveremos a la parte superior de AX un nueve: -t AX=0900 BX=0000 CX=0020 DX=0004 SP=0040 BP=0000 SI=0000 DI=0000 DS=0E00 ES=0DEF SS=0E01 CS=0DFF IP=000A NV UP EI PL NZ NA PO NC 0DFF:000A CD21 INT 21 Vemos ahora que "AX=0900", que confirma que hemos movido 9 a la parte alta de AX. Se va a ejecutar la interrupcin 21h, servicio 9; recurdese que anteriormente habamos escrito "int 33". DEBUG trabaja en hexadecimal, as que despliega la versin hexadecimal de lo que escribamos. Para trazar por encima de la interrupcin, no es bueno usar T, ya que esto nos llevar a la rutina de la interrupcin. As que mejor ejecutamos P: -p Hola gente! AX=0924 BX=0000 CX=0020 DX=0004 SP=0040 BP=0000 SI=0000 DI=0000 DS=0E00 ES=0DEF SS=0E01 CS=0DFF IP=000C NV UP EI PL NZ NA PO NC 0DFF:000C B410 MOV AH,10 Esto despliega nuestra cadena en la cnsola. Observa que todos los registros se han mantenido iguales despus de la interrupcin, excepto AX; vemos que en la parte baja de AX, que es AL, aparece un 24h. Se trata del caracter "$". Quiere decir que el servicio 9 de la interrupcin 21h usa el registro AL para revisar la cadena. Ahora moveremos 16 a AH. DEBUG lo presenta como "MOV AH, 10"; 10h = 16 decimal.

Manual de Lenguaje Ensamblador Hacemos T: AX=1024 BX=0000 CX=0020 DX=0004 SP=0040 BP=0000 SI=0000 DI=0000 DS=0E00 ES=0DEF SS=0E01 CS=0DFF IP=000E NV UP EI PL NZ NA PO NC 0DFF:000E CD16 INT 16 Se va a ejecutar el servicio 16 o 10h de la interrupcin 22 o 16h. Lo que hace este servicio es esperar a que el usuario pulse un tecla, cuyo cdigo devuelve en AH el cdigo de rastreo y en AL el cdigo de la tecla. Para teclas de funcin extendida (F1 - F12) ms importante es el cdigo de rastreo, ya que como cdigo de tecla se pasar 00, para las teclas F1-F12, E0h para para otras teclas de control como Inicio o RePag. Hacemos P y se ejecuta nuestra pausa; pulsamos cualquier tecla, en mi caso "enter": -p AX=1C0D BX=0000 CX=0020 DX=0004 SP=0040 BP=0000 SI=0000 DI=0000 DS=0E00 ES=0DEF SS=0E01 CS=0DFF IP=0010 NV UP EI PL NZ NA PO NC 0DFF:0010 B80000 MOV AX,0000 Cdigo de rastreo en AH=1Ch y cdigo de tecla en AL=0Dh. Ahora vamos a salir. Devolvemos el valor FALSE (=0) en AX a DOS. Un simple gesto de educacin. AX=0000 BX=0000 CX=0020 DX=0004 SP=0040 BP=0000 SI=0000 DI=0000 DS=0E00 ES=0DEF SS=0E01 CS=0DFF IP=0013 NV UP EI PL NZ NA PO NC 0DFF:0013 CB RETF Por ltimo regresamos a DOS. La instruccin RETF es una operacin ceroaria (sin operandos) que significa RETURN FAR, regresar lejos. Recordemos que hemos declarado nuestro procedimiento as: main proc far

"main" es el nombre del procedimiento; proc es una directiva que indica inicio de una rutina o funcin (en ensamblador se llaman procedimientos a las funciones) y far indica que el procedimiento puede ser accedido desde otros segmentos. La instruccin RETF nos saca del procedimiento a la lnea de rdenes.

Manual de Lenguaje Ensamblador Hay otras formas ms limpias de salir de un programa, pero con esta basta por ahora. Nota tambin que a la derecha de cada instruccin aparece la direccin en memoria, en sistema hexadecimal, de la instruccin, y luego es seguida por otra cifra en hexadecimal. sta ltima es la versin en hexadecimal del cdigo de operacin de la instruccin. Si no fuera por el sistema hexadecimal, ah apareceran una serie de unos y ceros. Con DEBUG tambin podemos obtener el cdigo fuente en ensamblador de un fichero ejecutable. Esto se hace cargando el fichero y ejecutando la orden U, seguida por la direccin a partir de la cual queremos que se inicie el desensamblado y el nmero de lneas a desensablar: -u cs:00 0CE2:0000 B8E30C MOV AX,0CE3 0CE2:0003 8ED8 MOV DS,AX 0CE2:0005 BA0400 MOV DX,0004 2:0008 B409 MOV AH,09 0CE2:000A CD21 0CE2:000C B410 0CE2:000E CD16 0CE2:0010 B80000 0CE2:0013 CB INT 21 MOV AH,10 INT 16 MOV AX,0000 RETF

Tememos aqu un desensamblado de nuestro cdigo. Tambin podemos obtener este desensamblado en un archivo de texto aparte: DEBUG primer.exeprim.asm Esta orden volcar en prim.asm un desensablado de los primeros 20 (14h) bytes de primer.exe, que podemos revisar con un editor. Podramos escribir un fichero disasm.bat: cls @echo off @echo U CS:00 13>t_$ @echo.>>t_$ @echo Q>>t_$ 2echo.>>t_$ @echo Desensamblando.... DEBUG %1.exe%1_.asm EDIT %1_.asm Luego ejecutamos: disasm primer

Manual de Lenguaje Ensamblador y ya! Podramos mejorarlo para que desensamble exactamente las instruccciones del segmento de cdigo; e incluso hacer que nuestro .BAT cambie algunos valores hexadecimales en el .EXE, pero no es este el lugar para explicarlo. 5.3.- Uso de DEBUG III: Escribir un Programa Escribamos ahora un programa con el DEBUG. Antes una observacin sobre el formato de los ejecutables en DOS. Existen dos formatos: .COM y .EXE. El primero, .COM, es el formato original. En este formato, todo, cdigo y datos, es puesto en un nico segmento cuyo tamao no debe exeder los 64KB. En el formato .EXE, que es posterior, se reserva un segmento para datos, uno para cdigo y uno para la pila. Nuestro programa fue escrito en formato .EXE. Con el DEBUG se pueden escribir programas en formato .COM, que son bastante ms pequeos. El programa debe comenzar a ejecutarse en la direccin 256 [100h], ya que los ejecutables de DOS reservan los primeros 256 bytes para colocar ah una estructura de datos conocida como PSP, cuando es cargado en la memoria. El PSP (Program Segment Prefije: Prefijo de Segmento del Programa) contine informacin que ser utilizada por el cargador de DOS. As que comenzamos escribiendo A 100 [enter] -a 100 0DAB:0100 jmp 108 0DAB:0102 db "hola$" 0DAB:0107 nop 0DAB:0108 mov dx,102 0DAB:010B mov ah,9 0DAB:010D int 21 0DAB:010F mov ah,10 0DAB:0111 int 16 0DAB:0113 int 20 0DAB:011