INSTITUTO DE ESTUDIO SUPERIOR METROPOLITANO INGENIERÍA EN TECNOLOGÍA DE LA INFORMACIÓN MATERIA: LENGUAJE ENSAMBLADOR CATEDRÁTICO: ING. JUAN REYNOSO HERNÁNDEZ ALUMNO: JESÚS ADRIÁN MUÑOA MARTÍNEZ TRABAJO: INVESTIGACIÓN LENGUAJE ENSAMBLADOR INTRODUCCION El lenguaje ensamblador, o assembler (assembly language en inglés), es un lenguaje de programaciónde bajo nivel para los computadores, microprocesadores, microcontroladores y otros circuitos integradosprogramables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicosque simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, 1. FUNDAMENTOS DE LENGUAJE ENSAMBLADOR Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la información sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de cálculo, uno por uno. Lenguaje Ensamblador es la primera abstracción del Lenguaje de Máquina, consistente en asociar a los códigos de operación (opcodes) palabras clave que faciliten su uso por parte del programador. Como se puede ver, el Lenguaje Ensamblador es directamente traducible al Lenguaje de Máquina, y viceversa; simplemente, es una abstracción que facilita su uso para los seres humanos. Por otro lado, la computadora no entiende directamente el Lenguaje Ensamblador; es necesario traducirle a Lenguaje de Máquina. Originalmente, este proceso se hacía a mano, usando para ello hojas donde se escribían tablas de programa similares al ejemplo de la calculadora que vimos anteriormente. Pero, al ser tan directa la traducción, pronto aparecieron los programas Ensambladores, que son traductores que convierten el código fuente (en Lenguaje Ensamblador) a código objeto (es decir, a Lenguaje de Máquina). Una característica que hay que resaltar, es que al depender estos lenguajes del hardware, hay un distinto Lenguaje de Máquina (y, por consiguiente, un distinto Lenguaje Ensamblador) para cada CPU. Por ejemplo, podemos mencionar tres lenguajes completamente diferentes, que sin embargo vienen de la aplicación de los conceptos anteriores: 1. Lenguaje Ensamblador de la familia Intel 80x86 2. Lenguaje Ensamblador de la familia Motorola 68000 3. Lenguaje Ensamblador del procesador POWER, usado en las IBM RS/6000. 2. EL MICROPROCESADOR. El microprocesador es un circuito integrado que contiene algunos o todos los elementos necesarios para conformar una (o más) “unidad central de procesamiento” UCP, también conocido como CPU (por sus siglas en inglés: Central Process Unit). En la actualidad este componente electrónico está compuesto por millones de transistores, integrados en una misma placa de silicio. Se debe distinguir entre el concepto de Procesador, que es un concepto de Hardware, con el concepto de CPU, que es un concepto lógico. Una CPU puede estar soportada por uno o varios microprocesadores, y un microprocesador puede soportar una o varias CPU. 1.- El microprocesador es la parte de la computadora diseñada para llevar acabo o ejecutar los programas. 2.- Ejecuta instrucciones que se le dan a la computadora a muy bajo nivel haciendo operaciones lógicas simples, como sumar, restar, multiplicar y dividir. 3.- Viene siendo el cerebro de la computadora, el motor, el corazón de esta máquina.’‘ Esta conformado por los siguientes elementos: Memoria, Unidad Aritmetica Logica (ALU), Puertos de Entrada y Salida (Buses), La Unidad de Control(UC) y un reloj que sincroniza su funcionamiento. 2.1. BUSES Buses de comunicación en un circuito impreso. En Arquitectura de computadores , el bus es un sistema digital que transfiere datos entre los componentes de un computador o entre computadores. Están formado por cables o pistas en un circuito impreso, dispositivos como resistencias y condensadores además de circuitos integrados. La mayoría de los buses están basados en conductores metálicos por los cuales se trasmiten señales eléctricas que son enviadas y recibidas con la ayuda de integrados que poseen una interfaz del bus dado y se encargan de manejar las señales y entregarlas como datos útiles. Todos los buses de computador tiene funciones especiales como las interrupciones y las DMA que permiten que un dispositivo periférico acceda a una CPU o a la memoria usando el minimo de recursos. 2.2. REGISTROS Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo del microprocesador que se emplee. Los registros son direccionables por medio de una viñeta, que es una dirección de memoria. Los bits, por conveniencia, se numeran de derecha a izquierda (15,14,13…. 3,2,1,0), los registros están divididos en seis grupos los cuales tienen un fin especifico. Los registros se dividen en: • Registros de segmento • Registros de apuntadores de instrucciones • Registros apuntadores • Registros de propósitos generales • Registro índice • Registro de bandera. 2.3. MODOS DE DIRECCIONAMIENTO El campo de operación de una instrucción especifica la operación que se va a ejecutar. Esta operación debe realizarse sobre algunos datos almacenados en registros de computadora o en palabras de memoria. La manera en que eligen los operandos durante la ejecución del programa depende del modo de direccionamiento de la instrucción. El modo de direccionamiento especifica una regla para interpretar o modificar el campo de dirección de la instrucción antes de que se haga la referencia real al operando. Las computadoras utilizan técnicas de modo de direccionamiento para acomodar una o las dos siguientes consideraciones: 1.- Proporcionar al usuario versatilidad de programación al ofrecer facilidades como apuntadores a memoria, contadores para control de ciclo, indexación de datos y reubicación de datos. 2.- Reducir la cantidad de bits en el campo de direccionamiento de la instrucción. Para comprender los diferentes modos de direccionamiento que se presentaran en esta sección, es imperativo entender el ciclo de operación básico de la computadora. La unidad de control de una computadora esta diseñada para recorrer un ciclo de instrucciones que se divide en tres fases principales: 1. Búsqueda de la instrucción de la memoria. 2. Decodificar la instrucción. 3. Ejecutar la instrucción. Hay un registro en la computadora llamado contador de programa o PC, que lleva un registro de las instrucciones del programa almacenado en la memoria. Pc contiene la dirección de la siguiente instrucción que se va a ejecutar y se incrementa cada vez que se recupera una instrucción de la memoria. La decodificación realizada en el paso 2 determina la operación que se va a ejecutar, el modo de direccionamiento de la instrucción y la posición de los operandos. Después la computadora ejecuta la instrucción y regresa al paso 1 para hacer la búsqueda de la siguiente instrucción en secuencia. Aunque la mayoría de los modos de direccionamiento modifican el campo de dirección de la instrucción, hay dos modos que no necesitan el campo de dirección. Son los modos implícito e inmediato. MODO IMPLÍCITO. MODO INMEDIATO. MODO DE REGISTRO. MODO INDIRECTO POR REGISTRO. MODO DE DIRECCIONAMIENTO DIRECTO. MODO DE DIRECCIONAMIENTO INDIRECTO. MODO DE DIRECCIONAMIENTO INDEXADO. MODO DE DIRECCIONAMIENTO DE REGISTRO BASE. 3. INTERRUPCIONES. Una interrupción es una operación que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción especial. La rutina de interrupción ejecuta y por lo regular regresa el control al procedimiento que fue interrumpido, el cual entonces reasume su ejecución. 3.1. Hardware. Las interrupciones hardware ocurren cuando un dispositivo necesita atención del procesador y genera una señal eléctrica en la línea IRQ que tiene asignada. Esta señal es recogida y procesada por el controlador de excepciones PIC antes de ser enviada al procesador, lo que puede realizarse de dos formas, según el tipo de interrupción sea enmascarable o no enmascarable. Cuando se habla de una significa que, bajo control del software, el procesador puede aceptar o ignorar (enmascarar) la señal de interrupción. Para ello se envía una señal a la patilla INTR, y el procesador la atiende o la ignora en función del contenido de un bit (IF) en un registro (FLAGS) que puede estar habilitado o deshabilitado. En el primer caso, cuando se recibe la señal, el procesador concluye la instrucción que estuviese en proceso y a continuación responde con una combinación de señales en algunas de sus patillas componiendo una sucesión de dos señales INTA ("Interrupt Acknowledge". La primera señal es simplemente un aviso; la segunda es una petición para que el PIC coloque en el bus de datos un Byte con el número de interrupción, de forma que el procesador pueda localizar el servicio solicitado El valor recibido (0-255) es multiplicado por 4 para calcular la dirección del vector correspondiente en la tabla de vectores de interrupción, lo que se realiza mediante un desplazamiento binario de dos posiciones a la izquierda. Interrupción no enmascarable significa que la interrupción no puede ser deshabilitada por software. Este tipo de interrupciones ocurren cuando se recibe una señal en la patilla NMI ("Nonmaskable Interrupt") del procesador. Se reservan para casos en que es crítica la respuesta, por ejemplo que se detecte un error de paridad en la memoria. Además son de prioridad más alta que las enmascarables. 3.2. Software. Los procesadores Intel de la gama x86 y compatibles, disponen de una instrucción INT que permite generar por software cualquiera de los 256 tipos de interrupción anteriormente descritos. El proceso seguido es exactamente el mismo que si se recibe una interrupción hardware en la patilla INTR, salvo que en este caso se conoce el tipo de interrupción, y no se requiere ningún ciclo INTA. Este tipo de interrupciones son de prioridad más alta que las de hardware (enmascarables y no enmascarables), de forma que si se recibe una interrupción hardware mientras que se ejecuta una software, esta última tiene prioridad. FUNCIONES DE LA BIOS Las funciones de la BIOS se invocan, desde los programas de usuario, ejecutando una interrupción software con un cierto valor inicial en los registros. La BIOS emplea un cierto rango de interrupciones, cada una encargada de una tarea específica: INT 10h: Servicios de Vídeo (texto y gráficos). INT 11h: Informe sobre la configuración del equipo. INT 12h: Informe sobre el tamaño de la memoria convencional. INT 13h: Servicios de disco (muy elementales: pistas, sectores, etc.). INT 14h: Comunicaciones en serie. INT 15h: Funciones casette (PC) y servicios especiales del sistema (AT). INT 16h: Servicios de teclado. INT 17h: Servicios de impresora. INT 18h: Llamar a la ROM del BASIC (sólo máquinas IBM). INT 19h: Reinicialización del sistema. INT 1Ah: Servicios horarios. INT 1Fh: Apunta a la tabla de los caracteres ASCII 128-255 (8x8 puntos). FUNCIONES DEL DOS El DOS emplea varias interrupciones, al igual que la BIOS; sin embargo, cuando se habla de funciones del DOS, todo el mundo sobreentiende que se trata de llamar a la INT 21h, la interrupción más importante con diferencia. INT 20h: Terminar programa (tal vez en desuso). INT 21h: Servicios del DOS. INT 22h: Control de finalización de programas. INT 23h: Tratamiento de Ctrl-C. INT 24h: Tratamiento de errores críticos. INT 25h: Lectura absoluta de disco (sectores lógicos). INT 26h: Escritura absoluta en disco (sectores lógicos). INT 27h: Terminar dejando residente el programa (en desuso). INT 28h: Idle (ejecutada cuando el ordenador está inactivo). INT 29h: Impresión rápida en pantalla (no tanto). INT 2Ah: Red local MS NET. INT 2Bh-2Dh: Uso interno del DOS. INT 2Eh: Procesos Batch. INT 2Fh: Interrupción Multiplex. INT 30h-31h: Compatibilidad CP/M-80. INT 32h: Reservada. EN ENSAMBLADOR. Un programa en lenguaje ensamblador estará formado por una secuencia de sentencias. Cada sentencia ocupa una sola línea y tiene la siguiente estructura: [etiqueta] [operación] [operandos] [;comentarios] Los cuatro campos de una sentencia son opcionales, si no aparece ninguno de ellos (una línea en blanco) tendríamos una sentencia vacía. Las sentencias se dividen en dos tipos: * Instrucciones: Estas sentencias representan órdenes al procesador y tras el proceso de compilación generan código ejecutable. * Directivas: Estas sentencias dirigen el proceso de compilación o construcción del programa ejecutable. No generan código ejecutable. Normalmente se utilizan para aumentar la legibilidad del código fuente. Estructura de un fichero en lenguaje ensamblador Los ficheros de código fuente escritos en lenguaje ensamblador se organizan en líneas. Cada una de las líneas del fichero puede contener una directiva, una instrucción o ambas cosas a la vez en los casos en que sea posible. Todos los ficheros fuente tienen que adecuarse a una estructura fija dividida en secciones. La estructura a seguir se muestra a continuación: escala EQU 1000 ;Definición de constantes simbólicas ORIGEN 7F40h ;Definición del origen de carga del INICIO ini ;Definición de la etiqueta que marca la programa ;primera instrucción a ejecutar del programa .PILA .DATOS 100h ;Definición de los datos del programa dato1 … .CODIGO INI: … FIN ;Definición de la pila VALOR 12h MOV R5, R4 ;Definición del código del programa No existe una convención establecida para la estructura de un programa en lenguaje ensamblador (no como sucede con otros lenguajes, como C/C++). Como regla de oro, es necesarios la declaración de dos segmentos, la de código (CODE) y la de pila (STACK). En total, hay 4 segmentos principales: Segmento de datos, Segmento de código, Segmento de pila y Segmento Extra. Los diferentes segmentos tienen las siguientes funciones: Segmento de datos: Contiene la dirección donde inicia la declaración de variables. Aquí, escribiremos nuestras variables. Segmento de código: Contiene la dirección de inicio donde se encuentran las instrucciones del programa. Aquí, escribiremos todo el código de nuestro programa Segmento de pila: Contiene la dirección donde se encuentra la pila. Segmento Extra: Contiene la dirección donde podemos almacenar datos extras. 5. PROCEDIMIENTO DE ENSAMBLE, ENLACE Y EJECUCIÓN Tal como esta, el programa es solo un archivo de texto que no puede ejecutarse; primero debe ensamblarlo y enlazarlo. 1. El paso de ensamble consiste en la traducción del código fuente en código objeto y la generación de un archivo intermedio .OBJ. El ensamblador también crea un encabezado al frente del módulo .OBJ generado; parte del encabezado tiene información acerca de direcciones incompletas. 2. El paso de enlace implica convertir un módulo .OBJ en un módulo de codigo maquina .EXE 3. El último paso es cargar el programa para su ejecución. Ya que el cargador conoce en dónde está el programa apunto de ser cargado, puede completar las direcciones indicadas en el encabezado que estaban incompletas. 5.1. CÓMO ENSAMBLAR UN PROGRAMA FUENTE. Puede teclear el comando a ejecutar MASM o TASM en una linea de comando o por medio de peticiones. Por Ejemplo: MASM/TASM [opciones] fuente[,objeto] [,listado] [,refcruzadas] opciones: estipula caracteristicas como configuración del nivel de mensajes de advertencia. Ya que los valores por omisión del ensamblador por lo regular son los adecuados, rara vez necesitara utilizar opciones. fuente: identifica el nombre del programa fuente, como Prog1. El ensamblador asume que es extensión ASM de modo que no necesita introducirla. objeto:estipula un archivo .OBJ generado. listado: estipula un archivo .LST generado que contiene tanto el código fuente como el código objeto. refcruzadas: genera un archivo de referencias cruzadas con los simbolos usados en el programa, que puede usar para un listado de referencias cruzadas. 5.2. CÓMO ENLAZAR UN PROGRAMA OBJETO. Una vez que su programa queda sin mensajes de error, el siguiente paso es enlazar el módulo objeto, PROG1.OBJ, que producido por el ensamblador y que sólo código de máquina. El enlazador genera un módulo .EXE y lo inicializa con instrucciones especiales para facilitar su subsecuente carga para ejecución. Una vez que ha enlazado uno o más módulos .OBJ en un módulo .EXE cualquier número de veces. Pero siempre que necesite realizar un cambio al programa, debe corregir el programa fuente, ensamblarlo en otro módulo .OBJ y enlazar el módulo .OBJ en un módulo .EXE. La version del enlazador de Microsoft es LINK, mientras que la de Borland es TLINK. La linea de comando para enlazar es: LINK/TLINK archobj,archeje,[,archmapa][,archbibl] Archobj identifica al archivo objeto generado por el ensamblador. El enlazador supone la extensión, de modo que no tiene que introducirla. Archeje estipula que se genere un archivo .EXE Archmapa estipula que se genere un archivo con extensión con .MAP que indica la ubicacion relativa y el tamaño de cada segmento y cualquier error que LINK haya encontrado. Archobj estipula la opción de bibliotecas, que no necesita en estos primeros pasos de programación en lenguaje ensamblador. 5.3. Diagnóstico de Errores. El ensamblador proporciona un diagnóstico de cualquier error de programación que viole sus reglas. El programa fue corrido en TASM, genera un listado de errores. El comando para crear el archivo de listado (*.lst) es: TASM /L PROG1 5.4. Cómo Ejecutar Un Programa. Si el archivo .EXE esta en la unidad por omisión, podria usar el DOS para cargarlo para su ejecución introduciendo: PROG1.EXE o PROG1 1.6. Entorno de programación. Antes de que el COMMAND.COM pase el control al programa que se pretende ejecutar, se crea un bloque de 256 bytes llamado PSP (Program Segment Prefix), cuya descripción detallada se verá en el próximo capítulo. En él aparecen datos tales como la dirección de retorno al dos cuando finalice el programa, la dirección de retorno en caso de Ctrl-Break y en caso de errores críticos. Además de la cantidad de memoria disponible y los posibles parámetros suministrados del programa. Cuando el programa toma el control, DS y ES apuntan al PSP. Tipos de programas: En los de tipo COM: - CS apunta al PSP e IP=100h (el programa empieza tras el PSP). - SS apunta al PSP y SP toma la dirección más alta dentro del segmento del PSP. En los de tipo EXE: - CS e IP toman los valores del punto de arranque del programa (directiva END etiqueta). - SS apunta al segmento de pila y SP = tamaño de la pila definida. Los programas de tipo COM se cargan en memoria tal y como están en disco, entregándoseles el control. Los de tipo EXE, que pueden llegar a manejar múltiples segmentos de código de hasta 64 Kb, se almacenan en disco «semiensamblados». En realidad, al ser cargados en memoria, el DOS tiene que realizar la última fase de montaje, calculando las direcciones de memoria absolutas. Por ello, estos programas tienen un formato especial en disco, generado por los ensambladores y compiladores, y su imagen en memoria no se corresponde realmente con lo que está grabado en el disco, aunque esto al usuario no le importe. Por ello, no se extrañe el lector de haber visto alguna vez ficheros EXE de más de 640 Kb: evidentemente, no se cargan enteros en memoria aunque lo parezca. EJEMPLO DE PROGRAMA TIPO COM. El siguiente ejemplo escribe una cadena en pantalla llamando a uno de los servicios estándar de impresión del DOS (función 9 de INT 21h): cr EQU 13 ; constante de retorno de carro lf EQU 10 ; constante de salto de línea programa SEGMENT ; segmento común a CS, DS, ES, SS. ASSUME CS:programa, DS:programa ORG 100h ; programa de tipo COM inicio: LEA DX,texto ; dirección de texto a imprimir MOV AH,9 ; función de impresión INT 21h ; llamar al DOS INT 20h ; volver al sistema operativo texto DB cr,lf,"Grupo Universitario de Informática.",cr,lf,"$" programa ENDS ; fin del segmento END inicio ; fin del programa y punto de inicio EJEMPLO PROGRAMA TIPO EXE Los programas EXE (listado al final de esta sección) requieren algo más de elaboración. En primer lugar, es necesario definir una pila y reservar espacio para la misma. Al contrario que los programas COM (cuya pila se sitúa al final del segmento compartido también con el código y los datos) esta característica obliga a definir un tamaño prudente en función de las necesidades del programa. ; Segmento de datos datos SEGMENT texto DB cr,lf,"Texto a imprimir",cr,lf,"$" datos ENDS ; Segmento de pila pila SEGMENT STACK 'STACK' ; poner STACK es obligatorio DB 128 dup ('pila') ; reservados 512 bytes pila ENDS ; Segmento de código codigo SEGMENT ejemplo PROC FAR ASSUME CS:codigo, DS:datos, SS:pila ; poner dirección de retorno al DOS en la pila: PUSH DS ; segmento del PSP XOR AX,AX ; AX = 0 PUSH AX ; desplazamiento 0 al PSP ; direccionar segmento de datos con DS MOV AX,datos ; AX = dirección del segmento de datos MOV DS,AX ; inicializar DS ; escribir texto LEA DX,texto ; DS:DX = dirección del texto MOV AH,9 INT 21h ; volver al DOS RET ; en realidad, RETF (PROC FAR) ejemplo ENDP codigo ENDS ; fin del código END ejemplo ; punto de arranque del programa EVOLUCIÓN DE WINDOWS 1975-1981: El surgimiento de MS-DOS. 1982-1985: Presentamos Windows 1.0. 1987–1990: Windows 2.0–2.11: más ventanas, mayor velocidad. 1990–1994: Windows 3.0–Windows NT: se obtienen los gráficos. 1995–1998: Windows 95: el equipo se hace mayor (y no olvides Internet). 1998–2000: Windows 98, Windows 2000, Windows Me— Windows evoluciona para trabajar y jugar. 2001–2005: Windows XP: estable, utilizable y rápido. 2006–2008: Windows Vista: seguridad inteligente. 2009: Windows 7 presenta Windows Touch. 2012: Windows 8 presenta aplicaciones y mosaicos. 2013: Windows 8.1 amplía la visión de Windows 8. 2015: Windows 10. CONCLUSIÓN NOS DAMOS CUENTA QUE EL LENGUAJE ENSAMBLADOR SIRVE PARA COMUNICARNOS CON LA MAQUINA ESTO NOS AYUDA EN PROGRAMACIÓN EN DONDE LA MAYORÍA DE LAS COSAS LO ASEMOS CON COMANDO QUE LA MAQUINA ENTIENDE TODO LO QUE CONOCEMOS A NIVEL TECNOLOGÍA ESTA VASADO A LENGUAJE MAQUINA BIBLIOGRAFÍA http://gente-itsm.blogspot.mx/2011/09/unidad-1-fundamentos.html http://atc2.aut.uah.es/~avicente/asignaturas/leoc/pdf/t1_fundam entosdelensamblador.pdf https://chematec.wordpress.com/2010/09/09/unidad-ifundamentos-del-lenguaje-ensamblador/ http://www.ittux.edu.mx/sites/default/files/MICROCOMPUTADORAS _AL_DETALLE.pdf https://es.wikipedia.org/wiki/Interrupci%C3%B3n http://bbeltran.cs.buap.mx/Interrupciones.pdf