Sei sulla pagina 1di 100

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)

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.exe<U CS:00 14>prim.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<t_$>%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:0115 La primera instruccin ,"jmp 108", es saltar a la localidad 108. Necesitamos un espacio para nuestra cadena. Como no sabemos el tamao del programa y no podemos determinar al comienzo donde estar la cadena si la ponemos al final del programa, la ponemos al comienzo, y para evitar que el programa comience a ejecutarse en la cadena (lo que dara error) le pasamos por encima. La instruccin jmp 108 tiene dos bytes, reservamos 6 bytes para la cadena. Nos sobra un byte, as que escribimos "nop" en 107, un operador ceroario que significa No operacin. Vemos que la direccin de la cadena es

Manual de Lenguaje Ensamblador 102, as que ponemos este valor en DX; luego llamamos al servicio 9 (mov ah, 9) de la interrupcin 21h (int 21) para desplegar la cadena. Luego ejecutamos el servicio 10h de la interrupcin 16h (que detiene la ejecucin del programa) y por ltimo regresamos a DOS con la interrupcin 20h. Pulsamos dos veces enter para salir de la orden A. Podemos probar de inmediato nuestro programa con la orden G: -g hola Debes pulsar ENTER para salir del programa. Se desplegar: "El programa ha finalizado con normalidad" Ahora debemos escribir nuestro programa a un archivo .COM en disco. Para ello empleamos la orden W [write]. Para realizar esta escritura correctamente, primero elegimos un nombre para el programa, como pr.com. La extensin debe ser .COM, porque W no puede crear ejecutables con formato .EXE; la orden es: -n pr.com

Tambin debemos especificar el tamao de nuestro ejecutable. W crear un archivo con el tamao indicado en el registro CX; as que deberamos poner en CX el tamao de nuestro ejecutable empleando la orden R: -r cx CX 0000 :15 Finalmente, escribimos el archivo en disco: -w Escribiendo 00015 bytes Eso es todo. Luego lo ejecutamos. Salimos de DEBUG: -q y ejectamos pr.com: hola

Manual de Lenguaje Ensamblador Todo bien? Observa el tamao del archivo: 21 bytes (15h = 21 decimal) 6.- LA UTILERIA EXE2BIN Y LOS ARCHIVOS .EXE Y .COM . Para MS-DOS slo existen dos tipo de archivos ejecutables los .COM y .EXE. Ambos archivos difieren en algunas cosas. Primero, las ventajas de los .EXE son dobles, nos permiten tener archivos reubicables y el uso de hasta cuatro segmentos (STACK, DATA, EXTRA y CODE) de hasta 64KB cada uno. Un archivo .COM slo puede tener un segmento de 64KB, en el que se tiene tanto cdigo como pila, y datos. La desventaja de los .EXE es que agregan 512 bytes como cabecera con informacin para la reubicacin del cdigo. Un .COM no es reubicable, siempre inicia en la direccin 0100H. Si nuestro programa no es muy grande 64KB son mas que suficientes. Por lo que conviene crearlo como .COM, para esto se cuenta con la utilera EXE2BIN.EXE que nos proporciona el sistema operativo. y que nos permite crear .COM a partir de .EXE . Las restricciones para esto son las suguientes: el archivo a convertir no debe estar empacado, no debe tener segmento de stack, debe tener slo segmento de cdigo y su tamao debe ser menor a 64KB. Resumen del DEBUG Uso del DEBUG. Ingreso: Tipeamos la instruccin que se menciona seguidamente desde el prompt. C: \ DEBUG > Despus de dar enter aparecer un guin

C:\>debug Ya estamos posicionados en el DEBUG y ste est preparado para recibir instrucciones en ASSEMBLER. Ejemplo 1: Ver las instrucciones permitidas en el ASSEMBLER bsico. Tipeamos lo siguiente: -?? Y nos mostrar la informacin que sigue. Tipee y compruebe Ensamblar Comparar Volcar A [direccin] C direccin de intervalo D [intervalo]

Manual de Lenguaje Ensamblador escribir llenar ir hex entrada cargar mover nombre salida proceder salir registrar buscar seguimiento desensamblar escribir asignar memoria expandida desasignar memoria expandida asignar pginas de memoria expandida mostrar estado de la memoria expandida E direccin [lista] F lista de intervalos G [=direccin] [direcciones] H valor1 valor2 I puerto L [direccin] [unidad] [primer_sector] [nmero] M direccin de intervalo N [nombre_ruta] [lista_argumentos] O byte de puerto P [=direccin] [nmero] Q R [registrar] S lista de intervalos T [=direccin] [valor] U [intervalo] W [direccin] [unidad] [primer_sector] [nmero] XA [#pginas] XD [identificador] XM [Lpgina] [Ppgina] [identificador] XS

Note que al terminar aparece el guin que nos indica que el DEBUG tiene nuevamente el control de las operaciones, con lo cual Uds. podrn ingresar ms comandos Cada una de la instrucciones que se mostraron anteriormente se irn explicando a lo largo de este apunte, donde aplicaremos un ejercicio especfico para cada una de ellas incrementando las posibilidades, desde las ms simples hasta las ms complejas, para perfeccionar nuestro dominio de la programacin. Ejemplo 2: Ver los registros. Este ejercicio nos permite que miremos el valor de varios registros y del registro de estado de la ALU (STATUS REGISTER). Para eso tipeamos: -r

Manual de Lenguaje Ensamblador Y no muestra lo que sigue: AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 8936C7DE MOV [DEC7],SI DS:DEC7=0000 El significado de los diferentes registros se da en la tabla siguiente. RE F AX Nombre Acumulador Que es lo que hace Almacena el resultado de operaciones matemticas; lectura / escritura (I/O) dede/hacia los puertos que estn conectados con los perifricos; almacena tambin un rea de memoria temporal. Alacena direcciones o valores y puede interactuar con el Acumulador. Utilizados para la ejecucin de LOOPS y puede ser incrementado o decrementado segn la instruccin que sea necesaria De acuerdo a la estructura de computadores analizada por nosotros corresponde al MDR (MEMORY DATA RGISTER) y es el paso intermedio para el ingreso de datos. Es un puntero que nos indica la direccin donde se encuentran los datos. Igual que el anterior pero apuntando a una direccin mayor. Indica donde se encuentra el STACK. Indica donde esta almacenado el cdigo para la ejecucin del programa. Registro complementario para

BX

Registro Base

CX

Registro Contador

DX

Registro de Datos

DS

ES

Registro segmento datos Segmento para datos

de de extra

SS CS

Registro de segmento de pila Registro de segmento cdigo Puntero del

BP

Manual de Lenguaje Ensamblador SI STACK no modificar el SS. Registro de Indice Alacena una direccin que nos de segmento indica donde se encuentra el vector de datos. Indice destino Contiene una direccin donde se copiara el vector de datos indicado por SI. Puntero de Pila (STACK POINTER) Permite saber donde se encuentra el ltimo dato almacenado en el STACK. Siempre debe ser mayor o igual al SS o BP Apuntador de la (INSTRUCTION POINTER) siguiente Tambin llamado PROGRAM instruccin COUNTER. Tiene almacenada la direccin de la prxima instruccin a ser ejecutada.

DI

SP

IP

Ahora pasemos al registro bandera o STATUS REGISTER, que nos da el resultado de la actuacin de la ALU Seal Overflo w Directio n Interrup ts Sign Zero Auxiliary Carr y Parity Carry RE F NV UP DI PL NZ NA No hay Hacia adelante Desactivadas Valor positivo No es cero No hay acarreo OV DN EI NG ZR AC Funcin RE F Hay Hacia atrs Desactivadas Valor negativo Es cero Hay acarreo Funcin

PO NC

Paridad impar No hay acarreo

PE CY

Paridad Par Se produjo acarreo

El comando r (registro) nos permite interactuar con los registros de la CPU, posibilitando modificar sus contenidos. Cuando tipeamos r sin ningn otro parmetro nos muestra todos los registros con sus respectivos contenidos, pero si agregamos un parmetro nos va a mostrar solo el contenido del registro que nosotros mencionamos:

Manual de Lenguaje Ensamblador -r bx BX 0000 : Como podemos observar no nos devuelve el signo sino que ahora nos muestra : para que ingresemos el valor que queremos que sea almacenado en el registro BX. En el ejemplo vemos que BX tiene un valor 0000. Si ingresamos 5555 en : tendremos: -r bx BX 0000 :5555 -r AX=0000 BX=5555 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 8936C7DE MOV [DEC7],SI DS:DEC7=0000 En negrilla vemos que el registro BX qued modificado con el nuevo valor tipeado. Suma y Resta. Ejemplo S1: Se pide sumar dos valores (200 y FFF) . Vamos a ingresar las siguientes instrucciones en el orden como se dan. Los nmeros indicados - a 100 Indica que se debe comenzar a ingresar datos a partir de la posicin 100 MOV AX, 200 Mover 200 al acumulador (AX) MOV BX, FFF Mover FFF al Registro Base (BX) ADD AX, BX Sumar BX a AX INT 20 Dar enter Aparece el signo del DEBUG que tiene el control.

XXXX: 0100 XXXX: 0103 XXXX: 0106 XXXX: 0108 XXXX: 010A -

Manual de Lenguaje Ensamblador -a 1987:0100 mov ax,200 1987:0103 mov bx,FFF 1987:0106 add ax,bx 1987:0108 int 20 1987:010A Ingresemos ahora el comando r -u Este comando nos muestra nuestro programa compilado y muchas otras instrucciones que se encuentran en mquina pero que a nosotros no os interesan y que solo sirven para ensuciar nuestro razonamiento, por ello es preferible el comando u XXXX XXXX (desde-hasta). 1987:0100 B80002 1987:0103 BBFF0F 1987:0106 01D8 1987:0108 CD20 1987:010A B2E8 1987:010C 7421 1987:010E A0C9DE 1987:0111 0AC9 1987:0113 7505 1987:0115 3A45FF 1987:0118 7401 1987:011A AA 1987:011B 8B34 1987:011D 007619 MOV MOV ADD INT MOV JZ MOV OR JNZ CMP JZ STOSB MOV ADD AX,0200 BX,0FFF AX,BX 20 DL,E8 01,2F AL, [DEC9] CL,CL 011A AL,[DI01] 011B SI,[SI] [BP+19], DH por ello es preferible el comando u XXXX XXXX (desde-hasta). Si ingresamos el comando u0100 0108 nos muestra el programa compilado. No tipeamos hasta 010A porque esta posicin de memoria no la utilizamos y aparece instruccines que nosotros no hemos introducido en el sistema. -u 0100 0108 1987:0100 B80002 1987:0103 BBFF0F MOV MOV AX,0200 BX,0FFF

Manual de Lenguaje Ensamblador 1987:0106 01D8 ADD AX,BX 1987:0108 CD20 INT 20 Hagamos un alto y veamos como queda nuestro programa. En la primer columna tenemos las posicin de nuestras instrucciones comenzando desde la posicin 0100 (las 4 primeras indican tambin la posicin pero a ellas no nos referiremos por el momento). En la segunda aparece la compilacin. Aqu hay algo realmente curioso: B80002 El primer byte es el cdigo de operacin. Fcil de entender. El segundo corresponde a los dos ltimos dgitos del nmero que nosotros queremos cargar en el acumulador. El tercer byte tiene los dos primeros nmero del nmero que nosotros ingresamos. Es decir que 0200 se representa en memoria como 0020. Complicado pero as funciona el INTEL y no vamos ahora a entrar en detalle. En la tercera y cuarta las instrucciones que nosotros ingresamos en lenguaje simblico. Lleg el momento de analizar los diferentes tamaos de las instrucciones que utilizamos: La primera y segunda corresponden a la sentencia MOV (mover) y tienen un longitud de 3 (tres ) bytes. La tercera corresponde a una instruccin de suma y tiene solo dos. La cuarta tambin tiene dos. Ejemplo programa. S2: Como queda en memoria almacenado nuestro

Para ver nuestro programa almacenado debemos tipear el comando: -d (DISPLAY) que nos muestra la memoria. Esta est dividida en dos partes: a. La comprendida por caracteres hexadecimales que nos permiten ver todo el contenido de la memoria porque la combinacin de bits en un nibble (4 bits) siempre tiene representacin en hexadecimal. b. En caracteres, en castellano o ingles, pero noten que es inentendible porque normalmente la configuracin de memoria no tiene una estructura semntica y sintctica que podamos comprender. En otros ejercicios veremos que si podemos leer desde la memoria caracteres comprensibles. c. El guin que separa en dos partes la memoria expresada en hexadecimal no indica el cambio de palabra. Hasta donde llega nuestro programa est subrayado. 1987:01 00 1987:01 B8 00 02 BB FF 0F 01 D8 - CD 20 ......... ..t!.. B2 E8 74 21 A0 C9 ...u.:E.t...4. DE 0A C9 75 05 3A 45 FF - 74 01 v.

Manual de Lenguaje Ensamblador 10 1987:01 20 1987:01 30 1987:01 40 1987:01 50 1987:01 60 1987:01 70 AA 8B 34 00 76 19 C0 75 FA BA B2 E8 C7 06 - 19 DF CA 83 E8 10 00 0A DB 74 04 9D F8 EB 02 9D - F9 5E 5F 5A 59 5B C3 51 52 57 56 9C 8B FA 8B F2 - E8 6B F4 A2 DB E2 BF 98 DE 0A C0 74 03 BF F3 E5 - B9 13 00 E8 1E F5 72 65 C7 06 CA DE 00 00 C6 06 - CC DE 00 80 3E DB E2 00 74 07 81 C6 04 01 E8 A8 - F5 E8 52 00 3B 06 CA DE .u.............. . t.......^_ZY[ .Q RWV......k.. .... ...t..........re ...........>... t.........R.;...

El resto es basura que no nos pertenece. Si nosotros podemos leer esa basura, se pueden imaginar que importante puede ser todo esta que queda en la memoria para un HACKER. Ejercicio 5: Se pide sumar dos direcciones. Para este ejercicio nos falta conocer como se informan las direcciones. La manera es simple, entre corchetes [ ]. Ingrese las instrucciones que se dan a continuacin. -a 1987:0100 mov ax,[0200] 1987:0103 mov cx,[0FFF] 1987:0107 add ax,cx 1987:0109 int 20 1987:010B Ahora vamos a ejecutar el programa. Partimos del comando r para que nos muestre el estado de los registros y la primera instruccin del programa. -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 A10002 MOV AX,[0200] DS:0200=A708 Vemos que AX = 0000 que CX= 0000 y que la direccin [0200] = A708 que est indicada por el registro DS que se encuentra en la parte inferior derecha del

Manual de Lenguaje Ensamblador ejemplo y en negrilla. Ahora vamos a usar el comando TRACE que se representa por la letra t. Este nos permite ver paso a paso que sucede en nuestro computador. -t AX=A708 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0103 NV UP EI PL NZ NA PO NC 1987:0103 8B0EFF0F MOV CX,[0FFF] DS:0FFF=DB52 Vemos que la primera instruccin modific el contenido del registro AX con el valor de DS. Esto est bien, porque es lo que nosotros pedimos. Si volvemos a tipear t ejecutaremos la segunda instruccin. -t AX=A708 BX=0000 CX=DB52 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0107 NV UP EI PL NZ NA PO NC 1987:0107 01C8 ADD AX,CX Vemos que ahora no aparece el registro DS porque en la instruccin que se va a ejecutar no mencionamos direcciones. -t AX=825A BX=0000 CX=DB52 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0109 NV UP EI NG NZ NA PE CY 1987:0109 CD20 INT 20 Se ha realizado la suma de los dos registros y algunas cosas se han modificado. a) El registro AX se ha modificado pero notemos que el nuevo valor es inferior al que ya tenamos almacenado. Porqu? La respuesta es simple porque se ha producido un acarreo. Se recomienda realizar la suma manualmente para comprobar que lo sucedido es cierto. b) Veamos que el STATUS REGISTER ha modificado su valor indicndonos que eso ha sucedido, para mayor claridad lo marcamos en negrilla y en color. c) Comprelo con el DISPLAY anterior.

Manual de Lenguaje Ensamblador Por ltimo ejecutemos INT 20. -t AX=825A BX=0000 CX=DB52 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=00CA IP=0FA8 NV UP DI NG NZ NA PE CY 00CA:0FA8 90 NOP Observemos que la nueva instruccin que aparece es un NOP (NO OPERATION) indicndonos que el programa ha terminado. NOTA: Podemos ejecutar directamente (t) pero nos mostrar la segunda instruccin a ejecutarse y la primera ya ejecutada. Tipee q en la lnea de comando, vuelva a tipear DEBUG y cargue nuevamente el programa, posteriormente empiece directamente con el TRACE. Resolver e informar. Utilice el comando TRACE (t) para ejecutar el programa. Ejercicio 1. Sumar el contenido de una direccin y de una constante. Ejercicio 2: Reste dos nmeros utilizando registros. El primero menor que el segundo. La instruccin para restar es SUB. Verifique el valor de los bits del STATUS REGISTER Ejercicio 3: Suma y resta. Sume dos nmeros y reste otro. Utilice constantes, no direcciones. Verifique el valor de los bits del STATUS REGISTER Ejercicio 4: Sume dos nmeros y reste una direccin. Divisin del acumulador en dos partes. Si ejecutamos el comando r podemos ver el contenido del acumulador. -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 A10002 MOV AX,[0200] DS:0200=A708 Como vemos AX = 0000 si tipeamos el comando r ax nos permite modificar el el acumulador, como muestra el ejemplo.

Manual de Lenguaje Ensamblador -rax AX 0000 :faf7 -r AX=FAF7 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 A10002 MOV AX,[0200] DS:0200=A708 Comprobamos que est modificado. Pero tambin podramos hacerlo de otra manera. Como dice el ttulo el registro AX lo podemos dividir en parte alta y parte baja siendo sus cdigos de reconocimiento AH (ACUMULATOR HIGH) y AL (ACUMULATOR LOW). Entones podemos escribir lo siguiente: -a 0100 1987:0100 mov ah,03 1987:0102 int 20 1987:0104 y ejecutarlo como lo hacemos hasta el presente (con el TRACE). -r AX=FAF7 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 B403 MOV AH,03 Observemos que cuando se ejecut la instruccin MOV AH,03 el registro AX quedo modificado en su parte superior por el valor (03) que ingresamos. -t AX=03F7 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0102 NV UP EI PL NZ NA PO NC 1987:0102 CD20 INT 20 -t AX=03F7 BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=00CA IP=0FA8 NV UP DI PL NZ NA PO NC

Manual de Lenguaje Ensamblador 00CA:0FA8 90 NOP As terminamos de ejecutar esta parte. Hagamos lo mismo con inferior.

la parte

-a100 1987:0100 mov al,bb 1987:0102 int 20 1987:0104 -r AX=03FF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 B0BB MOV AL,BB -t AX=03BB BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0102 NV UP EI PL NZ NA PO NC 1987:0102 CD20 INT 20 -t AX=03BB BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=00CA IP=0FA8 NV UP DI PL NZ NA PO NC 00CA:0FA8 90 NOP Ahora vamos a sumar las dos partes que componen el acumulador (AX). Para eso hacemos el siguiente programa. -a100 00CA:0100 add ah,al 00CA:0102 int 20 00CA:0104 y lo ejecutamos. -r AX=03BB BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=00CA IP=0100 NV UP DI PL NZ NA PO NC 00CA:0100 00C4 ADD AH,AL -t

Manual de Lenguaje Ensamblador AX=BEBB BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=00CA IP=0102 NV UP DI NG NZ NA PE NC 00CA:0102 CD20 INT 20 Podemos realizar la comprobacin del resultado muy fcilmente. Multiplicacin y divisin. En lo referente a la multiplicacin podemos determinar dos tipos de instrucciones: MUL multiplica valores sin signo. IMUL multiplica valores con signo. Aqu tenemos algunas variantes que no se observaron el la suma y en la resta. Podemos multiplicar entidades de 8 bites y de 16 bits (una palabra) o 16 y 32 o... dependiendo del tamao de la palabra y del procesador que estamos utilizando. Independientemente si queremos multiplicar por media palabra el valor debe estar en la parte baja del registro que vamo a utilizar, por ejemplo en AL y si queremos multiplicar por la palabra deber ocupar todo el registro, es decir que deber estar en AX por ejemplo. Ejemplo M1: Multiplicar valores de 8 bits sin signo Ingresamos el programa: C:\>debug -a 1987:0100 1987:0102 1987:0104 1987:0106 1987:0108

mov al,4 mov cl,5 mul al,cl int 20

-g106 AX=0010 BX=0000 CX=0005 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0106 NV UP EI PL NZ NA PO NC 1987:0106 CD20 INT 20 Dos cosas importantes. La primera es que el programa se ha ejecutado y vemos el resultado en AX y podemos comprobar que est correcto y la segunda es que estamos usando un nuevo comando que es g que nos permite ejecutar

Manual de Lenguaje Ensamblador completamente el programa que nosotros cargamos y nos muestra el resultado. Este tiene dos opciones: En el ejemplo M1 hemos ejecutado el programa parcialmente puesto que apuntamos hasta la instruccin almacenada en 0106 que es int 20, pero podemos ejecutar el programa hasta la 108 o 0108 ysucedera esto: -g108 El programa ha finalizado con normalidad -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 B004 MOV AL,04 Se ejecut el programa totalmente y nos informa su correcta terminacin pero no se muestran las variaciones de los registros. Ejecicio M2: Multiplicacin de valores que provoquen un desbordamiento. En este caso vamos a utilizar dos valores que multiplicados superen la capacidad de almacenamiento de la parte baja del registro. -a 1987:0100 mov al,bb 1987:0102 mov cl,aa 1987:0104 mul al,cl 1987:0106 int 20 1987:0108 -g108 El programa ha finalizado con normalidad -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC 1987:0100 B0BB MOV AL,BB En este caso no nos sirve de mucho, porque no nos deja ver nada, no muestra los resultados y solo podemos saber que el programa hace algo y que no da error, pero nada ms. Por lo tanto siempres es preferible ingresar por el TRACE (t) para ver paso a paso que sucede. -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC

Manual de Lenguaje Ensamblador 1987:0100 B0BB -t AX=00BB BX=0000 SI=0000 DI=0000 DS=1987 ES=1987 NZ NA PO NC 1987:0102 B1AA -t AX=00BB BX=0000 SI=0000 DI=0000 DS=1987 ES=1987 NZ NA PO NC 1987:0104 F6E0 -t AX=8899 BX=0000 SI=0000 DI=0000 DS=1987 ES=1987 NZ NA PO CY 1987:0106 CD20 MOV AL,BB

CX=0000 DX=0000 SP=FFEE BP=0000 SS=1987 CS=1987 IP=0102 NV UP EI PL MOV CL,AA

CX=00AA DX=0000 SP=FFEE BP=0000 SS=1987 CS=1987 IP=0104 NV UP EI PL MUL AL

CX=00AA DX=0000 SP=FFEE BP=0000 SS=1987 CS=1987 IP=0106 OV UP EI PL INT 20

Realicen el clculo de la multiplicacin manualmente y observen que es lo que sucedi y porduzcan un informe con ello. Ejercicio M3: Multiplicacin de valores con signo. -a 1987:0100 mov al,8 1987:0102 mov cl,-2 1987:0104 imul cl 1987:0106 int 20 1987:0108 -u 0100 0108 1987:0100 B008 MOV AL,08 1987:0102 B1FE MOV CL,FE 1987:0104 F6E9 IMUL CL es igual que decir mul ax,cl 1987:0106 CD20 INT 20 1987:0108 CC INT 3 Observemos que ya hay modificaciones . Determine cuales y que es lo que sucedi y porqu? Ejecutamos el programa paso a paso. -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP DI PL NZ NA PO NC 1987:0100 B008 MOV AL,08 -t

Manual de Lenguaje Ensamblador AX=0008 BX=0000 CX=0000 DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0102 NV UP DI PL NZ NA PO NC 1987:0102 B1FE MOV CL,FE -t AX=0008 BX=0000 CX=00FE DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0104 NV UP DI PL NZ NA PO NC 1987:0104 F6E9 IMUL CL -t AX=FFF0 BX=0000 CX=00FE DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0106 NV UP DI PL NZ NA PO NC 1987:0106 CD20 INT 20 Analicen que sucedi. Qu pasa si tomamos AX en lugar de AL? Qu sucedi con los bits de bandera? Estn correctos o hay errores en ellos? Realicen el informe correspondiente. Realice el mismo programa con la diferencia de la siguiente instruccin Mov cl,-1 e informe el anlisis particular y comparativo Realizados los ejemplos anteriores y convenientemente analizados podemos pasar a realizar ejercicios con registros completos. Informe cada uno de los ejercicios. Ejercicio M1: Multiplique dos nmeros. Ejercicio M2: Multiplique un nmero positivo por un nmero negativo a) Con valores pequeos. b) Con valores grandes. Ejercicio M3: Multiplique dos nmeros con signo negativo. Ejercicio M4: Ingrese el siguiente programa y analice los resultados -a 100 1987:0100 mov bx,ffff 1987:0103 mov cx,-1 1987:0106 imul cx 1987:0108 imul bx 1987:010A int 20 1987:010C -

Manual de Lenguaje Ensamblador Divisin. Tambin est compuesta por dos instrucciones: DIV que divide dos valores sin signo. IDIV que divide dos valores con signo. En una divisin de valores enteros vamos a suponer que el dividendo siempre ser mayor que el divisor, por lo menos para esta primera parte de nuestro estudio. De acuerdo a lo expresado pasemos a realizar nuestro primer ejemplo. Ejemplo D1: Dividir dos nmero enteros. Aclaraciones: Para un divisor de 8 bits el dividendo ser de 16 bits, por lo tanto el dividendo lo ubicaremos en AX (16 bits) y el divisor en CL (8bits) El programa es: -a 1987:0100 1987:0103 1987:0105 1987:0107 1987:0109 -t

mov ax,8 mov cl,4 div cl int 20

Dara lo mismo escribir div ax,cl

AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0103 NV UP EI PL NZ NA PO NC 1987:0103 B104 MOV CL,04 -t AX=0008 BX=0000 CX=0004 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0105 NV UP EI PL NZ NA PO NC 1987:0105 F6F1 DIV CL -t AX=0002 BX=0000 CX=0004 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0107 NV UP EI NG NZ AC PE CY 1987:0107 CD20 INT 20 -

Manual de Lenguaje Ensamblador Ejercicio D1: Realicen un programa utilizando dos nmeros que no sean mltiplos y analaice el registro AX. Ejercicio D2: Realice un programa cuyo divisor sea cero e informe que sucede y porqu. Ejercicio D3: Realice un programa que permita dividir los siguientes valores FFFF y 2, pero en ste caso el divisor ser BX. Observe todos los registros e informe. Ejercicio D4: Realice un programa que permita la diviidr FFFF por 1 y analice.

Manual de Lenguaje Ensamblador Bifurcaciones condicionales, incondicionales y repeticiones. Cuando hacemos un programa seguramente tendremos ue realizar en algn momento una pregunta que nos permita testear un registro, variable, archivo, etc., y optar por realizar tal o cual cosa dependiendo de que resultado nos devuelva el dato consultado. Por otro lado tambin existe la psibilidad de que despus de ejecutar una serie de instrucciones debamos continuar el programa por otro lado saltando un montn de instrucciones, en este caso estamos utilizando un salto inconsicional , no hay ninguna condicin previa , y por ltimo podemos realizar una serie de repeticiones o iteraciones o LOOPS dentro de nuestro programa. Esto sucede enla mayora de los programas y es por eso que esta nueva seccin investiga las tres posibilidades. Ejemplo B1: Realizar un programa con un salto condicional. Para visualizar mejor las posibilidades de Verdadero y Falso que se pueden presentar utilizaremos dos variables alfabticas. El programa -a 1987:0100 jmp 0113 1987:0102 -e 102 "Saltamos varias instrucciones verdad " 0d 0a "$" -a 113 1987:0113 mov dx,102 1987:0116 mov ah,9 1987:0118 int 21 1987:011A int 20 1987:011C -g Saltamos varias instrucciones verdad El programa ha finalizado con normalidad Para analizar las instrucciones que saltamos debemos hacer: -u 100 011a 1987:0100 EB11 1987:0102 53 1987:0103 61 1987:0104 6C 1987:0105 7461 1987:0107 6D 1987:0108 6F 1987:0109 7320 1987:010B 7661 1987:010D 7269 JMP 0113 PUSH BX DB 61 DB 6C JZ 0168 DB 6D DB 6F JNB 012B JBE 016E JB 0178

Manual de Lenguaje Ensamblador 1987:010F 61 DB 61 1987:0110 7320 JNB 0132 1987:0112 69 DB 69 1987:0113 BA0201 MOV DX,0102 1987:0116 B409 MOV AH,09 1987:0118 CD21 INT 21 1987:011A CD20 INT 20 En negrilla todas las instrucciones que saltamos, que por supuesto no son de nuestro programa. Otra manera de ver la ejecucin de nuestro programa es utilizando el comando p. En este caso aconsejamos hacerlo indicando adems la instruccin desde donde debe comenzar como en la secuencia que sigue. -p 100 AX=0000 BX=0000 CX=0000 DX=0102 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0116 NV UP EI PL NZ NA PO NC 1987:0116 B409 MOV AH,09 AX=0900 BX=0000 CX=0000 DX=0102 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0118 NV UP EI PL NZ NA PO NC 1987:0118 CD21 INT 21 HEMOS SALTADO VAR -! UCCIONES VERDAD AX=0924 BX=0000 CX=0000 DX=0102 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=011A NV UP EI PL NZ NA PO NC 1987:011A CD20 INT 20 El programa ha finalizado con normalidad -

Manual de Lenguaje Ensamblador Pasaje de datos entre registros. Para realizar este ejercicio vamos a utilizar una nueva intruccin que es XCHG, que realiza el pasaje del contenido entre dos registros. No importa la manera en que de especifiquen los registros en la instruccin. Para ello damos el siguiente ejemplo: C:\>debug -a 100 1987:0100 1987:0103 1987:0106 1987:0107 1987:0109 -t 3

mov ax,333 mov bx,222 xchg bx,ax int 20

AX=0333 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0103 NV UP EI PL NZ NA PO NC 1987:0103 BB2202 MOV BX,0222 AX=0333 BX=0222 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0106 NV UP EI PL NZ NA PO NC 1987:0106 93 XCHG BX,AX AX=0222 BX=0333 DI=0000 DS=1987 ES=1987 NC 1987:0107 CD20 o bien IP 0108 :100 -u100 108 1987:0100 B83303 1987:0103 BB2202 1987:0106 87C3 1987:0108 CD20 -r AX=0222 BX=0333 DI=0000 DS=1987 ES=1987 NC 1987:0100 B83303 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 SS=1987 CS=1987 IP=0107 INT 20 NV UP EI PL NZ NA PO

MOV AX,0333 MOV BX,0222 XCHG AX,BX INT 20 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 SS=1987 CS=1987 IP=0100 MOV AX,0333 NV UP EI PL NZ NA PO

Manual de Lenguaje Ensamblador -t3 AX=0333 BX=0333 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0103 NV UP EI PL NZ NA PO NC 1987:0103 BB2202 MOV BX,0222 AX=0333 BX=0222 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0106 NV UP EI PL NZ NA PO NC 1987:0106 87C3 XCHG AX,BX AX=0222 BX=0333 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1987 ES=1987 SS=1987 CS=1987 IP=0108 NV UP EI PL NZ NA PO NC 1987:0108 CD20 INT 20 Como podemos observar lo dicho anteriormente se cumple. Manejo de Disco con el DEBUGER Para comenzar vamos a formatear un diskette de la manera tradicional. El comando para realizar el formateo, para los que no lo recuerdan, es: FORMAT A:/S. C:\>format a:/s Inserte un nuevo disco en la unidad A: y presione Entrar cuando est listo... Comprobando el formato del disco. Comprobando 1,44 MB Formato completado. Sistema transferido Nombre del volumen? (11 caracteres, Entrar para ninguno)? PRUEBA1 1.457.664 bytes de espacio total en disco 389.632 bytes utilizados por el sistema 1.068.032 bytes disponibles en disco 512 bytes en cada unidad de asignacin. 2.086 unidades de asignacin libres en disco. El nmero de serie del volumen es 0A1B-1ED8

Manual de Lenguaje Ensamblador Desea formatear otro disco (S/N)?N Bueno ya lo tenemos formateado. Ahora vamos a verificar la informacin que tenemos en el diskette. Para ello entramos en el DEBUG Como lo hacemos habitualmente. Una vez en el DEBUG vamos a utilizar el comando D (DUMP) indicndole la direccin desde la cual queremos empezar. Y mostrar lo siguiente:

Manual de Lenguaje Ensamblador Coman do ?? Permite ver el set de instrucciones bsico del Assembler Abre el DEBUG para ingresar sentencias Permite la ejecutar un programa en forma completa o parcial Permite ver el estados de los registros Muestra paso a paso la ejecucin. Corresponde al comando TRACE. Significado

a g

r t

Manual de Lenguaje Ensamblador

APENDICE A.- MODELO DE REGISTROS DEL 8086

Bit 15 Bit 7 Bit 0Bit 7

Bit 1 Bit 0

AH BH CH DH

AL BL CL DL

AX (Acumulador) BX (Base) CX (Contador) DX (Datos)

SP (Apuntador de pila) BP (Apuntador de base) SI (Indice a fuente) DI (Indice de destino)

Manual de Lenguaje Ensamblador APENDICE B.- REGISTROS EXPANDIDOS DEL 8087.

Manual de Lenguaje Ensamblador

Manual de Lenguaje Ensamblador

Manual de Lenguaje Ensamblador APENDICE C.- MODELO DE SEGMENTACION DE MEMORIA.

Manual de Lenguaje Ensamblador APENDICE D.- DIRECTIVAS DEL MASM. .186 .286c .286p .287 .8086 .8087 nombre=expresin ASSUME segmentregister:segmentname... Permite reconocer instrucciones microprocesadores 8086 y 80186. para

Permite ensamblar instrucciones 80286 en modo no protegido, 8086 y 80186. Activa el ensamble de instrucciones 80286 en modo protegido, 80186, 8086. Ensamblar instrucciones 80287 y 8087. Modo por defecto. Activa el ensamble de instrucciones 8086 (idnticas para el 8088). Activa el ensamble de instrucciones 8087. Modo por defecto. Asigna el valor de expresin a nombre. Selecciona segmentregister que sea el segmento por defecto para todos los smbolos en el segmento o grupo nombrados. Si segmentname es NOTHING, ningn registro es seleccionado. Trata como un comentario a todo texto dado entre delimitador y delimitador. Restablece el listado de referencia cruzada de smbolos.

COMMENT delimitador texto delimitador .CREF [nombre] DB valor... [nombre] DW valor... [nombre] DD valor... [nombre] DQ valor... [nombre] DT valor...

Aloja e inicializa un byte (DB), una palabra (DW, 2 bytes), una palabra doble (DD), una palabra cudruple (DQ), y 10 bytes ( (DT) de almacenamiento para cada valor. ELSE Seala el inicio de un bloque alterno dentro de un bloque condicional.

Manual de Lenguaje Ensamblador END [expresin] ENDIF ENDM nombre ENDP nombre ENDS nombre EQU expresin .ERR .ERR1 .ERR2 .ERRB <argumento> .ERRDEF nombre .ERRDIF <cadena1>,<cadena2> .ERRE expresin .ERRIDN <cadena1>,<cadena2> .ERRNB <argumento> .ERRNDEF nombre .ERRNZ expresin EVEN Seala el fin de un bloque y, opcionalmente, fija el punto de entrada a expresin. Termina un bloque condicional. Termina una macro. Marca el final de la definicin de un procedimiento Marca el final de la definicin de una estructura o segmento Asigna expresin a nombre. Genera error. Genera error en el paso 1 nicamente. Genera error en el paso 2 nicamente. Genera error si argumento es blanco. Genera error si nombre ya ha sido definido. Genera error si los nombres son diferentes. Genera error si expresin es falsa (o) Genera error si las cadenas son idnticas. Genera error si el argumento no es blanco. Genera error si nombre no se ha definido. Genera error (verdadera). si expresin no es cero

Si es necesario, incrementa el contador de localidad a un nmero par y genera una instruccin NOP. Termina la expansin del bloque de repeticin o macro y comienza a ensamblar la siguiente declaracin fuera del bloque. Declaracin de una variable, etiqueta o smbolo externo.

EXITM

EXTRN nombre:tipo...

Manual de Lenguaje Ensamblador nombre GROUP segmentname... IF expresin IF1 IF2 IFB <argumento> IFDEF nombre IFDIF <argumento1>,<argumento2> IFE expresin IFIDN <argumento1>,<argumento2> IFNB <argumento> IFNDEF nombre INCLUDE filename IRP nombre,<parmetro...> Asocia el nombre de un grupo con uno o ms segmentos. Permite el ensamble verdadera (no cero). si expresin es

Ensambla slo en el paso 1. Ensambla slo en el paso 2. Ensambla si argumento es blanco. Ensambla si nombre ya ha sido definido. Ensambla slo diferentes. si los argumentos son

Ensambla si expresin es falsa (0). Ensambla si los argumentos son idnticos. Ensambla si el argumento no es blanco. Si nombre no ha sido definido permite el ensamble Inserta cdigo indicado fuente desde el archivo

Marca el inicio de un bloque de cdigo que ser repetido tantas veces como parmetros existan y en cada repeticin nombre ser reemplazado por cada parmetro. Marca el inicio de un bloque de cdigo que ser repetido tantas veces como caracteres tenga la cadena indicada y en cada repeticin ser substituido nombre por cada carcter. Crea una nueva variable o etiqueta asignando el valor actual del contador de localidades y el tipo dado a nombre. Lista todas las declaraciones en una macro.

IRPC nombre,<cadena>

nombre ETIQUETA tipo

.LALL

Manual de Lenguaje Ensamblador .LFCOND .LIST LOCAL nombre... Restablece el condicionales. listado de bloques

Restablece el listado de declaraciones en el listado del programa. Declara nombre dentro de una macro para que sea reemplazado por el nombre actual, cuando la macro sea expandida Marca el inicio de la macro nombre y establece cada parmetro para ser substituido por los respectivos parmetros cuando la macro sea llamada. Fija el nombre del mdulo. Borra las macros indicadas. Fija el contador de localidades expresin. Despliega texto en pantalla. Seala el inicio de un procedimiento de determinado tipo. Fija los mrgenes para el listado el programa (en caracteres). Incrementa la numeracin de pgina. Genera un corte de pgina en el listado. Hace que cada variable, nombre, etiqueta o smbolo absoluto declarado est disponible para el resto de mdulos en el programa. Fija la base a expresin para la introducin de nmeros. Define una estructura para un registro de 8 16 bits que contiene uno o ms campos. Marca el incio de un bloque ser repetido el nmero de veces indicado por expresin.

nombre MACRO parmetro...

NAME mdulo PURGE macro... ORG expresin %OUT texto nombre PROC tipo PAGE longitud,ancho PAGE+ PAGE PUBLIC nombre...

.RADIX expresin nombre RECORD campo:ancho[=expresin].. REPT expresin

Manual de Lenguaje Ensamblador .SAL nombre SEGMENT [alineacin][combine]['clase'] Suprime el listado de las expansiones de macros. Marca el inicio de un segmento del programa llamado nombre y que posee los atributos indicados. Suprime el listado de cualquier bloque condicional subsecuente cuya condicin IF sea falsa. Marca el comienzo en la defincin de una estructura. Define un subttulo para el listado. Fija por defecto condicionales. el listar los bloques

.SFCOND

nombre STRUC SUBTTL [texto] .TFCOND TITLE texto .XALL .XCREF [nombre...] .XLIST

Ttulos para los listados de los programas. Lista slo aquellas macros que generen cdigo o datos. Suprime el cruzadas. listado de las referencias

Suprime el listado de las lneas que sigan.

Manual de Lenguaje Ensamblador APENDICE E.- JUEGO DE INSTRUCCIONES DEL 8086, 8087, 80186, 80286 Y 80287. En la siguiente lista de instrucciones, para la descripcin y su sintaxis se recurre a las siguientes abreviaturas: acum. reg segreg r/m inmed mem etiqueta src dest Uno de los acumuladores: AX o AL. Cualquiera de los registros Uno de los registros de regmento Uno de los operandos generales: registro, memoria, basado, indexado o basado-indexado Constante o smbolo de 8 o 16 bits Un operando de memoria: smbolo, etiqueta, variable. Etiqueta de instrucciones. Fuente en operaciones de cadena Destino en operaciones de cadena.

Para el 8086/8088 AAA AAD AAM AAS ADC acum, inmed r/m,inmed r/m, reg reg, r/m ADD acum,inmed r/m,inmed r/m, reg reg, r/m AND acum,inmed r/m,inmed r/m, reg reg, r/m CALL etiqueta r/m CBW CLC CLD Ajuste ASCII para adicin. Ajuste ASCII para divisin. Ajuste ASCII para multiplicacin. Ajuste ASCII para divisin.

Suma con acarreo.

Suma.

Operacin AND a nivel bit.

Llamado. Convierte byte a palabra. Limpia bandera de acarreo. Limpia bandera de direccin.

Manual de Lenguaje Ensamblador CLI CMC CMP acum,inmed r/m,inmed r/m, reg reg, r/m CMPS src,dest CMPSB CMPSW CWD DAA DAS DEC r/m reg DIV r/m ESC inmed, r/m HLT IDIV r/m IMUL r/m IN accum,inmed acum, DX INC r/m reg INT 3 INT inmed INTO IRET Limpia bandera de interrupcin. Complementa bandera de acarreo.

Comparacin

Comparacin de cadenas. Compara cadenas byte por byte. Compara cadenas palabra por palabra. Convierte palabra a palabra doble. Ajuste decimal para adicin. Ajuste decimal para substraccin. Decremento. Divisin. Escape con 6 bits. Alto. Divisin entera. Mutiplicacin entera. Entrada desde puerto. Incremento. Interrupcion 3 codificada como un byte. Interrupcin 0-255. Interrupcin en overflow. Retorno de interrupcin. Brinco incondicional. J(condicin) etiqueta Brinca de acuerdo a las condiciones: A (arriba), AE (arriba o igual), B (siguiente), BE (siguiente o igual), C (acarreo), CXZ (CX en cero), E (igual), G (mayor), GE (mayor o igual), L (menor), LE (menor o igual), NA (no anterior), NAE (no anterior o igual), NB (no siguiente), NBE (no siguiente o igual), NC (no acarreo), NE (no igual), NG (no mayor), NGE (no mayor o igual), NL (no menor), NLE (no menor o igual), NO (no sobreflujo), NP (no paridad), NS (no signo), NZ (no cero), O (sobreflujo), P (paridad), PE (paridad par), PO (paridad impar), S (signo), Z (cero). Carga AH con las banderas.

JMP etiqueta r/m

LAHF

Manual de Lenguaje Ensamblador LDS r/m LEA r/m LES r/m LOCK LODS src LODSB LODSW LOOP etiqueta LOOPE etiqueta LOOPNE etiqueta LOOPNZ etiqueta LOOPZ etiqueta MOV acum,mem r/m,inmed mem, acum r/m, reg r/m,segreg reg, inmed reg,r/m segreg,r/m MOVS dest, src MOVSB MOVSW MUL r/m NEG r/m NOP NOT r/m OR acum, inmed r/m,inmed r/m, reg reg,r/m OUT DX, accum inmed, acum POP r/m reg segreg POPF Carga DS. Carga la direccin. Carga ES. Cierra bus. Carga cadena. Carga byte de cadena en AL. Carga palabra de la cadena en AX. Ciclo. Ciclo mientras igual. Ciclo mientras no igual. Ciclo mientras no cero. Ciclo mientras cero.

Mueve un valor del segundo al primer operando

Mueve cadena. Mueve cadena byte por byte. Mueve cadena palabra por palabra. Multiplicacin. Niega (complemento a 2). Operacin ociosa. Invierte valores de bits (complemento a1).

Operacin OR a nivel de bit.

Salida por el puerto dado por el primer operando (inmediato de 8 bits). Recupera valor de la pila. Recupera banderas.

Manual de Lenguaje Ensamblador PUSH r/m reg segreg PUSHF RCL r/m,1 r/m,CL RCR r/m, 1 r/m, CL REP REPE REPNE REPNZ REPZ RET [inmed] ROL r/m,1 r/m, CL ROR r/m,1 r/m, CL SAHF SAL r/m, 1 r/m, CL SAR r/m, 1 r/m, CL SBB acum, inmed r/m,inmed r/m, reg reg,r/m SCAS dest SCASB SCASW SHL r/m, 1 r/m, CL SHR r/m, 1 r/m, CL STC STD STI STOS dest STOSB STOSW Guarda valor en la pila. Guarda banderas. Rotacin a la izquierda con acarreo. Rotacin a la derecha con acarreo. Repite. Repite si igual. Repite si no igual. Repite si no cero. Repite si cero. Regresa despus de recuperar bytes de la pila. Rotacin a la izquierda. Rotacin a la derecha. Carga banderas con el valor de AH. Desplazamiento aritmtico a la izquierda. Desplazamiento aritmtico a la derecha.

Substraccin con acarreo.

Explora cadena. Explora cadena para el byte en AL. Explora cadena por la palabra en AX. Desplazamiento a la izquierda. Desplazamiento a la derecha. Fija bandera de acarreo. Fija bandera de direccin. Fija bandera de interrupcin. Guarda cadena. Guarda byte en AL en la cadena. Guarda palabra en AX en la cadena.

Manual de Lenguaje Ensamblador SUB accum, inmed r/m,inmed r/m, reg reg,r/m TEST acum, inmed r/m,inmed r/m, reg reg,r/m WAIT XCHG acum, reg r/m,inmed r/m, reg reg,r/m XLAT XOR acum, reg r/m,inmed r/m, reg reg,r/m Para el 8087 F2XM1 FABS FADD mem FADD ST, ST(i) FADD ST(i), ST FADDP ST(i), ST FBLD mem FBSTP mem FCHS FCLEX FCOM FCOM ST FCOM ST(i) FCOMP FCOMP ST FCOMP ST(i) FCOMPP FDECSTP FDISI Calcula 2x-1. Toma valor absoluto del tope de la pila. Suma real. Suma real desde la pila. Suma real a la pila. Suma real y saca de pila. Carga un decimal empacado de 10 bytes en la pila. Almacena un decimal empacado de 10 bytes y saca de pila. Cambia signo del valor en el tope de la pila. Borra las excepciones despus de un WAIT. Compara real. Compara real con el tope de la pila. Compara real con la pila. Compara real y saca de pila. Compara real con el tope de la pila y saca de pila. Compara real con el tope de la pila y saca. Compara real y saca dos valores de la pila. Decrementa el apuntador de la pila. Deshabilita las interrupciones depus de un WAIT.

Substraccin.

Comparacin.

Aguarda. Intercambio. Traduce. Operacin XOR a nivel bit.

Manual de Lenguaje Ensamblador FDIV mem FDIV ST, ST(i) FDIV ST(i), ST FDIVP ST(i), ST FDIVR FDIVR mem FDIVR ST, ST(i) FDIVR ST(i), ST FDIVRP ST(i), ST FENI FFREE FIADD mem FICOM mem FICOMP mem FIDIV mem FDIVR mem FILD mem FIMUL mem FINCSTP FINIT FIST mem FISTP mem FISUB mem FISUBR mem FLD mem FLD1 FLDCW mem FLDENV mem FLDL2E FLDL2T FLDLG2 FLDLN2 FLDPI FLDZ FMUL MUL mem FMUL ST, ST(i) FMUL ST(i), ST FMULP ST, ST(i) FNCLEX Divisin real. Divisin real desde la pila. Divisin real en la pila. Divisin real sacando valor de la pila. Divisin real invertida. Divisin real invertida desde memoria. Divisin real invertida desde la pila. Divisin real invertida desde la pila. Divisin con un real invertido y sacando valor de la pila. Habilita interrupciones despus de un WAIT. Libera elemento de la pila. Suma entera de un nmero de 2 4 bytes. Compara enteros de 2 4 bytes y saca de la pila. Compara entero de 2 4 bytes y saca de pila. Divisin entera. Divisin entera invertida. Carga un entero de 2, 4 u 8 bytes en la pila. Multiplicacin entera de 2 4 bytes. Incrementa el apuntador de la pila. Inicializa el procesador despus de WAIT. Almacena entero de 2 4 bytes. Almacena entero de 2, 4 u 8 bytes y saca de la pila. Resta entero de 2 4 bytes. Resta entera de 2 4 bytes invertida. Carga real de 4, 8 10 bytes en la pila. Pone +1.0 en el tope de la pila. Carga la palabra de control. Carga entorno 8087 (14 bytes). Carga log2 e en el tope de la pila. Carga log2 10 en el tope de la pila. Carga log10 2 en el tope de la pila. Carga loge 2 en el tope de la pila. Carga en el tope de la pila. Carga +0.0 en el tope de la pila. Multiplicacin real. Multiplicacin real desde memoria. Multiplica real desde pila. Multiplica real a la pila. Multiplica real y saca de la pila. Borra excepciones sin WAIT.

Manual de Lenguaje Ensamblador FNDISI FNENI FNINIT FNOP FNSAVE mem FNSTCW mem FNSTENV mem FNSTSW mem FPATAN FPREM FPTAN FRNDINT FRSTOR mem FSAVE mem FSCALE FSQRT FST FST ST FST ST(i) FSTCW mem FSTENV mem FSTP mem FSTSW mem FSUB FSUB mem FSUB ST, ST(i) FSUB ST(i), ST FSUBP ST, ST(i) FSUBR FSUBR mem FSUBR ST, ST(i) FSUBR ST(i), ST FSUBRP ST(i), ST FTST FWAIT FXAM FXCH FFREE ST FREE ST(i) Inhabilita interrupciones sin WAIT. Habilita interrupciones sin WAIT. Inicializa procesador sin WAIT. Operacin nula. Salva estado 8087 (94 bytes) sin WAIT. Almacena la palabra de control sin WAIT. Guarda el entorno 8087 sin WAIT. Almacena el estado 8087 sin WAIT. Funcin arcotangente parcial. Residuo parcial. Funcin tangente parcial. Redondea a entero Restablece estado 8087 (94 bytes) Conserva el estado 8087 (94 bytes). Escala Raz cuadrada Almacena real. Almacena real desde el tope de la pila. Almacena real desde la pila. Almacena palabra de control con WAIT. Guarda el entorno 8087 despus de WAIT. Guarda real de 4, 8 10 bytes y saca de la pila. Almacena la palabra de estado depus de WAIT. Substrae real. Substrae real desde memora. Substrae real desde la pila. Substrae real a la pila. Substrae real y saca de pila. Substraccin real invertida. Substraccin real invertida desde memoria. Substraccin real invertida desde la pila. Substraccin real invertida a la pila. Substraccin real invertida a la pila y saca. Prueba el tope de la pila. Aguarda que la ltima operacin 8087 termine. Examina el elemento del tope de la pila. Intercambia contenido de los elementos de la pila. Intercambia el elemento del tope de la pila. Intercambia el elemento del tope de la pila y el i-simo elemento.

Manual de Lenguaje Ensamblador FXTRACT FYL2X FYL2PI Extrae el exponente y significando. Calcula Y log2 X. Calcula Y log2 (x+1)

Para el 80186/80188/80286 (modo no protegido) BOUND reg, mem ENTER inmed16, inmed8 IMUL reg, inmed reg, r/m, inmed INS mem, DX INSB mem,DX INSW mem DX LEAVE OUTS DX, mem OUTSB DX, mem OUTSW DX, mem POPA PUSH inmed PUSHA RCL r/m, inmed RCR r/m, inmed ROL r/m, inmed ROR r/m, inmed SAL r/m, inmed SAR r/m, inmed SHL r/m, inmed SHR r/m, inmed Detecta valor fuera de rango. Hace elemento en la pila para llamada a procedimiento. Multiplicacin entera. Entrada de cadena desde el puerto DX. Entrada de cadena de bytes desde el puerto DX. Entrada de cadena de palabras desde el puerto DX. Deja procedimeinto. Salida de cadena de bytes o palabras al puerto DX. Salida de cadena de bytes al puerto DX. Salida de cadena de palabras al puerto DX. Saca todos los registros de la pila. Introduce a la pila Introduce todos los registros. Rotacin a la izquierda con acarreo Rotacin a la derecha con acarreo. Rotacin a la izquierda. Rotacin a la derecha. Desplazamiento aritmtico a la izquierda. Desplazamiento aritmtico a la derecha. Desplazamiento a la izquierda. Desplazamiento a la derecha.

Para el 80286 (modo protegido) ARPL mem, reg CLTS LAR reg, mem LGDT mem LIDT mem LLDT mem LMSW mem LSL reg, mem LTR mem SGDT mem Ajusta peticin de nivel de privilegio. Limpia bandera de conmutacin de tareas. Carga derechos de acceso. Carga la tabla de descriptores globales (8 bytes). Carga tabla de descriptores de interrupciones (8 bytes). Carga la tabla de descriptores locales. Carga la palabra de estado. Carga el lmite del segmento. Carga registro de tareas. Guarda la tabla de descriptores locales (8 bytes).

Manual de Lenguaje Ensamblador SIDT mem SMSW mem STR mem VERR mem VERW mem Guarda tabla de descriptores de interrupciones (8 bytes). Guarda la palabra de estado. Guarda registro de tareas. Verifica acceso de lectura. Verifica acceso de escritura.

Para el 80287 FSETPM FSTSW AX FNSTSW AX Fija modo protegido. Almacena palabra de estado en AX (aguarda). Almacena palabra de estado en AX (no aguarda).

Manual de Lenguaje Ensamblador APENDICE F.- INTERRUPCIONES. Direccin (Hex) 0-3 4-7 8-B C-F 10-13 14-17 18-1F 20-23 24-27 28-37 38-3B 3C-3F 40-43 44-47 48-4B 4C-4F 50-53 54-57 58-5B 5C-5F 60-63 64-67 68-6B 6C-6F 70-73 74-77 78-7B 7C-7F 80-83 84-87 88-8B 90-93 94-97 98-9B 9C-9F A0-FF 100-1FF Interrupcin (Hex) 0 1 2 3 4 5 6,7 8 9 A,B,C,D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 24 25 26 27 28-3F 40-7F Funcin Division by zero Single step trace Nonmaskable interrupt Breakpoint instruction Overflow Print screen Reserved Timer Keyboard interrupt Reserved Diskette interrupt Reserved Video screen I/O Equipment check Memory size check Diskette I/O Communication I/O Cassete I/O Keyboard input Printer Output ROM Basic entry code Bootstrap loader Time of day Get control on keyboard break Get control on timer interrupt Pointer to video initialization table Pointer to diskette parameter table Pointer to table for graphicscharacters ASCII 128-255 DOS program terminate DOS function call DOS terminate address DOS fatal error vector DOS absolute disk read DOS absolute disk write DOS terminate, fix in storage Reserved for DOS Not used

Manual de Lenguaje Ensamblador 200-217 218-3C3 3C4-3FF 80-85 86-F0 F1-FF Reserved by BASIC Used by BASIC interpreter Not Used

Manual de Lenguaje Ensamblador

BIBLIOGRAFIA. - Murray, Williams H. & Papas, Chris H.; 80286/80386. PROGRAMACION EN LENGUAJE ENSAMBLADOR; Osborne/McGraw-Hill, 1989. - Shildt, Herbert; TURBO PASCAL AVANZADO. PROGRAMACION Y TECNICAS; Osborne/McGraw-Hill, 1987. - DOS 5 A SU ALCANCE; Osborne/McGraw-Hill, 1992. - MICROSOFT MS-DOS VERSION 5.0. GETTING STARTED, USERS GUIDE & REFERENCE; Microsoft Corporation, 1991. - MICROSOFT MACROASSEMBLER VERSION 4.0 FOR THE MS-DOS OPERATING SYSTEM. USERS GUIDE & REFER. Pginas consultadas www.monografas.com www.lawebdelprogramador.com www.google.com

Potrebbero piacerti anche